私はこの灰色のビデオストリームを持っています:
この画像のヒストグラム:
しきい値処理された画像:
threshold( image, image, 150, 255, CV_THRESH_BINARY );
私は得る:
私はそれを期待しています。
適応しきい値処理を行う場合:
adaptiveThreshold(image, image,255,ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,15,-5);
私は得る:
これはエッジ検出のように見え、しきい値処理ではありません。私が期待したのは白黒の領域でした。だから私の質問は、なぜこれがしきい値ではなくエッジ検出のように見えるのかということです。
事前にthx
適応しきい値は次のように機能します this :
この関数は、次の式に従ってグレースケール画像をバイナリ画像に変換します。
THRESH_BINARY
THRESH_BINARY_INV
ここで、T(x、y)は、ピクセルごとに個別に計算されたしきい値です。
しきい値は機能します 異なる方法で :
この関数は、固定レベルのしきい値を単一チャネル配列に適用します。
つまり、adaptiveThresholdはピクセルごとにしきい値を計算するのに対し、thresholdは画像全体に対してしきい値を計算するように聞こえます。つまり、1つのルーラーによって画像全体を測定し、もう1つは各ピクセルに対して新しい「ルーラー」を作成します。
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でした)、それはエッジ検出のように機能します。大きくすると、期待通りに動作しました。もちろん、「正しい」サイズは、画像の解像度と、見ている機能のサイズによって異なります。