Marschierende Quadrate: Finden Sie mehrere Konturen in einem Quellfeld?


9

Grundsätzlich ist dies eine Folgefrage zu einem Problem von vor einigen Wochen , obwohl es sich um den Algorithmus im Allgemeinen handelt, ohne auf mein eigentliches Problem anzuwenden.

Der Algorithmus durchsucht grundsätzlich alle Zeilen im Bild, beginnend oben links, bis er ein Pixel findet, das ein Rand ist. In Pseudo-C ++:

int start = 0;
for(int i=0; i<amount_of_pixels; ++i)
{
   if(pixels[i] == border)
   {
      start = i;
      break;
   }
} 

Wenn es eines findet, startet es den Marschquadrat-Algorithmus und findet die Kontur zu dem Objekt, zu dem das Pixel gehört.

Nehmen wir an, ich habe so etwas:

Geben Sie hier die Bildbeschreibung ein

Wo alles außer der Farbe Weiß ein Rand ist.

Und habe die Konturpunkte des ersten Blobs gefunden:

Geben Sie hier die Bildbeschreibung ein

Für den allgemeinen Algorithmus ist es vorbei. Es hat eine Kontur gefunden und seine Arbeit erledigt. Wie kann ich zu den beiden anderen Blobs übergehen, um auch deren Konturen zu finden?


Antworten:


7

Könnten Sie einfach das gefundene Polygon löschen, indem Sie es in der Hintergrundfarbe zeichnen und wiederholen, bis nichts mehr übrig ist?


1
So sollte es gemacht werden. Füllen Sie das gefundene Element mit dem Hintergrund (oder einer anderen Farbe) und setzen Sie die Suche fort (Sie können an dem Punkt fortfahren, an dem Sie die erste "Übereinstimmung" gefunden haben)
bummzack

Oh wow. Ich wusste nicht einmal, wie man Überschwemmungen füllt. Vielen Dank.
TravisG


1

Warum nicht die Blob-Informationen in einem anderen Array speichern und prüfen, ob die neu gefundenen Pixel in den Begrenzungsrahmen des früheren Blobs fallen? Es sind weitere Manipulationen erforderlich, um Blobs unterhalb der Mitte des früheren Blobs zu behandeln, die in den Begrenzungsrahmen fallen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.