13

私はこの灰色のビデオストリームを持っています: ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

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

私は得る:

ここに画像の説明を入力してください

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

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

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

私は得る:

ここに画像の説明を入力してください

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

事前にt​​hx

4

2 に答える 2

10

アダプティブスレッショルドは次のように機能します

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

    THRESH_BINARY

THRESH_BINARY

    THRESH_BINARY_INV

THRESH_BINARY_INV

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

しきい値の動作は異なります:

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

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

于 2011-11-29T18:15:42.863 に答える
10

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

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でした)、それはエッジ検出のように機能します。大きくすると、期待通りに動作しました。もちろん、「正しい」サイズは、画像の解像度と、見ている機能のサイズによって異なります。

于 2012-01-17T17:03:00.433 に答える