Hallo CV / Pattern Recognition Community,
Ich habe ein ernstes Problem mit der Segmentierung eines Bildes. Das Szenario ist eine Atmosphäre in einem Ofen, die meinen Kopf verrückt macht. Und ich muss Objektkonturen aus verschiedenen Materialien (Glas, Keramik, Al, Ir, ..) in kurzer Zeit (<10 Sekunden) und nicht nur für einen Sonderfall erkennen. Ich brauche auch die Kontur in einer sequentiellen Reihe von Pixeln für den Code. Daher wird auch ein Kettencode oder ein sogenanntes Border / Contour-Follower benötigt, sodass offene Löcher nicht gut sind. Im Hintergrund treten von Zeit zu Zeit nichtlineare Geräusche auf, etwa von Staub, Partikeln oder Ähnlichem.
Matlab- oder OpenCV-Vorschläge sind willkommen.
Um es klarer zu machen, habe ich ein weiteres Bild meines Ziels und ein halbtransparentes Objekt gepostet, das ebenfalls erkannt werden muss. Auch weitere Beispiele, die es zu beachten gilt.
Wie Sie in Bild 1 sehen können, befinden sich Partikel im rechten Teil des Bildes und in der Nähe der Außenkontur des Sterns, bei dem es sich um das Objekt handelt. Auch der Gesamtkontrast ist nicht sehr gut. Das Objekt selbst steht auf einem Untergrund, der für die Konturerfassung nicht relevant ist. Das Bild # 2 zeigt ein halbtransparentes Objekt, was auch möglich ist.
Ich möchte die Kontur / den Umfang dieses Objekts finden, wie auf dem nächsten Bildschirm (rote Linie). Die beiden Rechtecke (gelb) markieren den Start- (links) und Endpunkt (rechts). Die blaue Linie ist ignorierbar.
Zuerst dachte ich, ich könnte das Problem dieser schmutzigen Atmosphäre mit nur Filtern lösen. Aber nach einer beachtlichen Menge an Zeit wurde mir klar, dass ich die Geräusche deutlich reduzieren oder eliminieren muss, um den Kontrast zwischen Vordergrund und Hintergrund zu erhöhen. Ich habe viele Methoden ausprobiert, wie Histogramm-Entzerrung, Otsu-adaptive Entzerrung, lineare Filter (z. B. Gauß), nichtlineare Filter (Median, Diffusion), aktive Konturen, k-Mittelwerte, Fuzzy-c-Mittelwerte und auch Canny for pure Kantenerkennung in Kombination mit morphologischen Operatoren.
- Canny: Die Partikel und die Atmosphäre verursachen Löcher, aber ich brauche eine vollständige Kontur des Objekts. Trotzdem reicht es nicht aus, die morphologischen Operatoren zu schließen und zu erweitern. Canny hat immer noch die besten Ergebnisse von allen Methoden, die ich wegen Hysterese studiert habe.
- Aktive Konturen: Sie arbeiten auch an Kanten / Verläufen, sie verhalten sich nach der Initialisierung innerhalb des Objekts völlig verrückt, was möglicherweise durch die Kantenabbildung verursacht wird, die zum "offenen" Objekt führt. Soweit ich weiß, muss die Kontur geschlossen werden. Versuchte es mit verschiedenen Derivaten (GVF / VFC / Classic Snake).
- k-Means: Die Ergebnisse beinhalten die Ofenatmosphäre aufgrund des nebligen Hintergrunds. Gleiches gilt für Fuzzy-C-Mittel. Ich habe zwei Cluster ausgewählt, um das Objekt vom Hintergrund zu trennen. Mehr Cluster führen zu schwächeren Ergebnissen.
- Histogramm / Otsu: Aufgrund der sehr engen Grauintensität (imho!) Verschmilzt das Objekt mit dem Hintergrund. Versuchte es mit lokalen und globalen Methoden.
- Filter: Besonders GLPF oder andere LPF verschmieren die Ränder, was nicht so gut ist und nicht einmal die Nebelatmosphäre mindert.
- Nichtlineare Filter erhalten die Kanten. Die meisten von ihnen brauchen zu lange, um die großen Bilder zu berechnen. Ich habe vorerst einen schnellen bilateralen Filter genommen. Ergebnisse siehe unten.
Daher ist keine einzige Methode für Nachbearbeitungsschritte gut genug, da die gewonnenen Ergebnisse des Objektsegments schlecht mit einem vorhandenen Algorithmus konkurrieren. Dieser vorhandene Algorithmus ist sehr lokal und funktioniert daher für dieses spezielle Szenario.
Ich frage Sie also, ob ich etwas völlig verpasst habe ... Ich habe keine Ahnung, wie ich es verarbeiten soll und wie ich gute Konturergebnisse erzielen soll, ohne Lücken oder Löcher zu haben CCD und die physische Umgebung? Danke im Voraus!
Letzter Ansatz bisher (nach einer langen Nacht voller Experimente mit MOs):
- Bilateraler Filter (kantenerhaltende, aber homogene Bereiche glättende)
- Canny (Sigma = 2, Threshold = [0.04 0.08])
- Morphologische Operationen (MO):
bwareopen
,closing
,remove
&bridge
bwlabel
Zum Auswählen nur des Umfangs der Kontur, wodurch unerwünschte Geräusche entfernt werden. Noch keine aktualisierten Screenshots, aber es funktioniert für den Star. Das Glas hat eine Innenkontur, die mit der Außenkontur verbunden ist. Dies ist auch auf dem folgenden Screenshot zu sehen.
Ich fürchte also, ich brauche einen speziellen Algorithmus zum Durchlaufen der Außenkontur. Es wird eine Suche im / gegen den Uhrzeigersinn der Nachbarschaft sein. Dieser Schritt im / gegen den Uhrzeigersinn kann wechseln, wenn es einen Eckpunkt gibt. Wenn es eine Lücke gibt, vergrößern Sie den Radius und schauen Sie erneut. Wenn es zwei oder mehr mögliche folgende Punkte gibt, nehmen Sie denjenigen, der dieselbe Richtung wie der vorherige hat. Denken Sie, dass der Konturfolgealgorithmus Sinn macht?
quelle
Antworten:
Sie können Folgendes versuchen:
Effiziente grafische Bildsegmentierung: http://www.cs.brown.edu/~pff/segment/ (Code verfügbar)
GraphCut-basierte Segmentierung: http://www.csd.uwo.ca/~olga/OldCode.html (Code verfügbar)
Das Bild zuerst mit sparsamen Methoden entstören: http://spams-devel.gforge.inria.fr/ (Code verfügbar)
quelle
Ich denke, Sie haben die Schwellentechniken zu früh aufgegeben. Schauen Sie sich Ihr Histogramm an, es ist eindeutig trimodal: (Ich habe die weißen Spalten rechts von Ihrem Bild manuell entfernt. Ich gehe davon aus, dass sie nicht Teil des Bildes sind. Bitte machen Sie dieses Bild, bevor Sie meinen Code ausführen.)
Schauen Sie sich alle Werte in der ersten Gruppe an:
Um Modi im trimodalen Histogramm zu finden, können K-Mittel-Cluster mit einer bestimmten
K=3
Intensität verwendet werden. Der folgende Matlab-Code istth1=67
in Ihrem Code enthalten. Die Idee ist anzunehmen, dass Sie die 3 Sätze haben, und den gewichteten Schwerpunkt für jeden einzelnen zu berechnen. Dann wird jeder Intensitätsstufe ein eigener Cluster zugewiesen. Sie hören auf, wenn sich die gewichteten Zentroide nicht mehr bewegen. Hier ist das Ergebnis der Suche nach zwei Schwellenwerten für Ihr Bild, die im Histogramm angezeigt werden.Das Problem danach zu lösen, ist ein Kinderspiel. Machen Sie einfach einige einfache morphologische Operationen, wie das Öffnen.
quelle
imhist
zuhist
Wie oben angedeutet, kann die Schwellenwertbildung bei diesem Bild, das im Wesentlichen binär ist, sehr effektiv sein, mit der Ausnahme, dass eine konstante Schwelle aufgrund ungleichmäßiger Beleuchtung nicht ausreicht. Sie benötigen adaptive Schwellenwerte.
Mein Rat wäre, die Hintergrundrekonstruktion mit einem einfachen Modell (möglicherweise planar [3 DOF] oder quadradisch [6 DOF]) durchzuführen, indem eine kleine Anzahl von Werten in den hellen Bereichen abgetastet wird. Verwenden Sie am besten kleine ROIs, um das Rauschen zu reduzieren. Korrigieren Sie dann die Schattierung, indem Sie die Hintergrundwerte subtrahieren (oder durch diese dividieren).
Wenn menschliche Interaktion keine Option ist, können Sie die Suche nach Hintergrundbereichen automatisieren, indem Sie zuerst gerade Otsu ausführen und einheitliche ROIs (geringe Varianz) weit unterhalb des Schwellenwerts berücksichtigen. Nach einer ersten Hintergrundrekonstruktion können Sie diese wahrscheinlich verbessern, indem Sie diesen Vorgang auf das flach korrigierte Bild anwenden.
Der gesamte Prozess kann so implementiert werden, dass er deutlich unter einer Sekunde liegt.
quelle
Ich denke, der beste Weg ist, aktive Konturen zu verwenden. Wenn Sie nicht wissen, welche Konturen aktiv sind, schauen Sie sich dieses Video auf Youtube an http://www.youtube.com/watch?v=ijNe7f3QVdA
Grundsätzlich müssen Sie eine Initialisierungssegmentierung vornehmen, um die Form zu verbessern. Mein Vorschlag ist, eine der Methoden in diesem Beitrag zu diskutieren und aktive Konturen als 2. Schritt zu verwenden, dh. als Verbesserungsschritt.
Hier ist eine Implementierung von aktiven Konturen, die Sie verwenden können: http://www.mathworks.com/matlabcentral/fileexchange/19567
quelle
Sie wissen genau, worum es geht, haben aber noch nicht die Verwendung von Schwellenwerten erwähnt. Haben Sie insbesondere versucht, mithilfe von Otsu einen globalen Schwellenwert anzuwenden, um den richtigen Pegel zu berechnen, dann Konturen zu finden und den größten auszuwählen?
[Bearbeiten zur Verdeutlichung]
Der globale Schwellenwert funktioniert offensichtlich nicht, da im gesamten Bild ein Graident angezeigt wird.
Ich hatte ein schnelles Spiel damit und stellte fest, dass, wenn Sie das Bild in 6 Teile (2 Reihen mit 3 Spalten gleicher Größe) aufteilen, dann mit Otsu eine Schwellenwertberechnung für jedes einzelne durchführen und dann wieder zusammenbauen, es eine gute Arbeit beim Aufräumen des Bildes leistet Bild.
Im oberen rechten Bereich des Sterns befinden sich noch einige kleinere Artefakte.
Da das Objekt gerade Liniengrenzen hat, sollten Sie möglicherweise eine Hough-Transformation in Betracht ziehen, um diese Kanten zu extrahieren, sie zu schneiden, um Scheitelpunkte zu lokalisieren und das Ergebnis als Objektkontur zu verwenden.
quelle
Sind die Umrisse immer gerade Linien oder bekannte Kurven?
Wenn ja, dann würde ich Hough-Transformationen verwenden, um die Gleichungen der Linien zu erhalten und dann die Countours aus den Linien und itnersections neu zu erstellen, anstatt zu versuchen, jedes Pixel entlang der Kante korrekt zu machen
quelle