Trouver les maxima locaux dans l'image en niveaux de gris à l'aide d'OpenCV
Quelqu'un sait comment trouver les maxima locaux dans une échelle de gris IPL_DEPTH_8U
image à l'aide d'OpenCV? HarrisCorner mentionne quelque chose comme ça, mais je ne suis vraiment pas intéressé dans les coins ...
Merci!
- N'a pas la morphologie de la Dilatation de l'opération dans OpenCV trouver les maxima locaux dans un 3x3 ou définie par l'utilisateur et noyau et de définir les pixels de cette valeur max? Donc, cela pourrait être modifié à votre but.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous voulez utiliser la
fonction sur votre image
Un pixel est considéré comme un maximum local si elle est égale à la valeur maximale dans un local quartier. La fonction ci-dessous rend compte de cette propriété en deux lignes de code.
De traiter avec des pixels sur les 'plateaux' (valeur égale à leur quartier), on peut utiliser le minimum local de la propriété, depuis les plateaux de pixels sont égales à leur minimum local. Le reste du code des filtres de ces pixels.
En fait après que j'ai posté le code ci-dessus, j'ai écrit un mieux très très vite un ..
Le code ci-dessus souffre, même pour une image de 640 x 480..
J'ai optimisé, et maintenant il est très très rapide, même pour 1600x1200 pic.
Voici le code :
La liste suivante est une fonction similaire à Matlab "imregionalmax". Il recherche au plus nLocMax maxima locaux au-dessus de seuil, où trouver les maxima locaux sont au moins minDistBtwLocMax les pixels en dehors. Elle renvoie le nombre de maxima locaux trouvés. Notez qu'il utilise OpenCV de minMaxLoc pour trouver globale maxima. Il est "opencv-autonomes" à l'exception de l' (facile à mettre en œuvre) de la fonction vdist, qui calcule le (euclidienne) de la distance entre les points (r,c) et (ligne,col).
entrée est un canal CV_32F de la matrice, et lieux est nLocMax (lignes) par 2 (colonnes) CV_32S de la matrice.
HTML:
La première question, la réponse devrait être ce qui est "local" à votre avis. La réponse pourrait bien être une fenêtre carrée (dire 3x3 ou 5x5) ou circulaire fenêtre d'un certain rayon. Vous pouvez ensuite balayage sur l'ensemble de l'image avec la fenêtre centrée à chaque pixel et de choisir la valeur la plus élevée dans la fenêtre.
Voir cette pour savoir comment accéder aux valeurs des pixels dans OpenCV.
Voici un truc tout simple. L'idée est de dilater avec un noyau qui contient un trou dans le centre. Après la dilatation de l'opération, chaque pixel est remplacé par le maximum de ses voisins (à l'aide d'un 5 par 5 quartier dans cet exemple), à l'exclusion de le pixel d'origine.
Trouvé une solution simple.
Dans cet exemple, si vous essayez de trouver 2 résultats d'un matchTemplate fonction avec un minimum de distance les uns des autres.
où
Le processus est le suivant:
Le les scores peuvent être comparés les uns aux autres afin de déterminer, par exemple, la certitude du match,
Vous pouvez aller sur chaque pixel et de tester si c'est un maximum local. Voici comment j'allais le faire.
L'entrée est supposée être de type CV_32FC1
Pour tester le code, vous pouvez essayer ceci:
Cette solution ne permet pas de prendre des plateaux en compte de sorte qu'il n'est pas exactement la même que matlab imregionalmax()
À trouver plus que juste le minimum global et maximum essayez d'utiliser cette fonction à partir de
skimage
:http://scikit-image.org/docs/dev/api/skimage.feature.html#skimage.feature.peak_local_max
Vous pouvez paramétrer la distance minimale entre les pics, trop. Et de plus en plus. Pour trouver des minima, l'utilisation niée valeurs (prendre soin de la matrice de type si,
255-image
pourrait faire l'affaire).