2010-08-16 9 views
4

J'ai une image en échelle de gris de 64x64. Je trouve les points du contour par un algorithme simple:Relier les points - connecter la ligne entre les points de contour

  • trouver plus lumineux (par exemple: 100)
  • division par 2 (100/2 = 50)
  • définissent une bande autour du résultat (50 -5 = 45 à 50 + 5 = 55)
  • marque tous les points qui ont une valeur dans la bande (entre 45 et 55)

la question est maintenant, comment puis-je décider de l'ordre de connexion du points?

(Toutes les références seront acceptées, des liens, des pensées, etc ')

Répondre

4

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.)

+0

Merci, je sais que mon algorithme n'est pas très bon, comme je l'ai dit, un algorithme simple. –

0

Je ne sais pas si la collecte de ces points vous aller loin. (Je peux arriver à des situations dans lesquelles il est presque impossible de dire dans quel ordre ils devraient entrer.)

Que diriez-vous d'aller au point le plus lumineux. Aller au point de la luminosité de, disons, 360 points entourant ce point à une distance de, disons, 5 pixels.
Continuer à partir de là, mais assurez-vous que vous ne retourniez pas d'où tu viens :)

0

Peut-être essayer:

  1. Démarrer à un
  2. Trouver le point le plus proche b
  3. Connectez un avec b
  4. et ainsi de suite.

Probablement pas bon, car la complexité est quelque chose comme O (n²). Vous pouvez simplifier ceci en recherchant seulement des points près du début, comme le suggèrent aioobe. Cet algorithme est bon, si les points sont éloignés de 2-3px les uns des autres, mais peut créer des grilles très étranges.

1

En général, un ensemble donné de points peut être connecté de plusieurs façons pour créer des formes différentes. Par exemple, considérons un ensemble de 5 points comprenant les coins d'un carré et son centre. Ces points peuvent être connectés pour former un carré avec un côté "bosselé" au centre. Mais de quel côté? Il n'y a pas de réponse unique.

D'autres formes peuvent être beaucoup plus compliquées, sans moyen évident de relier les points.

Si vous êtes autorisé à réduire votre ensemble de points à convex hull, ce serait beaucoup plus facile.

1

J'ai également essayé de créer un algorithme qui reliera les points de contour dans la courbe lisse. Voir mon projet open-source http://outliner.codeplex.com. L'idée est la même que celle proposée par FUZxxl mais je ne comprends pas ses soucis de complexité: le temps de traitement est proportionnel à la longueur totale de tous les contours de contour.

+0

Je vais jeter un oeil, bonne chance avec le projet :) –

Questions connexes