Robuste Verfolgung von Blobs

8

Ich habe ein Bild-Feature-Extraktionsproblem. Die Eingabebilder sind binär (schwarz und weiß) und können Blobs mit ungefähr bekannter Fläche und Seitenverhältnis enthalten. Diese müssen mit Ellipsen unter Verwendung eines Best-Fit-Algorithmus angepasst werden.

Beispieleingabe:

Gewünschte Ausgabe:

Es kann mehrere Blobs (null oder mehr) geben, die Anzahl ist nicht im Voraus bekannt. Das ungefähre Flächen- und Seitenverhältnis aller Blobs ist bekannt (und ist dasselbe). Wie viele sind in dem Bild, ihre Position, Orientierung und tatsächliche Größe sind was ich versuche zu finden. Die Ausgabe sollte eine optimale Ellipse für jeden Blob basierend auf der tatsächlich gefundenen Größe und dem Seitenverhältnis sein.

Was dies schwierig macht, sind Rauschen und mögliche Überlappungen.

Beispiel mit Rauschen:

Beispiel mit Überlappung und Rauschen:

Das verrauschte Bild kann Löcher in den Blobs und auch kleine andere verstreute Blobs enthalten. Die kleinen anderen Blobs werden nicht gezählt, weil sie zu klein sind und keinen Bereich abdecken, der dicht genug ist, um als echte Übereinstimmung betrachtet zu werden.

Das Bild mit der Überlappung sollte als zwei Blobs gezählt werden, da der Bereich zu groß ist, als dass ein einzelner Blob ihn gut abdecken könnte.

Eine mögliche Metrik, die eine mögliche Anpassung auswertet, ist:

Summe aller Ellipsen von (K1 * Prozent Abweichung von der erwarteten Größe + K2 * Prozent Abweichung vom erwarteten Seitenverhältnis + K3 * Prozent der Ellipse, die nicht schwarz ist + K4 * Prozent überlappt mit irgendeiner anderen Ellipse) + K5 * Prozent von Rest des Bildes, das schwarz ist

für einige geeignet gewählte Parameter K1..K5. Eine perfekte Übereinstimmung erzielt 0 Punkte.

Ich kann sehen, wie man das mit roher Gewalt löst, zum Beispiel indem ich genug verschiedene mögliche Passungen ausprobiere, um den Suchraum gut zu untersuchen. Ich kann nicht viel schneller an eine Methode denken als an rohe Gewalt.

Ich würde Beispiele in Python und / oder opencv bevorzugen. Ich werde versuchen, alle vorgeschlagenen Lösungen in Python zu implementieren und zu posten. Danke!

P.S. Es kann nicht angenommen werden, dass ein Blob verbunden ist. Es kann genug Rauschen geben, um es in diskontinuierliche Teile zu zerlegen.

P. P. S. Die kleinen Rauschanteile können nicht durch binäre Erosion entfernt werden. In einigen meiner Bilder gibt es genug innere Löcher, dass die Erosion den ganzen (echten) Blob verschwinden lässt, wenn das Bild so stark erodiert ist, dass auch die Rausch-Bits verschwinden.

P.P.S. Ich denke, dass es sehr schwierig wäre, dies mit jedem konturbasierten Ansatz zu lösen. Die Daten, die ich in der Praxis sehe, haben zu viel Kantenrauschen, es können (und sind oft) Rauschbits sein, die einzelne Blobs verbinden, oder die einen einzelnen Blob in mehrere (scheinbare) verbundene Komponenten trennen. Ich möchte einen Ansatz, der auf Flächen basiert, da die Flächendeckung viel weniger neugierig ist als die Kantenformen.

P.P.P.P.S. Wie gewünscht, hier ein Beispiel mit einem Durchgang durch Rauschen:

und eine Probe mit viel und viel Lärm, aber trotzdem ein eindeutiger Fleck:

BEARBEITEN Keine der Antworten löst das Problem tatsächlich, obwohl Bharat eine Teillösung vorgeschlagen hat, die sich gut für nicht überlappende Blobs eignet. Mehr bitte :) Ich werde zusätzliche Belohnung für alle tatsächlichen Lösungen vergeben.

    
Alex I 19.01.2014, 13:42
quelle

5 Antworten

2

Ich würde versuchen, ein Gauß-Mischungsmodell anzupassen und dann die Mittelwert- und die Kovarianzmatrix verwenden, um Ellipsen über die Daten zu setzen. Solch ein Modell würde sogar mit Überlappung und kleinen lauten Blobs funktionieren. Die Daten, die Sie haben, wären die Koordinaten der Pixel, die schwarz sind und Sie könnten ein GMM über die Daten passen. Ein Problem bei diesem Ansatz ist, dass Sie die Anzahl der Blobs kennen müssen, die Sie im Voraus verfolgen müssen. Wenn Sie hierfür eine Heuristik erstellen können, sollte GMM dieses Problem ziemlich effizient lösen.

    
Bharat 19.01.2014, 18:17
quelle
2

Sie füllen die Löcher [1] , Sie erkennen Konturen [2] und verwenden Sie Momente auf jedem Konturrechteck, um Orientierung, Exzentrizität usw. zu finden [3] .

PS .: Die unterbrochenen Konturen (Rauschen) können nach Größe herausgefiltert werden.

    
William 22.01.2014 10:36
quelle
1

Sie können damit beginnen, Konturen nach Bereich auszufiltern.

Über das Trennen von überlappenden Blobs, das könnte eine knifflige sein (ich würde sagen, unmöglich für willkürliche Überlappungen) mit diesem Binärbild tun, vielleicht sollten Sie es mit dem Originalbild oder zumindest ein paar Schritte zurück von Pre tun -Verarbeitung.

OpenCVs fittEllipse wird ebenfalls hilfreich sein.

    
Rui Marques 22.01.2014 18:02
quelle
0

Dies ist kein grundlegendes Programmierproblem, das erfordert fortgeschrittene Bildverarbeitungstechniken. Von dem, was ich weiß, sind "Bildverarbeitung, Morphologie" die Punkte, auf die Sie zielen. Sie können einen Kurs in "Image Morphology" nehmen, um diese grundlegenden Konstrukte wie "Dilation, Erosion" usw. zu verstehen. Dann haben Sie die Grundlagen, um dieses Problem zu lösen.

    
zinking 29.01.2014 01:41
quelle
0

Da Sie die Größe und Ausrichtung haben, können Sie jede Ellipse zeichnen und Vorlagenvergleich verwenden.

Siehe Tutorial hier

    
Eran W 29.01.2014 03:35
quelle