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:
Wo alles außer der Farbe Weiß ein Rand ist.
Und habe die Konturpunkte des ersten Blobs gefunden:
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:
Könnten Sie einfach das gefundene Polygon löschen, indem Sie es in der Hintergrundfarbe zeichnen und wiederholen, bis nichts mehr übrig ist?
quelle
Überprüfen Sie dies:
http://en.wikipedia.org/wiki/Connected-component_labeling Nachdem Sie Blobs erkannt haben, wenden Sie einfach die Marschquadrate alg an, um die Ränder jedes Blobs zu erhalten.
Tschüss Lo
quelle
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.
quelle