これは私がそれを行う方法です:
- カーネルを作成し、ピクセル近傍を定義します。
- このカーネルを使用して画像を膨張させて、新しい画像を作成します。この膨張した画像には、すべてのポイントの最大近傍値が含まれています。
- これら 2 つの配列間で等値比較を行います。それらが等しい場所は、有効な近傍最大値であり
255
、比較配列に設定されます。
- 比較配列と元の配列を乗算します (適切にスケーリングします)。
- これは、近傍の最大値のみを含む最終的な配列です。
これは、これらの拡大画像で示されています。
9 ピクセル x 9 ピクセルの元の画像:
5 x 5 ピクセル カーネルで処理した後、ローカル近傍の最大値のみが残ります (つまり、最大値は、より大きな値を持つピクセルから 2 ピクセル以上離れています)。
注意点が 1 つあります。近くにある 2 つの最大値が同じ値の場合、それらは両方とも最終的な画像に表示されます。
これを実行する Python コードを次に示します。c++ への変換は非常に簡単です。
import cv
im = cv.LoadImage('fish2.png',cv.CV_LOAD_IMAGE_GRAYSCALE)
maxed = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1)
comp = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1)
#Create a 5*5 kernel anchored at 2,2
kernel = cv.CreateStructuringElementEx(5, 5, 2, 2, cv.CV_SHAPE_RECT)
cv.Dilate(im, maxed, element=kernel, iterations=1)
cv.Cmp(im, maxed, comp, cv.CV_CMP_EQ)
cv.Mul(im, comp, im, 1/255.0)
cv.ShowImage("local max only", im)
cv.WaitKey(0)
今まで気づきませんでしたが、これは @sansuiso が彼/彼女の回答で提案したものです。
これは、前の次の画像でよりよく説明される可能性があります。
5 x 5 カーネルで処理した後:
固体領域は、共有された極大値によるものです。