Kapitel 3 – OpenCV-Grundlagen – 6 – Filterverarbeitung

Inhalt vorne

Wenn die Originalinformationen des Bildes so weit wie möglich beibehalten werden, wird der Prozess des Herausfilterns des Rauschens im Bild zum Glättungsprozess des Bildes (auch als Filterprozess bezeichnet) und das erhaltene Bild wird zu einem glatten Bild ( das Rauschen im Bild herausfiltert und so ein relativ glattes Bild erzeugt).

Nehmen Sie eine Kastanie:

Ein Bild hat einen Rauschpunkt. Nach dem Laden wird festgestellt, dass sich der Pixelwert eines Punkts zu stark von den umgebenden Pixelwerten unterscheidet. Verwenden Sie die umgebenden Pixelpunkte, um im Durchschnitt einen neuen Wert zu generieren und erneut anzuzeigen. Das Rauschen verschwindet und Die Seite ist glatt.

Das Grundprinzip der Bildglättungsverarbeitung besteht darin, den Pixelwert des Pixels, in dem sich das Rauschen befindet, gemäß einer bestimmten Methode in den ungefähren Wert der umgebenden benachbarten Pixel zu verarbeiten. Das Buch stellt Methoden wie Mittelwertfilterung, Gaußsche Filterung und Median vor Filterung.

Darüber hinaus geht die Bildglättung normalerweise mit einer Bildunschärfe einher, weshalb die Glättung manchmal auch als Bildunschärfe bezeichnet wird.

meine Filterung

Grundprinzip: Mittelwertfilterung bezieht sich auf das Ersetzen des aktuellen Pixelwerts durch den Durchschnittswert von N * N Pixelwerten um den aktuellen Pixelpunkt. Es ist notwendig, jedes Pixel im Bild zu durchlaufen und zu verarbeiten.

Wenn sich das Pixel in der Mitte befindet, kann der Durchschnitt von 9 Pixeln im 3x3-Bereich berechnet werden, und der Durchschnitt von 25 Pixeln im 5x5-Bereich kann ebenfalls berechnet werden. Für die Randpunkte des Bildes können wir nur den Pixeldurchschnittswert der im Bild vorhandenen Punkte im umgebenden Bereich verwenden.

Für den Bereich 5x5 lautet die Berechnung wie folgt:

Das heißt, die Filterung jedes Pixels wird mit einer 5x5-Matrix multipliziert, deren interner Wert 1/25 beträgt, um das Berechnungsergebnis der Mittelwertfilterung zu erhalten.

Nach der Vereinfachung kann folgendes Ergebnis entstehen:

In OpenCV wird die Matrix auf der rechten Seite der obigen Abbildung als Faltungskern bezeichnet (dieser Faltungskern ist zu wichtig, solange die Bilder einzeln analysiert werden). Die allgemeine Form lautet wie folgt:

Unter diesen entsprechen M und N der Höhe bzw. Breite der Matrix, und im Allgemeinen sind M und N gleich. Je größer der Wert von M und N ist, desto mehr Pixel sind an der Operation beteiligt, und das Berechnungsergebnis des aktuellen Pixels wird durch mehr umgebende Punkte beeinflusst.

Funktionssyntax: dst = cv2.blur( src , ksize , Anchor , borderType )

  • dst: Das nach der Mittelwertfilterung erhaltene Verarbeitungsergebnis
  • src: Originalbild
  • ksize: Die Größe des Filterkerns, die dem oben genannten Wert von M und N entspricht
  • Anker: Ankerpunkt, der Standardwert ist (-1, -1), was bedeutet, dass sich der Pixelpunkt zur Berechnung des Mittelwerts in der Mitte des Filterkerns befindet und der Standardwert in Ordnung ist.
  • borderType: Rahmenstil, der bestimmt, wie der Rahmen verarbeitet wird. Der Rahmenstil unterscheidet sich je nach Füllwert. Der Füllwert kann 0/255/Kantenwert/spezifischer Wert sein und der Standardwert kann direkt verwendet werden.

Daher kann die mittlere Filterfunktion vereinfacht werden als dst = cv2.blur( src ,ksize )

Beschreibung der Kastanie:

import cv2 as cv

lena_noise = cv.imread("lenaNoise.png")
lena_3x3 = cv.blur(lena_noise, (3, 3))  # 滤波核越小,图像噪点越清晰,但图片越清晰
lena_7x7 = cv.blur(lena_noise, (17, 17))  # 滤波核越大,图像越模糊
cv.imshow("lena noise", lena_noise)
cv.imshow("lena 3x3", lena_3x3)
cv.imshow("lena 7x7", lena_7x7)

cv.waitKey()
cv.destroyAllWindows()

Der Effekt ist wie folgt (Originalbild, 3x3, 7x7 in Folge):

Gaußscher Filter

Prinzip: Bei der Mittelwertfilterung ist das Gewicht jedes Pixels in der Berechnungsmatrix gleich. Bei der Gaußschen Filterung wird das Gewicht benachbarter Pixel erhöht und das Gewicht von Pixeln weit entfernt von der Mitte verringert.

Je nach Größe des Filterkerns gibt es im Allgemeinen 3x3, 5x5, 7x7 und die Gewichtsverteilung ist wie folgt:

Hier nehmen wir den 3x3-Faltungskern als Beispiel.

Die eigentliche Berechnung lautet:

Die Summe jedes Punktes innerhalb des Matrixbereichs multipliziert mit dem Gewichtsverhältnis jedes Punktes ist der neue Wert nach der Gaußschen Filterung.

Darüber hinaus kann der Anteil derselben Position innerhalb des Filterkerns bei gleicher Größe unterschiedlich sein. Unabhängig davon, ob das Gewicht des Filterkerns eine Ganzzahl oder eine Dezimalzahl ist, spiegelt es den Anteil wider.

Funktionssyntax: dst = cv2.GaussianBlur( src , ksize , sigmaX , sigmaY , borderType )

  • dst und src sind das Ausgabebild bzw. das ursprüngliche Eingabebild
  • ksize: Größe, Breite und Höhe des Filterkerns müssen ungerade sein
  • sigmaX: Die Standardabweichung des Filterkerns in horizontaler Richtung, die das Gewichtsverhältnis steuert. Dieser Parameter ist erforderlich
  • sigmaY: Die Standardabweichung des Filterkerns in vertikaler Richtung. Wenn der Wert 0 ist, wird nur SigmaX verwendet.
  • borderType: Rahmenstil, Umgang mit dem Rahmen, der Standardwert ist in Ordnung

Je größer das Sigma, desto gleichmäßiger ist die Verteilung der Gewichtswerte. Je größer der Einfluss der Nachbarschaftspunkte auf den Ausgabewert ist, desto unschärfer ist das Bild. Je kleiner das Sigma, desto steiler ist die Verteilung der Gewichtswerte. Je geringer der Einfluss der Nachbarschaftspunkte auf den Ausgabewert ist, desto geringer ist die Bildveränderung.

Das offizielle Dokument schlägt die Angabe von ksize, sigmaX und sigmaY vor. Sie können sigmaX und sigmaY als Standardwert 0 angeben, daher ist die übliche Form:

dst = cv2.GaussianBlur( src , ksize ,0 , 0 )

Beschreibung der Kastanie:

import cv2 as cv

lena_noise = cv.imread("lenaNoise.png")
ksize = 3 #滤波核长宽
lena_0 = cv.GaussianBlur(lena_noise, (ksize, ksize), 0, 0)  # sigmaY=sigmaY=0
lena_05 = cv.GaussianBlur(lena_noise, (ksize, ksize), 0.5, 0.5)  # sigmaY=sigmaY=0.5
lena_1 = cv.GaussianBlur(lena_noise, (ksize, ksize), 1, 1)  # sigmaY=sigmaY=1
cv.imshow("lena noise", lena_noise)
cv.imshow("lena_0", lena_0)
cv.imshow("lena_05", lena_05)
cv.imshow("lena_1", lena_1)

cv.waitKey()
cv.destroyAllWindows()

Medianfilter

Grundprinzip: Der Medianfilter nimmt die Pixelwerte des aktuellen Pixels und der umgebenden Pixel, sortiert sie und verwendet dann den Medianwert als Pixelwert des Pixels.

Nach dem Sortieren der Pixel und der umgebenden Pixel sind sie [66, 78, 90, 91, 93, 94, 95, 97, 101] und ersetzen den Mittelwert 93 durch 78 des aktuellen Pixels.

Funktionssyntax: dst = cv2.medianBlur( src , ksize)

ksize: Die Breite und Höhe des Filterkerns muss eine Basis größer als 1 sein

Beschreibung der Kastanie:

import cv2 as cv

lena_noise = cv.imread("lenaNoise.png")
lena_0 = cv.medianBlur(lena_noise, 3)  # 滤波核的长宽为3
cv.imshow("lena noise", lena_noise)
cv.imshow("lena_medianBlur", lena_0)

cv.waitKey()
cv.destroyAllWindows()

Zusammenfassung: Durch die Kombination der Berechnungsalgorithmen und der tatsächlichen Auswirkungen verschiedener Glättungsvorgänge ist der Effekt der Medianfilterung besser, erfordert jedoch mehr Sortiervorgänge.

Je suppose que tu aimes

Origine blog.csdn.net/sunguanyong/article/details/129248194
conseillé
Classement