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:
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:
für die linke obere Ecke mit Mindestgröße drei,
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.
habe mir daraus das Ersatzbild gebaut: Dies zeigt nur die obere Rechtekoordinate des Tamplets an.
Wie kann ich schnell und sauber die längste "Reihe von Zahlen" ermitteln?
Hier nochmal ein anderes Beispiel:
Hier wäre die längste Reihe und somit die größte Fläche die Senkrechte mit vier untereinander liegenden Einsen.