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

  • Ich muss alle Konturen in einem von der Kamera abgerufenen Bild finden. Also benutze ich zuerst den Kanten-Detektor, um die Kanten und dann die Konturen zu finden. Ziemlich einfach.

    Meine Konturen werden jedoch "zusammengeführt". Zum Beispiel habe ich im Bild unten eindeutig 4 verschiedene Objekte. Die Kanten berühren sich jedoch an einigen Stellen leicht, so dass ich eine große Kontur anstelle von vier separaten Konturen bekomme. Ich habe versucht, die Schwelle zu ändern, Erodierungen, Morphologieoperationen und ähnliches zu machen, aber die Ränder berühren sich leicht. Hat jemand Vorschläge, wie man in Bildern ähnliche Konturen erhält, die der unten stehenden ähneln? (Das Bild unten ist offensichtlich nur ein Beispiel, meine tatsächlichen Bilder sind viel komplexer, haben aber das gleiche Grundproblem).

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

    08 December 2011
    Darren Kopp
3 answers
  • Erkennen verschiedener Komponenten:

    Wenn Sie versuchen, die verschiedenen Komponenten zu ermitteln, gibt es wahrscheinlich andere Ansätze, als die Konturen zu ermitteln. Hier ist ein Beispiel in Mathematica. Eine Erosion gefolgt von Dilatation 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["https://bestecode.com/attachments/Answer/867/yqDyu.png"];
    Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]
     

    Die Abbildung links zeigt die Erkennung unvollständiger Objekte (ohne die Lücke zu schließen) und rechts die korrekte Erkennung (mit dem obigen Code).

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

    Erkennen der verschiedenen Konturen:

    Wenn Sie nur die Konturen trennen möchten, finden Sie hier ein Beispiel. Die Erosion und Dilatation werden wie zuvor ausgefü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, so dass Sie sehen können, was verwendet wird.

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

    Dies wird ergeben Sie haben sowohl die Innen- als auch die Außenkante (siehe Abbildung links unten), da die Pixelbreite ringsum größer als 1 ist. Ich hatte nicht viel Glück beim Versuch, es dünner zu machen, da die Leistung nachlässt (dies kann bei anderen Bildern anders sein). Die Innenkonturen sind die, die Sie wünschen, und die Außenkontur ist nur die kombinierte Kontur aller 4 Komponenten. Jetzt müssen wir nur noch das äußerste löschen:

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

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

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

    Beachten Sie, dass die offensichtlichen Brüche in der Abbildung auf das Speichern von JPEG-Dateien zurückzuführen sind eine kleinere Größe. Auf meinem Bildschirm sieht das nicht so aus.

    06 December 2011
    Darren Kopp
  • Versuchen Sie, Ihre Bilder mit einem morphologischen Filter wie Erosion . 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.

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

    Wenn Sie Probleme bei der Verwendung haben, sollten Sie nach einem völlig anderen Algorithmus suchen. Es gibt komplexere und robustere Wege, um Dinge zu lösen, aber es hängt davon ab, was Sie erreichen wollen (Objekterkennung, Verfolgung usw.)

    04 December 2011