Voilà comment je le ferais:
- Créer un noyau, il définit un quartier de pixels.
- Créez une nouvelle image en dilatant votre image en utilisant ce noyau. Cette image dilatée contient la valeur de voisinage maximale pour chaque point.
- Effectue une comparaison d'égalité entre ces deux tableaux. Chaque fois qu'ils sont égaux, il s'agit d'un maximum de voisinage valide et il est défini sur
255
dans le tableau de comparaison.
- Multipliez le tableau de comparaison et le tableau d'origine ensemble (mise à l'échelle appropriée).
- Ceci est votre dernier tableau, contenant uniquement les maxima de voisinage.
Ceci est illustré par ces zoomé images:
9 pixel par 9 image originale pixel:
Après traitement avec 5 par 5 noyau de pixels, seul le voisinage local maxima restent (ie.maxima séparés par plus de 2 pixels à partir d'un pixel d'une valeur plus élevée):
Il y a une mise en garde. Si deux maxima voisins ont la même valeur, ils seront tous deux présents dans l'image finale.
Voici un code Python qui le fait, il devrait être très facile à convertir en 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)
Je ne savais pas jusqu'à présent, mais est ce que @sansuiso a suggéré dans son/sa réponse .
C'est peut-être mieux illustré avec cette image, avant:
après le traitement avec un 5 par 5 noyau:
régions solides sont dues à la commune locale valeurs maximales.
Vous n'êtes pas seulement à la recherche des maxima locaux? Comme ici: http://stackoverflow.com/questions/5550290/find-local-maxima-in-grayscale-image-using-opencv –
Je n'ai pas besoin de maximums locaux dans chaque noyau, mais j'ai besoin d'un tel filtre, –
Je ne suis pas certain de comprendre ce que vous voulez dire, mais dans tous les cas, je le restreindrai à un noyau (ou à un retour sur investissement, et je déplacerai ce ROI dans l'image) en utilisant MinMaxLoc devrait fonctionner non? Comme dans leur commentaire. –