(2D-Faltung) 2D-Faltung (Bildfilterung) Wie bei eindimensionalen Signalen können Bilder auch mit verschiedenen Tiefpaßfiltern (LPF) gefiltert werden, , Hochpassfilter (HPF), etc. 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: Durch das 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 möglicherweise nicht in dem Originalbild vorhanden ist. 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, daß 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 gegangen ist, aber Kanten noch bewahrt werden. Immer noch Hacking zusammen ein Buch Scannen Skript, und fürs Erste, alles was ich brauche ist in der Lage sein, automatisch zu erkennen, eine Seite zu drehen. Das Buch füllt 90 des Schirmes (Im using eine cruddy Webcam für die Bewegungsabfragung), also, wenn ich eine Seite drehe, ist die Bewegungsrichtung grundsätzlich in der gleichen Richtung. Ich habe ein Motion-Tracking-Skript, aber Derivate sind immer mich nirgendwo: Es erkennt die durchschnittliche Bewegung der durchschnittlichen Mitte aller Boxen, die extrem ineffizient ist. Wie würde ich über Erkennung solcher Bewegungen schnell und genau (d. H. Innerhalb einer Schwelle) Im mit Python zu gehen, und ich beabsichtige, mit ihm zu bleiben, wie mein ganzes Framework auf Python basiert. Und Hilfe wird geschätzt, so vielen Dank im Voraus. Prost.
No comments:
Post a Comment