Bildsegmentierungsproblem verschiedener Materialien


15

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. Beispiel 1 example2 Beispiel3 example4

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. example2

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
  • bwlabelZum 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?

Kanten aus Glas Star


Haben Sie es mit der adaptiven Schwelle versucht? Sie scheinen es nicht zu erwähnen. Ich denke, OTSU sollte irgendwie funktionieren, nachdem das Rauschen beseitigt wurde, aber vielleicht ist die adaptive Schwelle besser.
Rui Marques

Hallo Rui, ich habe mit dieser Matlab - Erweiterung adaptives Thresholding versucht: Adaptives Thresholding Hier sind die Ergebnisse für das Herumspielen mit den Fensterparametern: 1. Versuch 2. Versuch 3. Versuch Wie Sie sehen, geht der mittlere Teil mit zunehmenden Parametern von weiß nach schwarz (was ist gut, imho) aber der rest des hintergrunds wird auch schwarz, was schlecht ist.
mchlfchr

3
Haben Sie einige grundlegende Techniken zur Bildreduzierung ausprobiert? Subtrahieren Sie beispielsweise eine Flachfeldkorrektur, um diese Verdunkelung oben rechts zu beseitigen ( en.wikipedia.org/wiki/Flat-field_correction ). Wenn die Partikel statisch sind, werden sie auch sofort entfernt. Dann können Sie jede beliebige Kantenerkennungsmethode verwenden ...
PhilMacKay

Hallo Phil, soweit es mich betrifft und wie ich weiß, gibt es eine Reihe von Bildern, die aufgenommen werden, bevor ein Gegenstand in den Ofen gelangt. Art der Kalibrierung ist daher hier. Ich werde am Montag mit dem Physiker sprechen, der für das CCD und die Umwelt verantwortlich ist. Aber danke für den Rat, ich werde es versuchen!
mchlfchr

Das zweite Bild, das Sie hinzugefügt haben, sieht völlig anders aus. Kannst du alle möglichen Bilder posten?
Andrey Rubshtein

Antworten:


2

Sie können Folgendes versuchen:


Hallo oli, in Bezug auf spärliche Methoden: Könntest du genauer wissen, welche Methoden dieses Codes ich verwenden soll? Ich bin nicht sehr tief in diesen Abschnitt vertieft, und ich habe in den Dokumenten keine hilfreichen Informationen zum Entrauschen oder Verwischen gefunden ... Vielen Dank im Voraus.
mchlfchr

1
Dort finden Sie eine " benutzerfreundlichere
oli

Es tut mir leid, mich ein anderes Mal zu beschweren ;-) ... hast du auch Win32-Quellen? Danke nochmal!
mchlfchr

Ich fürchte, ich weiß nicht ...
oli

2

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.)

Bildbeschreibung hier eingeben

Schauen Sie sich alle Werte in der ersten Gruppe an:

Bildbeschreibung hier eingeben

Um Modi im trimodalen Histogramm zu finden, können K-Mittel-Cluster mit einer bestimmten K=3Intensität verwendet werden. Der folgende Matlab-Code ist th1=67in 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.

Bildbeschreibung hier eingeben

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Das Problem danach zu lösen, ist ein Kinderspiel. Machen Sie einfach einige einfache morphologische Operationen, wie das Öffnen.


1
Hallo Andrey, aber wie soll ich eine Verallgemeinerung dieser von Ihnen genannten Schwelle vornehmen? Ich habe mehrere Fälle, nicht nur diesen, und ich brauche noch Automatisierung. Und die Otsu-Schwelle (Funktion in Matlab) lieferte keine guten Ergebnisse. Noch weitere Hinweise? Mit freundlichen Grüßen
mchlfchr

Hallo nochmal, danke soweit, aber der Code funktioniert nicht. Ein leerer Bildschirm wird angezeigt. Versuchte es mit meinen Originaldaten (Bitmaps) und dem PNG, das du oben gepostet hast. Ich
debugge in der

@mchlfchr, hast du eine Bildverarbeitungs-Toolbox? Wenn Sie dies nicht tun, können Sie imhistzuhist
Andrey Rubshtein

@mchlfchr, siehe aktualisierte Version
Andrey Rubshtein

Andrey, wenn ich die ursprüngliche Bitmap-Datei einfüge, sind die Ergebnisse so, wie ich es in meinem ursprünglichen Beitrag erwähnt habe. Vielleicht passiert dies in Bezug auf die Auflösung? Das Ausgangsbild hat eine Größe von 576 x 768 Pixel und eine Graustufe (256). Hier sind die Ergebnisse, wenn ich Ihre Funktion mit meinem Originalbild verwende: i.imgur.com/UXALJ.png Histogramm-Figur Ihrer Funktion: i.imgur.com/7RiPP.png Vielen Dank für Ihre Hilfe!
Viele

1

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.


Hallo Yves, eine automatisierte Abwicklung wird bevorzugt. Der DOF-Aspekt ist interessant, aber ich bin mir bei der Otsu-Methode nicht sicher, da Otsu selbst nicht gut funktioniert. Verstehe ich es richtig, dass Sie zufällige Bereiche des Bildes auswählen möchten und dann einen Schwellenwert nach dem Mittelwert für alle ausgewählten Bereiche festlegen würden? Mit freundlichen Grüßen
mchlfchr

1

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


Willkommen bei dsp.se :) Vielen Dank für Ihren Beitrag, Sie haben eine nette Antwort gegeben. Wenn Sie es noch besser machen wollen, halte ich es für interessant, einige der folgenden Fragen zu beantworten: Warum ist dies Ihrer Meinung nach der beste Ansatz (z. B. haben Sie persönliche Erfahrungen mit der Technik)? Welcher der bereits vorgeschlagenen Ansätze passt Ihrer Meinung nach gut zu Ihrem Vorschlag? Bieten Sie eine kurze Erklärung der Technik an, oder versuchen Sie, wenn Sie Zeit haben, experimentelle Ergebnisse mithilfe der Technik auf den bereitgestellten Beispielbildern bereitzustellen. Und viel Spaß auf dsp!
Penelope

@mkuse, wie du vielleicht den ersten Beitrag gelesen hast, hatte ich schon die aktiven Konturen ausprobiert, kombiniert mit Rauschunterdrückung und Edge Maps. Die Ergebnisse waren schlecht und hatten eine schlechte Laufzeit für große Bilder.
mchlfchr

Wie wäre es mit einem Blick auf Lärmreduzierungstechniken. Eine Zusammenfassung davon finden Sie hier: lnmiitdip.files.wordpress.com/2011/12/…
mkuse

1
@mkuse, ich habe bereits in meinem ersten Beitrag die Mechanik erwähnt, die Sie in Ihrer PPT-Datei gepostet haben. Ich habe meinen ersten Beitrag bearbeitet, um klarer zu machen, welche Art von Filtern ich verwendet habe.
mchlfchr

0

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.


Hallo Dave, ich habe Otsu ausprobiert, aber es hat den Effekt, dass der rechte obere Hintergrund mit dem Objekt verschmilzt, was absolut inakzeptabel ist.
mchlfchr

Hallo Dave, Hough ist aufgrund der Laufzeitanforderungen keine Option. Soweit ich Kenntnisse über HT habe, ist dies für große Bilder sehr zeitaufwändig.
mchlfchr

0

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


1
Wie ich bereits erwähnte: Ich benötige Echtzeit-Ansätze in der Nähe. Und soweit ich die HT kenne, ist es sehr zeitaufwändig. Ein weiterer Aspekt ist, dass ich die Kurven nicht kenne und die Linien nicht immer gerade sind. Die Kontur ist abhängig vom Material, das sich im Ofen befindet (weitere Informationen finden Sie in meinem Ursprungsbeitrag).
mchlfchr

Für gerade Linien ist es ziemlich schnell, und wenn Sie ungefähr wissen, wo sich die Linien befinden (z. B. aus einem vorherigen Frame), können Sie nur diesen Parameterraum durchsuchen
Martin Beckett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.