Konturverfolgung nach Kantendetektion
-
Hallo,
ich bin zur Zeit auf der Suche nach einem relativ einfachen Algorithmus, der folgendes tut:
Es liegt ein Binärbild nach Kantendetektion und Non-Maximum Unterdrückung vor, d.h. es gibt nur die Pixel schwarz und weiß, wobei weiß "Kante" bedeutet.
Gesucht ist jetzt ein Algorithmus, der die einzelnen Kanten-Pixel zu Segmenten mit Anfangs- und Endpunkt zusammenfasst. Als Ausgabe erwarte ich also eine Liste von Segmenten, die die Kanten des Bildes beschreiben.
Momentan gehe ich wie folgt vor:
Ich suche einen Kanten-Pixel und schaue mir im Gegenuhrzeigensinn seine Nachbarn an. Gibt es einen Nachbarn, so wird ein neues Segment erzeugt und anschließend dieser Nachbarpixel betrachtet. Hat dieser ebenfalls einen Nachbarn, der "auf der Geraden" vom Startpunkt aus liegt, so wird das Segment verlängert. Liegt der Nachbar nicht auf der Geraden, so wird ein neues Segment erzeugt.
Der Ansatz funktioniert auch, liefert allerdings zu viele Segmente. Vor allem Kanten, die nicht 0°, 45° oder 90° Steigung besitzen, also dazwischen liegen, liefern viel zu viele Segmente.
Folgende Kante sollte optimalerweise durch ein Segment dargestellt werden:
oxxo oxxxxxxo oxxo
Momentan wären es jedoch 5 (angedeutet durch die o).
Da ich mit Bildverarbeitung und Mustererkennung noch nicht so viel in Verbindung gekommen bin, wäre ich für Ansätze bzw. Namen von Algorithmen sehr dankbar.
-
-
-
Wenn ich das richtig verstanden hab, ist das Problem, die connected components zu finden schon gelöst, und nun gehts darum, deren Umrisse durch Polygone aus nicht allzuvielen Punkten zu beschreiben. Vielleicht ist das hier ja was für dich: http://ntur.lib.ntu.edu.tw/bitstream/246246/142416/1/04.pdf
Fertig implementiert findest du das in OpenCV: http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours
-
Hallo,
danke für die Antworten. Ich habe mich vielleicht etwas undeutlich ausgedrück mit "Konturverfolgung". Im Grunde habe ich die Konturen bereits durch die Kantendetektion erhalten. Ich möchte anschließend die einzelnen Pixel aus der Kantendetektion "so gut es geht" zu Vektoren zusammen fassen. D.h. die Pixel-Kanten sollen durch Vektoren approximiert werden.
Angestoßen durch OpenCV bin ich auf ein Paper von Teh und Chin gestoßen ("On the Detection of Dominant Points on Digital Curves"), was - soweit ich erkennen kann - in die gewünschte Richtung geht.
Die anderen Antworten helfen mir allerdings auch (in einer etwas anderen Richtung).
Ist OpenCV mit Java anständig nutzbar? Kenne mich mit dem Framework nicht aus, hat da wer schon Erfahrungen sammeln können?
-
Ohne groß Algorithmiker zu sein eine naive Idee: Du erstellst die Segmente mit deinem bisherigen Weg und versuchst anschließend, Segmente zusammenzufassen.
Bsp für Segmente A (von Punkt A1 bis A2) und B (B1 bis B2): Wenn A2 nahe B1 und die Punkte A2 und B1 nahe der Linie A1-B2 liegen, kannst du sie vereinen eben zu A1-B2. Was "nah" ist, muss nur noch definiert werden; evtl das erstere konstant und das letztere abhängig von der Länge von A1-B2.
-
hbricht schrieb:
Hallo,
danke für die Antworten. Ich habe mich vielleicht etwas undeutlich ausgedrück mit "Konturverfolgung". Im Grunde habe ich die Konturen bereits durch die Kantendetektion erhalten. Ich möchte anschließend die einzelnen Pixel aus der Kantendetektion "so gut es geht" zu Vektoren zusammen fassen. D.h. die Pixel-Kanten sollen durch Vektoren approximiert werden.
Angestoßen durch OpenCV bin ich auf ein Paper von Teh und Chin gestoßen ("On the Detection of Dominant Points on Digital Curves"), was - soweit ich erkennen kann - in die gewünschte Richtung geht.
Die anderen Antworten helfen mir allerdings auch (in einer etwas anderen Richtung).
Ist OpenCV mit Java anständig nutzbar? Kenne mich mit dem Framework nicht aus, hat da wer schon Erfahrungen sammeln können?
Guck einfach mal bei Youtube nach, OpenCV ist unter Java(auch Android) sowie unter Python sehr gut einsetzbar.