Robustes Tracking von Blobs
Ich habe ein Problem beim Extrahieren von Bildelementen. Die Eingabebilder sind binär (schwarz und weiß) und können Flecken von ungefähr bekanntem Bereich und Seitenverhältnis enthalten. Diese müssen mithilfe eines Best-Fit-Algorithmus mit Ellipsen angepasst werden.
Beispiel Eingabe:
Gewünschte Ausgabe:
Es kann mehrere Blobs geben (null oder mehr), die Anzahl ist im Voraus nicht bekannt. Die ungefähre Fläche und das Seitenverhältnis aller Blobs sind bekannt (und identisch). Wie viele sind in dem Bild, ihre Position, Orientierung und tatsächliche Größe sind, was ich versuche zu finden. Die Ausgabe sollte für jeden Blob eine am besten passende Ellipse sein, basierend auf der tatsächlich gefundenen Größe und dem Seitenverhältnis.
Was dies schwierig macht, ist Rauschen und mögliche Überlappungen.
Beispiel mit Rauschen:
Beispiel mit Überlappung und Rauschen:
Das verrauschte Bild kann Löcher in den Klecksen und auch kleine andere Kleckse aufweisen, die verstreut sind. 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 angesehen zu werden.
Das Bild mit Überlappung sollte als zwei Kleckse gezählt werden, da der Bereich zu groß ist, als dass ein einzelner Kleckse ihn gut abdecken könnte.
Eine mögliche Metrik, die eine mögliche Anpassung bewertet, ist:
Summe über alle Ellipsen von (K1 * prozentuale Abweichung von der erwarteten Größe + K2 * prozentuale Abweichung vom erwarteten Seitenverhältnis + K3 * prozentuale Abweichung der nicht schwarzen Ellipse + K4 * prozentuale Überlappung mit einer anderen Ellipse) + K5 * prozentuale Abweichung vom Rest des Bildes das ist schwarz
für einige passend gewählte Parameter K1..K5. Eine perfekte Übereinstimmung ergibt 0.
Ich kann sehen, wie dies mit brachialer Gewalt gelöst werden kann. Zum Beispiel kann ich versuchen, genügend unterschiedliche Anpassungen zu finden, um den Suchraum gut abzutasten. Ich kann mir keine Methode vorstellen, die viel schneller ist als rohe Gewalt.
Ich würde Beispiele in Python und / oder OpenCV bevorzugen. Ich werde versuchen, alle Lösungsvorschläge in Python umzusetzen und zu posten. Vielen Dank!
P.S. Es kann nicht davon ausgegangen werden, dass ein Blob verbunden ist. Es kann genug Geräusche geben, um es in unterbrochene Teile zu zerlegen.
P.P.S. Das kleine Rauschen kann nicht durch binäre Erosion beseitigt werden. In einigen meiner Bilder gibt es genug innere Löcher, die durch Erosion den gesamten (echten) Fleck verschwinden lassen, wenn das Bild so stark erodiert ist, dass auch die Rauschbits verschwinden.
P.P.P.S. Ich denke, dass es sehr schwierig wäre, dies mit einem Ansatz zu lösen, der auf Konturen basiert. Die Daten, die ich in der Praxis sehe, haben zu viel Kantenrauschen. Es kann (und häufig) Rauschbits geben, die separate Blobs verbinden oder die einen einzelnen Blob in mehrere (scheinbar) verbundene Komponenten aufteilen. Ich hätte gerne einen Ansatz, der auf Flächen basiert, da die Flächendeckung weniger neugierig zu sein scheint als die Kantenformen.
P.P.P.P.S. Wie gewünscht, hier ein Beispiel mit einem durch Rauschen verursachten Schnitt:
und ein Sample mit sehr viel Lärm und trotzdem einem deutlichen Blob:
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 jede tatsächliche Lösung mit zusätzlichen Kopfgeldern belohnen.