2017-08-09 4 views
0

J'ai une image binaire qui aura un ou plusieurs blobs. Je veux une liste de pixels pour chaque blob. Si je peux trouver un point de graine pour chaque goutte, je peux remplir pour trouver les pixels de la goutte.Boîte englobante GPU blob englobant les composants connectés

En faisant des recherches pour ce problème, je pense que l'algorithme que je veux est "étiquetage des composants connectés". La plupart des exemples que je vois juste la couleur codent la sortie de blobs. Avec cet algorithme, serai-je capable de rassembler: un point sur le blob, et le cadre d'alignement aligné par l'axe du blob?

Est-ce que l'étiquetage des composants connectés est le bon algorithme pour ce dont j'ai besoin? Quelqu'un at-il une bonne mise en œuvre de CUDA?

+0

Oui, les composants connectés sont ce que vous voulez. Si vous avez une image avec chaque BLOB étiquetée d'une couleur différente, la boîte englobante peut trivialement calculer en prenant les coordonnées de pixel maximum et minimum pour chaque couleur dans l'image. – jodag

+0

Une implémentation CUDA est ardu car le traitement dépend fortement des données et est irrégulier. La division de l'image en sous-images est également difficile car vous devez patcher les pièces après le traitement des mosaïques. –

Répondre

1

Votre suggestion est un bon point de départ.

Numérisez l'image ligne par ligne et lorsque vous rencontrez un début de pixel noir, remplissez-la. Pendant que vous remplissez, vous pouvez conserver le cadre de sélection mis à jour. Après le remplissage, vous continuez simplement l'analyse.

Fill(img, x, y, xm, xM, ym, yM): 
    img[x][y]= white 
    xm= min(xm, x); xM= max(xM, x); ym= min(ym, y); yM= max(yM, y); 
    if x >= 0 and img[x-1][y] == black: 
     Fill(img, x-1, y) 
    if x < w and img[x+1][y] == black: 
     Fill(img, x+1, y) 
    if y >= 0 and img[x][y-1] == black: 
     Fill(img, x, y-1) 
    if y < h and img[x][y+1] == black: 
     Fill(img, x, y+1) 

FloodFill(img): 
    for y in range(h): 
     for x in range(w): 
      if Img[x][y] == black: 
       xm= xM= x; ym= yM= y 
       Fill(img, x, y, xm, xM, ym, yM) 
       Store(x, y, xm, xM, ym, yM) 

Comme remplissage d'inondation est pile à forte intensité, une approche scanline-based est recommandée.