2010-06-09 8 views
6

Ich suche Hintergrund Subtrahieren auf ein Bild. Ich bin neu in MATLAB und neu in der Bildverarbeitung/Analyse, es tut mir leid, wenn das alles dumm klingt. 1) Anders als imsubtract() Gibt es noch andere Möglichkeiten, den Hintergrund zu subtrahieren (neben dem Vergleich eines Bildes mit einem anderen)? 2) In den Math Works explanation für imsubtract() warum machen sie ihr strukturierendes Element zu einer Festplatte? Das scheint bisher ziemlich schwierig zu sein, denn jedes Mal, wenn ich etwas versuche, höre ich nicht nur den lauten Hintergrund ab, sondern verliere auch die Teile des Bildes, die ich sehen möchte!Hintergrund Subtrahieren in MATLAB

Antwort

5

Mit welcher Art von Bild arbeiten Sie?

Hintergrund Subtraktion ist einfach. Wenn Sie einen konstanten Wert oder einen Hintergrund mit derselben Größe wie Ihr Bild subtrahieren möchten, schreiben Sie einfach img = img - background. imsubtract stellt einfach sicher, dass der Ausgang Null ist, wenn der Hintergrund größer als das Bild ist.

Hintergrund Schätzung ist schwer. Dort müssen Sie wissen, welche Art von Bild Sie betrachten, andernfalls wird die Hintergrundschätzung fehlschlagen.

Wenn Sie zum Beispiel Punkt- oder Linienmerkmale, die entweder alle dunkel auf hell oder hell auf dunklem Hintergrund sind, können Sie mit einem lokalen Maximum-Filter (imdilate) oder einem lokalen Minimum-Filter (imerode) durch jeweils , das ist größer als Ihre Features, so dass, wo auch immer Sie die Filtermaske platzieren, einige Pixel den Hintergrund abdecken. Außerdem soll der Filter eine ähnliche Form wie die Features haben. Wenn Sie in Ihrem Fall einen Teil Ihres Bildes verlieren, sollten Sie versuchen, den Filter größer (aber nicht zu groß) zu machen.

Anstatt Subtraktion von Maximum oder Minimum, Subtrahieren der Median kann gut funktionieren, obwohl Sie die Filtergröße so wählen müssen, dass es in der Regel eine Mehrheit der Hintergrundpixel innerhalb der Filtermaske gibt. Leider ist die Median-Filterung eher langsam.

+0

+1 Hintergrundschätzung ist schwer! – Geoff

+0

Hintergrundsubtraktion ist ein bisschen anders als Sie vorgeschlagen haben. Der Imsubtract ist keine Hintergrundsubtraktion, noch ist das, was Sie vorgeschlagen haben. Die Hintergrundsubtraktion sollte nur Hintergrundpixel und nicht das gesamte Bild beeinflussen. Betrachten Sie einen weißen Hintergrund. Jetzt bewegt sich ein schwarzer Ball über das Bild. Die Bildsubtraktion würde das Objekt immer verdecken oder die Farbe verzerren (abhängig von der Implementierung), wohingegen die Hintergrundsubtraktion keine Pixel beeinflussen sollte, die sich ausreichend vom Hintergrundmodell (Vordergrund) unterscheiden. – Anthony

+0

@Anthony: Dies hängt sehr von der Art des Bildes ab, mit dem Sie arbeiten. Wenn die Intensitäten von Vordergrund und Hintergrund additiv sind (womit ich normalerweise arbeite), wird der Hintergrund vom gesamten Bild subtrahiert. In Ihrem Fall sollte die Hintergrundsubtraktion tatsächlich nur Nicht-Signalpixel beeinflussen. – Jonas

2

Um das Hintergrundbild zu subtrahieren, benötigen Sie ein Modell des Hintergrunds. Das einfachste Modell ist ein Bild, das zusammen mit einigen zulässigen Abweichungen (+/- 0-255) als Hintergrund erfasst wird. Dann ist die Hintergrundsubtraktion in MATLAB ziemlich einfach:

Bild (finden (abs (Bildhintergrund) < = Schwelle)) = 0;

Es wird schwieriger, wenn Sie ein statistisches Modell verwenden, aber im Wesentlichen subtrahieren den Hintergrund ist ziemlich einfach. imsubtract ist keine Hintergrundsubtraktion; Es ist ein Subtraktionsfilter, wie Sie ihn in Photoshop finden. Es ist egal, Hintergrund gegen Vordergrund, die dann den Punkt besiegt.

Da die Hintergrundsubtraktion selbst ziemlich einfach ist, wird die Frage mehr nach Hintergrundschätzung. Dies ist etwas komplizierter und erfordert im Allgemeinen mehr Frames und Training, um statistische Modelle des Hintergrunds zu erstellen (zum Beispiel, um Pixel als Gauß-Verteilungen oder Mischungen von Gaussianen zu betrachten oder stattdessen den optischen Fluss zu betrachten, um festzustellen, was sich nicht bewegt).

Wenn Sie Zugriff auf technische Artikel (über Arbeit oder Schule) haben, bietet "Pfinder: Echtzeit-Tracking des menschlichen Körpers" von Wren und anderen einen ziemlich einfachen Ansatz. Oder Sie können Google nur für einzelne Gaußsche Hintergrundsubtraktion suchen. Es gibt eine Reihe von Methoden mit OpenCV hier implementiert ->http://dparks.wikidot.com/source-code < - die Sie vielleicht nützlich finden.

2

Die Computer Vision System Toolbox hat das vision.ForegroundDetector Objekt, das eine Variante von Stauffer und Grimsons GMM-Hintergrundsubtraktion implementiert. Die Implementierung ist sehr schnell und nutzt mehrere Kerne. Sehen Sie sich example an, wie Sie die Hintergrundsubtraktion als Baustein eines Systems zum Verfolgen mehrerer Objekte verwenden können.