web-dev-qa-db-ja.com

opencvの適応しきい値と通常のしきい値の違い

私はこの灰色のビデオストリームを持っています: enter image description here

この画像のヒストグラム:

enter image description here

しきい値処理された画像:

  threshold( image, image, 150, 255, CV_THRESH_BINARY );

私は得る:

enter image description here

私はそれを期待しています。

適応しきい値処理を行う場合:

adaptiveThreshold(image, image,255,ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,15,-5);

私は得る:

enter image description here

これはエッジ検出のように見え、しきい値処理ではありません。私が期待したのは白黒の領域でした。だから私の質問は、なぜこれがしきい値ではなくエッジ検出のように見えるのかということです。

事前にt​​hx

13
Olivier_s_j

適応しきい値は次のように機能します this

この関数は、次の式に従ってグレースケール画像をバイナリ画像に変換します。

    THRESH_BINARY

THRESH_BINARY

    THRESH_BINARY_INV

THRESH_BINARY_INV

ここで、T(x、y)は、ピクセルごとに個別に計算されたしきい値です。

しきい値は機能します 異なる方法で

この関数は、固定レベルのしきい値を単一チャネル配列に適用します。

つまり、adaptiveThresholdはピクセルごとにしきい値を計算するのに対し、thresholdは画像全体に対してしきい値を計算するように聞こえます。つまり、1つのルーラーによって画像全体を測定し、もう1つは各ピクセルに対して新しい「ルーラー」を作成します。

10
djhaskin987

OCRの目的で適応しきい値処理を行うのと同じ問題がありました。 (申し訳ありませんが、これはPython C++ではありません)

img = cv.LoadImage(sys.argv[1])
bwsrc = cv.CreateImage( cv.GetSize(img), cv.IPL_DEPTH_8U, 1)
bwdst = cv.CreateImage( cv.GetSize(img), cv.IPL_DEPTH_8U, 1)

cv.CvtColor(img, bwsrc, cv.CV_BGR2GRAY)
cv.AdaptiveThreshold(bwsrc, bwdst, 255.0, cv.CV_THRESH_BINARY, cv.CV_ADAPTIVE_THRESH_MEAN_C,11)
cv.ShowImage("threshhold", bwdst)
cv.WaitKey()

最後のパラメータは、各ピクセルのしきい値を計算するために使用される近傍のサイズです。あなたの近所が小さすぎる場合(私のものは3でした)、それはエッジ検出のように機能します。大きくすると、期待通りに動作しました。もちろん、「正しい」サイズは、画像の解像度と、見ている機能のサイズによって異なります。

9
nont