Optimierungsalgorithmus für die Segmentierung durch Bildsubtraktion

8

für ein Projekt in OpenCV Ich möchte bewegliche Objekte so gut wie möglich mit natürlich minimalem Rauschen segmentieren.

Dafür würde ich gerne einen Bildsubtraktion -Algorithmus verwenden. Ich habe bereits ein laufendes Programm, habe aber heute keinen Weg gefunden, faire Ergebnisse zu erzielen.

Ich habe bereits folgende Bilder (Graustufen) erhalten:

%Vor%

Bisher habe ich versucht, das aktuelle Bild und das letzte Bild mit cvSub(); oder mit cvAbsDiff(); zu substrahieren, um die beweglichen Teile zu erhalten.

Aber leider bekomme ich dort immer noch viel Lärm (zB durch leicht bewegte Bäume, wenn es windig ist) und wenn das Objekt, das sich bewegt, ziemlich groß ist und eine homogene Farbe hat (sagen wir mal eine Person in einem weißen oder schwarzen Shirt) , die Subtraktion erkennt nur die Veränderungen im Bild auf der linken und rechten Seite der Person, nicht auf dem Körper selbst, so dass ein Objekt manchmal als zwei Objekte erkannt wird ...

%Vor%

Um dieses Rauschen loszuwerden, habe ich versucht, die Bilder mit cvErode() und cvDilate() zu erodieren und zu erweitern, aber das ist ziemlich langsam und wenn die sich bewegenden Objekte auf dem Bildschirm klein sind, löscht die Erosion ziemlich viel von dem Objekt also nach dem Ablösen bekomme ich nicht immer ein gutes Ergebnis oder zersplitterte Objekte.

Danach mache ich ein cvFindContours() , um Konturen zu bekommen, überprüfe die Größe und wenn es passt, zeichne ein Rechteck um die sich bewegenden Objekte. Die Ergebnisse sind jedoch schlecht, da ein Objekt aufgrund der schlechten Segmentierung häufig in mehrere Rechtecke aufgeteilt wird.

Ein Freund sagte mir jetzt, ich könnte versuchen, mehr als zwei Rahmen für die Subtraktion zu verwenden, da dies den Lärm bereits reduzieren könnte ... aber ich weiß nicht wirklich, was er damit meinte und wie ich das addieren / subtrahieren sollte Frames, um ein Bild zu erhalten, das nahezu geräuschfrei ist und groß genug Objekt-Blobs zeigt.

Kann mir jemand dabei helfen? Wie kann ich mehr als einen Rahmen verwenden, um ein möglichst minimales Bildrauschen zu erhalten, aber mit genügend großen Blobs für die bewegten Objekte? Ich wäre dankbar für irgendwelche Tipps ...

ZUSÄTZE:

Ich habe gerade ein aktuelles Video hochgeladen: Ссылка Vielleicht will es jemand dort ausprobieren ...

Dies ist ein Rahmen daraus: Das linke Bild zeigt meine Ergebnisse von cvFindContours () und das rechte ist das segmentierte Bild, auf dem ich dann versuche, die Konturen zu finden ...

So ein großes Objekt funktioniert es gut, wenn sie sich schnell genug bewegen ... d. h. das Fahrrad .. aber auf gehenden Menschen bekommt es nicht immer ein gutes Ergebnis, aber ... Irgendwelche Ideen?

    
evident 08.04.2011, 22:52
quelle

3 Antworten

2

Gegeben drei benachbarte Rahmen A, B, C können Sie zwei Rahmenunterschiede X und Y erhalten. Durch Kombinieren von X und Y (durch, zum Beispiel Schwellenwertbildung und dann logische AND Operation) können Sie den Effekt des Rauschens reduzieren. Ein unerwünschter Nebeneffekt ist, dass der Bereich, in dem die Bewegung erkannt wird, etwas kleiner als ideal ist (die Operation AND reduziert die Fläche).

Da die Bewegungsabschätzung von Bildfolgen seit Jahrzehnten gut erforscht ist, möchten Sie vielleicht etwas über ausgeklügeltere Methoden der Bewegungserkennung lesen, z. Arbeiten mit Bewegungsvektorfeldern. Google Scholar ist in diesem Fall dein Freund.

    
misha 09.04.2011, 00:10
quelle
2

Es scheint, als ob Sie einen festen Hintergrund haben. Eine mögliche Lösung besteht darin, den Computer den Hintergrund lernen zu lassen, z. indem man einen Durchschnitt über die Zeit nimmt. Berechnen Sie dann den Unterschied zwischen dem Durchschnittsbild und dem Strom. Unterschiede entstehen wahrscheinlich durch bewegte Objekte.

    
midtiby 11.04.2011 18:44
quelle
1

Nun, es ist ein sehr heikles Thema. Bewegungsschätzung ist ziemlich komplex. Versuchen Sie also, gute Literatur zu finden und vermeiden Sie, Algorithmen zu erfinden:)

Meine Vorschläge sind:

  

Suchen Sie nach Bündeln von Bildern für die Bewegungsschätzung . Beim Bündeln werden viele Bilder verwendet, um Rauschen und Fehlerrate zu reduzieren.

     

Wenn Sie schließlich robust sein wollen, schauen Sie sich einen so genannten Kalman-Filter an. Wenn Sie Objekte verfolgen, möchten Sie nicht, dass sie "unendliche Geschwindigkeitssprünge" zwischen Ihren Bildern machen (was normalerweise Rauschen oder Fehltreffer ist). Dies ist eine C ++ - Bibliothek, die ich sehr empfehlen Kalman-Filter

     

Endlich, MonoSLAM, ich dränge ein bisschen :)

>

    
code-gijoe 09.04.2011 15:44
quelle