Votre algorithme permet à l'image entière, sauf un pixel, d'être "le contour". Je ne suis pas sûr que ce soit exactement ce que vous voulez; Habituellement, un contour est une bordure entre deux régions différentes. Le problème avec votre méthode est que vous pouvez obtenir d'énormes blobs de pixels qui n'ont pas d'ordre de parcours particulièrement évident. Si vous avez un contour d'un seul pixel d'épaisseur, alors l'ordre de traversée est beaucoup plus évident: dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre.
Considérons l'image suivante.
........
..%%%%..
.%%%%...
...%%%%.
....%...
........
Ici, j'ai tout marqué "sombre" (< 50, peut-être) comme %
et tout brillant que .
. Maintenant, vous pouvez choisir n'importe quel pixel qui est sur la frontière entre les deux régions (je vais choisir le côté sombre, vous pouvez dessiner le contour sur le côté de la lumière aussi, ou avec un peu plus de travail, directement entre les côtés sombres et clairs.
........
..%%%%..
.*%%%...
...%%%%.
....%...
........
Maintenant, vous essayez de parcourir le bord extérieur de la zone sombre, un pixel à la fois. D'abord, vous regardez dans la direction de quelque chose de brillant (directement à gauche, par exemple). Ensuite, vous tournez autour - dans le sens inverse des aiguilles d'une montre, disons - jusqu'à ce que vous frappiez un pixel sombre.
........
..%%%%..
1*5%%...
234%%%%.
....%...
........
Une fois que vous frappez la position 5
, vous voyez que c'est sombre. Alors, vous marquez comme partie du contour, puis essayez trouver le morceau suivant sur le contour en balayant autour à partir du pixel que vous venez de
........
..%%%%..
.0*%%...
.123%%%.
....%...
........
Ici 0
est l'endroit où vous êtes venu - et vous ne pas y retourner - et puis vous essayez les pixels 1
et 2
(les deux la lumière, ce qui n'est pas correct), jusqu'à ce que vous frappez pixel 3
, qui est sombre. De cette façon, vous pouvez contourner le contour pixel par pixel - en identifiant le contour et en obtenant l'ordre des pixels - jusqu'à ce que vous entriez en collision avec le même pixel que vous avez commencé avec et partira de sorte que vous frappez le même pixel que vous avez fait la première fois que vous l'avez quitté. Ensuite, le contour est fermé. Dans notre exemple, où nous faisons un contour 8-connecté (c'est-à-dire que nous regardons 8 voisins, pas 4), nous obtiendrions ce qui suit (où @
indique un point de contour).
........
[email protected]@@@..
[email protected]@%@...
[email protected]%@@.
[email protected]
........
(Vous devez avoir ce critère à deux en une ligne ou si vous avez une région sombre un seul pixel de large, vous allez marcher mais alors pas capable de marcher vers le bas le long de ce À ce stade, vous avez couvert une limite entière de. Mais il pourrait y en avoir d'autres. Continuez à rechercher des pixels sombres à côté des pixels clairs jusqu'à ce que vous ayez dessiné un contour au-dessus de chacun d'eux. Vous avez maintenant converti votre image à deux niveaux (& pixels lumineux) en un ensemble de contours.
Si les contours sont trop bruyants, commencez par brouiller l'image. Cela va lisser les contours. (Vous pouvez trouver les contours d'abord et en moyenne alors les coordonnées avec une fenêtre mobile.)
Merci, je sais que mon algorithme n'est pas très bon, comme je l'ai dit, un algorithme simple. –