Wie erkenne ich verschiedene Objekte, wenn sich ihre Kanten berühren?

21

Ich muss alle Konturen in einem Bild finden, das von der Kamera abgerufen wurde. Also benutze ich zuerst den scharfen Kantendetektor, um die Kanten und dann die Konturen zu finden. Ziemlich einfach.

Meine Konturen werden jedoch "zusammengeführt". In der Abbildung unten habe ich zum Beispiel vier verschiedene Objekte. Die Kanten berühren sich jedoch an einigen Stellen leicht , sodass ich eine große Kontur anstelle von vier separaten Konturen erhalte. Ich habe versucht, die Schwellen zu ändern, Erodierungen, Morphologieoperationen und ähnliche Dinge, aber die Kanten berühren sich leicht. Hat jemand Vorschläge, wie man separate Konturen in Bildern erhält, die der folgenden ähneln? (Das Bild unten ist natürlich nur ein Beispiel, meine tatsächlichen Bilder sind viel komplexer, haben aber das gleiche Grundproblem).

Bildbeschreibung hier eingeben

Lorem Ipsum
quelle
Die Wasserscheidensegmentierung kann funktionieren.
Sm176357
Daher sollten Sie auch Fälle in Betracht ziehen, in denen der Kontakt eine Linie und nicht nur ein Punkt ist (berühren, aber nicht überlappen)
Shravya Boggarapu,

Antworten:

11

Verschiedene Komponenten erkennen:

Wenn Sie versuchen, die verschiedenen Komponenten zu erkennen, gibt es wahrscheinlich andere Ansätze, als die Konturen zu erkennen. Hier ist ein Beispiel in Mathematica. Eine Erosion gefolgt von einer Erweiterung wird verwendet, um die Lücke in der zweiten Komponente vor der Erkennung zu schließen (wenn Sie dies nicht tun, wird sie nicht erkannt).

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

Die Abbildung links unten zeigt die Erkennung unvollständiger Objekte (ohne die Lücke zu schließen) und rechts die korrekte Erkennung (unter Ausführung des obigen Codes).

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Erkennen der verschiedenen Konturen:

Wenn Sie jedoch in der Tat nur die Konturen trennen möchten, finden Sie hier ein Beispiel. Die Erosion und Dilatation werden wie zuvor durchgeführt, um die Lücke zu schließen, und das resultierende Bild wird durch einen Canny-Kantendetektor geführt. Ich habe die Standardoptionen explizit festgelegt, damit Sie sehen können, was verwendet wird.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

Dadurch erhalten Sie sowohl die Innen- als auch die Außenkante (siehe Abbildung links unten), da die Pixelbreite umlaufend größer als 1 ist. Ich hatte nicht viel Glück, als ich versuchte, es dünner zu machen, da sich die Leistung verschlechtert (kann für Ihre anderen Bilder unterschiedlich sein). Die inneren Konturen sind diejenigen, die Sie möchten, und die äußere Kontur ist nur die kombinierte Kontur aller 4 Komponenten. Jetzt müssen wir nur noch den äußersten fallen lassen mit:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

Das gibt Ihnen nur die inneren Konturen (siehe unten rechts). Mit anderen Worten, es werden nur die Konturen ausgewählt, die von mindestens einer anderen Kontur umschlossen sind, wodurch die äußerste automatisch disqualifiziert wird. Ich kenne das Äquivalent dieser Befehle / Operationen in openCV nicht.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Beachten Sie, dass die offensichtlichen Unterbrechungen in der Abbildung auf das Speichern von JPEG in einer kleineren Größe zurückzuführen sind. Auf meinem Bildschirm sieht es nicht so aus.

Lorem Ipsum
quelle
2

Versuchen Sie, Ihre Bilder mit einem morphologischen Filter wie Erosion vorzuverarbeiten . Dadurch können berührende Konturen getrennt werden. Nachdem Sie Ihre Konturen erkannt haben, können Sie eine Dilatationsoperation anwenden , um Gitter zu vervollständigen.


quelle
Ich habe es versucht, aber die Ergebnisse zeigten keine Verbesserung.
1
Können Sie ein echtes Beispielbild zeigen?
2

Es ist keine Antwort auf Ihre Frage, aber die Konturanalyse ist fehleranfällig. Sie können nicht viel dagegen tun und es funktioniert nur in sehr einfachen Szenarien.

Wenn Sie Probleme damit haben, sollten Sie nach einem völlig anderen Algorithmus suchen. Es gibt komplexere und robustere Möglichkeiten, um Probleme zu lösen. Dies hängt jedoch davon ab, was Sie erreichen möchten (Objekterkennung, Verfolgung usw.).


quelle
Danke dir. Mein Programm wird zur Handerkennung verwendet, daher würde ich annehmen, dass es der Objekterkennung sehr ähnlich ist. Haben Sie Vorschläge für komplexere und robustere Algorithmen gemacht? Haar Features, SURF und ähnliche Algorithmen für maschinelles Lernen können ich nicht.
Haben Sie sich diese Ressourcen angesehen? paginas.fe.up.pt/~hgc2011 Es handelt sich hauptsächlich um Datenbanken / Ergebnisse, aber ich hoffe, Sie finden hier einige gute Artikel.
0

Konturen sind nicht unbedingt offen. Denken Sie daran, dass Sie sie mit Canny erkannt haben. Die Probleme mit Canny wurden bereits disccused hier . Die Diskussion über Canny gibt Ihnen die Grundidee, dass es immer noch Operationen wie Schließen und Dehnen gibt, die zusätzlich zu Canny erforderlich sind, um geschlossene Konturen zu bewerten.

Dies hängt auch davon ab, ob wir nach Konturen oder Segmentierungen suchen (Canny versus Methoden wie Graphcuts ). Ich denke, die Suche nach einer robusten Lösung hängt von Ihrer endgültigen Anwendung ab.

Beedot
quelle