Seite 1 von 1

OpenCV Blob detecting

Verfasst: Donnerstag 3. April 2014, 13:55
von kl.feigling89
Hallo Liebe Community, ich möchte gerne Wissen wie ich schnell und einfach die Koordinaten von Blobs in einem Binärbild mit hilfe von OpenCV oder ähnliche Labary berechnen kann.
Ich habe zb folgendes binärbild:

Code: Alles auswählen

0000000
0011100
0011100
0011100
0000000
Nun möchte ich die vier Eckpunkte des Rechtecks haben.
Bei meinen Bildern gibt es jedoch noch mehr Rechtecke und ich möchte von jedem die Koordinaten, die eine Mindestgröße überschreiten.
Des Weitern sollen nur gefüllte Objekte gefunden werden, dass heißt in den Rechecken darf kein Pixel 0 sein.
Ich hoffe ihr könnt mir wie sonst schnell und einfach Helfen.
Gruß

Re: OpenCV Blob detecting

Verfasst: Donnerstag 3. April 2014, 16:42
von EyDu
Du könntest mittels matchTemplate zunächst nach den Ecken suchen. Für jede Ecke müsstest du dann ein Template erstellen, die Mindestlänge einer Seite könntest du auch gleich mit einbauen:

Code: Alles auswählen

00000
00111
00111
00111
für die linke obere Ecke mit Mindestgröße drei,

Code: Alles auswählen

00000
11100
11100
11100
für die rechte obere Ecke, etc. Dann musst du nur noch die Kombinationen aus vier Ecken durchgehen und den Inhalt mittels Integralbild testen.

Unter Umständen kannst du die Erkennung der Ecken auch gleich weglassen, über alle möglichen Rechtecke im Bild iterieren (von Minimalgröße bis Maximalgröße) und diese mittels Integralbild testen: Die Summe der m*n-Fläche aus Einsen muss m*n Betragen, die Fläche plus zwei Pixel Rand ebenfalls m*n.

Re: OpenCV Blob detecting

Verfasst: Donnerstag 3. April 2014, 18:37
von pillmuncher
Eine andere Möglichkeit wäre floodfill. Wenn die gesuchten Rechtecke - was ich vermute - paraxial sind, ist es sogar nochmal einfacher. Paraxial bedeutet, dass die Seiten eines Rechtecks parallel zu den Achsen des Koordinatensystems liegen.

Das Vorgehen wäre dann ungefähr so:

Finde mittels floodfill jeden zusammenhängenden Bereich von 1en. Falls ein Bereich eine "Insel" aus 0en enthält, ignoriere den Bereich. Andernfalls bilde um den Bereich eine Minimum Bounding Box. Ist die Boundingbox kleiner als die gewünschte Rechtecks-Mindestgröße, ignoriere den Bereich ebenfalls. Andernfalls, wenn der Bereich und die Boundingbox identisch sind, dann ist der Bereich ein passendes Rechteck. Ob ein Bereich von 1en ohne 0er-Inseln mit einerm gegebenen Rechteck (der Boundingbox) identisch ist kann man testen, indem man innen entlang der Kanten der Boundingbox testet, ob jedes Feld dort eine 1 beinhaltet. Alle noch weiter innen liegenden Felder müssen, da wir 0er-Inseln ja bereits ausgeschlossen haben, ebenfalls 1en sein.

Übrigens: wenn man sich merkt, welche Felder man bereits verarbeitet hat, liegt die Laufzeitkomplexität bei O(n), ebenso wie die Speicherplatzkomplexität.

Re: OpenCV Blob detecting

Verfasst: Freitag 4. April 2014, 09:02
von kl.feigling89
Danke für eure Hilfe, ich habe es jetzt nach "EyDu"s Vorschlag programmiert und funktioniert prima. Aber dein Verfahren "pillmuncher" ist auch sehr interessant.

Re: OpenCV Blob detecting

Verfasst: Freitag 4. April 2014, 09:33
von kl.feigling89
Habe da doch noch eine kleine Frage. Jetzt habe ich die Regionen die mindestens so groß sind wie mein Tamplet, außerdem habe ich auch die Koordinaten. Was auch mein oberstes Ziel war.
Aber wie kann ich denn jetzt am einfachsten, die größte Region herausfinden.
Hier habe ich das Binärbild, wo ich mit dem Tamplet beide rechtecke gefunden habe.

Code: Alles auswählen

000000
011100
011100
011100
011100
000000
habe mir daraus das Ersatzbild gebaut: Dies zeigt nur die obere Rechtekoordinate des Tamplets an.

Code: Alles auswählen

000
010
010
000
Wie kann ich schnell und sauber die längste "Reihe von Zahlen" ermitteln?


Hier nochmal ein anderes Beispiel:

Code: Alles auswählen

00000000
00011100
00010000
00010000
00010000
00000000
Hier wäre die längste Reihe und somit die größte Fläche die Senkrechte mit vier untereinander liegenden Einsen.