Saturday 30 September 2017

Python Moving Average Image


Hallo, das wird ein sehr einfacher Artikel, aber Sie werden es sehr hilfreich finden. Es geht um Hintergrund-Extraktion aus einem Video. Angenommen, Sie sind Video von Footage von Verkehr gegeben, kann eine Sache wie diese sein. Verkehr in Indien. Und Sie werden gebeten, einen ungefähren Hintergrund zu finden. Oder so etwas. Hintergrund-Extraktion kommt wichtig in der Objektverfolgung. Wenn Sie bereits ein Bild von der nackten Hintergrund, dann ist es einfach. Aber in vielen Fällen haben Sie nicht ein solches Bild und so, müssen Sie eine zu erstellen. Das ist, wo Running Average kommt praktisch. (Ich dachte darüber nach, wenn ein Mann eine Frage in SOF gefragt hat.) Die Funktion, die wir hier verwenden, um Running Average zu finden, ist cv2.accumulateWeighted (). Wenn wir z. B. ein Video anschauen, halten wir jedes Einzelbild an diese Funktion weiter, und die Funktion hält die Mittelwerte aller Frames, die ihr nach der folgenden Beziehung zugeführt werden, fest: src ist nichts anderes als unser Quellbild. Es kann Graustufen - oder Farbbild und entweder 8-Bit - oder 32-Bit-Gleitkomma sein. Dst ist das Ausgabe - oder Akkumulatorbild mit denselben Kanälen wie das Quellbild und es ist entweder ein 32-Bit - oder ein 64-Bit-Gleitpunkt. Außerdem sollten wir es zuerst auf einen Wert deklarieren, der als Anfangswert genommen wird. Alpha ist das Gewicht des eingegebenen Bildes. Laut Docs regelt alpha die Aktualisierungsgeschwindigkeit (wie schnell der Akkumulator 8220forgets8221 um frühere Bilder handelt). In einfachen Worten, wenn Alpha ein höherer Wert ist, versucht das durchschnittliche Bild auch sehr schnelle und kurze Änderungen in den Daten zu erfassen. Wenn es niedriger Wert ist, wird der Durchschnitt träge und es wird nicht betrachten schnelle Änderungen in den Eingabebildern. Ich werde es ein wenig mit Hilfe von Bildern am Ende des Artikels erklären. In oben Code habe ich zwei Mittelwerte gesetzt, eine mit höheren Alpha-Wert und eine andere mit niedrigeren Alpha-Wert, so können Sie verstehen, Wirkung von Alpha. Zuerst werden beide auf den Anfangsrahmen des Captures gesetzt. Und in Schleife erhalten sie aktualisiert. Sie können einige Resultate in der SOF Verbindung sehen, die ich bereits zur Verfügung stellte. (Ich habe die Ergebnisse hier, können Sie den Code und Alpha-Wert dort): Ich habe meine Webcam und gespeichert Original-Frame und laufenden Durchschnitt zu einem bestimmten Zeitpunkt. Dieses ist ein Rahmen von einem typischen Verkehrsvideo, das von einer stationären Kamera genommen wird. Wie Sie sehen können, geht ein Auto auf die Straße, und die Person versucht, die Straße zu einem bestimmten Zeitpunkt zu überqueren. Aber sehen Sie den laufenden Durchschnitt zu diesem Zeitpunkt. Es gibt keine Person und Auto in diesem Bild (Eigentlich ist es da, haben einen engen Blick, dann werden Sie es sehen, und die Person ist klarer als Auto, da Auto bewegt sich sehr schnell und über das Bild, es hat nicht viel Effekt auf Durchschnitt, aber Person ist dort für eine lange Zeit, da er langsam und bewegt über die Straße ist.) Jetzt müssen wir die Wirkung von Alpha auf diesen Bildern zu sehen. Smoothing Bilder Erfahren Sie: Blur imagess mit verschiedenen Tiefpassfilter Apply (2D-Faltung) 2D-Faltung (Bildfilterung) Wie für eindimensionale Signale können Bilder auch mit verschiedenen Tiefpassfiltern (LPF), Hochpassfiltern (HPF) usw. gefiltert werden. Ein LPF Hilft beim Entfernen von Rauschen oder Verwischen des Bildes. Ein HPF-Filter hilft beim Finden von Kanten in einem Bild. OpenCV bietet eine Funktion, cv2.filter2D (). Einen Kern mit einem Bild falten. Als Beispiel werden wir versuchen, eine Mittelung Filter auf ein Bild. Ein 5x5-Mittelungsfilterkern kann wie folgt definiert werden: Beim Filtern mit dem obigen Kernel wird folgendes ausgeführt: Für jedes Pixel wird ein 5x5-Fenster auf dieses Pixel zentriert, alle Pixel, die in dieses Fenster fallen, werden zusammengefasst und das Ergebnis ist Dann dividiert durch 25. Dies entspricht der Berechnung des Mittelwerts der Pixelwerte innerhalb dieses Fensters. Dieser Vorgang wird für alle Pixel in dem Bild durchgeführt, um das ausgegebene gefilterte Bild zu erzeugen. Versuchen Sie diesen Code und überprüfen Sie das Ergebnis: Image Blurring (Image Smoothing) Image blurring wird durch Falten des Bildes mit einem Tiefpassfilter Kernel erreicht. Es ist nützlich, um Rauschen zu entfernen. Es entfernt tatsächlich hochfrequenten Inhalt (z. B. Rauschen, Kanten) aus dem Bild, was dazu führt, dass Kanten verwischt werden, wenn dieses Filter angewendet wird. (Nun, es gibt verwischen Techniken, die nicht verwischen Kanten). OpenCV bietet hauptsächlich vier Arten von Unschärfetechniken. 1. Mittelwertbildung Dies geschieht durch Falten des Bildes mit einem normalisierten Kastenfilter. Es nimmt einfach den Durchschnitt aller Pixel unter Kernelbereich und ersetzt das zentrale Element durch diesen Durchschnitt. Dies geschieht durch die Funktion cv2.blur () oder cv2.boxFilter (). Überprüfen Sie die docs für weitere Details über den Kernel. Wir sollten die Breite und Höhe des Kernels angeben. Ein normaler 3x3-Box-Filter würde wie folgt aussehen: Wenn Sie don8217t einen normalisierten Box-Filter verwenden möchten, verwenden Sie cv2.boxFilter () und übergeben Sie das Argument normalizeFalse an die Funktion. Überprüfen Sie die Beispiel-Demo unten mit einem Kernel der Größe 5x5: 2. Gaußsche Filterung In diesem Ansatz wird anstelle eines Boxfilters, der aus gleichen Filterkoeffizienten besteht, ein Gaußscher Kern verwendet. Dies geschieht mit der Funktion cv2.GaussianBlur (). Wir sollten die Breite und Höhe des Kernels angeben, die positiv und ungerade sein sollte. Wir sollten auch die Standardabweichung in den X - und Y-Richtungen sigmaX bzw. sigmaY angeben. Wenn nur sigmaX angegeben ist, wird sigmaY gleich sigmaX genommen. Wenn beide als Nullen angegeben sind, werden sie aus der Kernelgröße berechnet. Die Gaußsche Filterung ist sehr wirksam beim Entfernen von Gaußschen Rauschen aus dem Bild. Wenn Sie möchten, können Sie einen Gaußschen Kernel mit der Funktion cv2.getGaussianKernel () erstellen. Der obige Code kann für Gaußsche Unschärfe modifiziert werden: 3. Median Filtering Hier berechnet die Funktion cv2.medianBlur () den Median aller Pixel unter dem Kernelfenster und das zentrale Pixel wird durch diesen Medianwert ersetzt. Dies ist sehr effektiv bei der Beseitigung von Salz-und-Pfeffer-Rauschen. Eine interessante Sache ist, dass in den Gauß - und Kastenfiltern der gefilterte Wert für das zentrale Element ein Wert sein kann, der in dem ursprünglichen Bild nicht existieren kann. Dies ist jedoch bei der Medianfilterung nicht der Fall, da das zentrale Element immer durch einen Pixelwert im Bild ersetzt wird. Das reduziert den Lärm effektiv. Die Kernelgröße muss eine positive ungerade ganze Zahl sein. In dieser Demo fügen wir ein 50-Rauschen zu unserem Originalbild hinzu und verwenden einen Medianfilter. Überprüfen Sie das Ergebnis: 4. Bilaterales Filtern Wie wir festgestellt haben, tendieren die Filter, die wir früher präsentierten, dazu, Kanten zu verwischen. Dies ist bei dem bilateralen Filter cv2.bilateralFilter () nicht der Fall. Die definiert wurde, und ist sehr effektiv bei der Entfernung von Rauschen unter Beibehaltung Kanten. Aber der Betrieb ist im Vergleich zu anderen Filtern langsamer. Wir haben bereits gesehen, dass ein Gaußscher Filter die Umgebung um das Pixel nimmt und seinen Gauß-gewichteten Durchschnitt findet. Dieser Gaußsche Filter ist eine Funktion des Raumes allein, das heißt, daß benachbarte Pixel bei der Filterung berücksichtigt werden. Es prüft nicht, ob Pixel nahezu denselben Intensitätswert haben und nicht berücksichtigt, ob das Pixel auf einer Kante liegt oder nicht. Der resultierende Effekt besteht darin, dass Gaußsche Filter dazu neigen, Kanten zu verwischen, was unerwünscht ist. Der bilaterale Filter verwendet auch einen Gaußschen Filter in der Raumdomäne, aber er verwendet auch eine weitere (multiplikative) Gaußsche Filterkomponente, die eine Funktion von Pixelintensitätsunterschieden ist. Die Gaußsche Funktion des Raumes stellt sicher, daß nur Pixel 8216 Ortsnachbarn8217 für die Filterung in Betracht gezogen werden, während die im Intensitätsbereich angewandte Gaußsche Komponente (eine Gaußsche Funktion von Intensitätsdifferenzen) sicherstellt, daß nur diejenigen Pixel mit Intensitäten ähnlich derjenigen des zentralen Pixels 8216intensity neighbors8217) enthalten sind, um den verschwommenen Intensitätswert zu berechnen. Infolgedessen bewahrt dieses Verfahren Kanten, da für Pixel, die in der Nähe von Kanten liegen, benachbarte Pixel, die auf der anderen Seite der Kante platziert sind und daher große Intensitätsschwankungen im Vergleich zu dem zentralen Pixel aufweisen, nicht zur Verwischung eingeschlossen werden. Das folgende Beispiel zeigt die Verwendung der bilateralen Filterung (Details zu den Argumenten finden Sie in den OpenCV-Dokumenten). Beachten Sie, dass die Textur auf der Oberfläche verschwunden ist, aber die Kanten bleiben erhalten.

No comments:

Post a Comment