Erklärung des Gaußschen Filters (Python-Implementierung)

1. Gaußscher Filter

Im Vergleich zum durchschnittlichen Filter ist das Bild glatter und der Grenzerhaltungseffekt ist besser. Der
Gaußsche Filter ist ein linearer Filter, der Rauschen effektiv unterdrücken und das Bild glätten kann. Sein Funktionsprinzip ähnelt dem des Mittelwertfilters und der Mittelwert der Pixel im Filterfenster wird als Ausgabe verwendet. Der Koeffizient der Fenstervorlage unterscheidet sich jedoch von dem des Mittelwertfilters. Der Vorlagenkoeffizient des Mittelwertfilters ist gleich 1, während der Vorlagenkoeffizient des Gaußschen Filters mit zunehmendem Abstand von der Mitte der Vorlage abnimmt. Daher verwischt der Gaußsche Filter das Bild weniger als der Mittelwertfilter.

比如下面的一块图像区域的像素值与权值矩阵的乘积(权值矩阵代表卷积核):
Fügen Sie hier eine Bildbeschreibung ein
Sie können diesen Kernel sehen: Je weiter von der Mitte von 19 entfernt, desto kleiner ist der Anteil der Koeffizienten und desto weniger unscharf wird das Bild.
Hinweis: Wenn die Wahrscheinlichkeitsdichtefunktion des Rauschens der Gaußschen Verteilung folgt, wird es Gaußsches Rauschen genannt.

Über Box-Filterung und Mittelwertfilterung:
https://mydreamambitious.blog.csdn.net/article/details/125173270


2. Erklärung der Gaußschen Funktion

(Hier werden wir über die Gaußsche Funktion und den spezifischen Anwendungsprozess der Gaußschen Funktion sprechen.)

(1) Gaußsche Funktion

GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

(2) Detaillierte Erläuterung der Parameter

(1)src:表示输入的原图像;;;; wenn sigmaY Null ist, setze es gleich sigmaX; wenn beide Sigmas Null sind, berechne aus ksize.width bzw. ksize.height Das Ergebnis der vollständigen Kontrolle, was auch immer die Semantik dieser Modifikation Zukunftder
(2)Ksize:表示卷积核(高斯核)大小(ksize(w,h),w-像素宽度,h-像素高度)in . sigmaX = 0,3 x ((ksize. width-1) x 0,5 - 1) + 0,8 sigmaY = 0,3 x ((ksize. height-1) x 0,5 - 1) + 0,8
(3)sigmaX:X方向的滤波核;表示卷积核在X方向上的标准差,控制的是权重比例
(4)sigmaY:Y方向的滤波核;表示卷积核在Y方向上的标准差,控制的是权重比例


(5)borderType:推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT.

(3) Der spezifische Implementierungsprozess der Gaußschen Funktion

Basierend auf der zweidimensionalen Gaußschen Funktion wird die Gewichtsmatrix erstellt, dann wird der Gaußsche Kernel erstellt und schließlich wird jedes Pixel gefiltert (geglättet, entrauscht). Überlegung: 1. Warum kann das Bild durch Festlegen geglättet werden
Fügen Sie hier eine Bildbeschreibung ein
? Sigmawert der Gaußschen Funktion?
Fügen Sie hier eine Bildbeschreibung ein
Erläuterung: Tatsächlich weiß jeder, dass das Bild bei μ = 0 symmetrisch zur Y-Achse ist. Wenn sich der Wert von σ ständig ändert, ändern sich auch die „Höhe und Dünnheit“ des Bildes. Wenn der Wert von σ wird größer, das Bild ist stärker gestreut („Short“); im Gegenteil, dieser ist höher; durch eine solche Änderung können wir uns die Beziehung zwischen den Werten um die Pixel unseres Bildes und der Transformation vorstellen Bild wie die Gaußsche Funktion. Verwischen Sie das Bild auf diese Weise (dies wird hier möglicherweise nicht klar erklärt)

(3) Wie implementieren SigmaX, SigmaY und Ksize hier die Faltung und filtern das Bild?

(1) Warum SigmaX und SigmaY verwenden?

Erläuterung: Da es sich bei der Gaußschen Filterung um einen linearen Filter handelt, werden zur Verarbeitung zweidimensionaler Bilder SigmaX und SigmaY verwendet, um in horizontaler bzw. vertikaler Richtung zu arbeiten. Aber in opencv verwenden Sie zuerst die folgende Funktion, um den „horizontalen“ Aufwärtsfaltungskern zu erhalten, und rufen Sie dann diese Funktion auf, um den „vertikalen“ Aufwärtsfaltungskern zu erhalten. (Tatsächlich gibt es in opencv jedoch keine spezifische Implementierung zur direkten Verwendung eines zweidimensionalen Faltungskerns, sondern durch zwei eindimensionale Faltungen.) Der
spezifische Implementierungsprozess ist wie folgt:

Mat getGaussianKernel( int ksize,         //一维垂直方向上高斯核的行数
                       double sigma,      //标准差
                       int ktype = CV_64F //返回值的数据类型
                      )

Nachdem Sie die beiden Faltungskerne erhalten haben, verwenden Sie die Funktion sepFilter2D in opencv, um eine Zeilen- und Spaltenfaltung durchzuführen: Das Endergebnis wird schrittweise verschoben und in dst gespeichert. (Das Bild unten zeigt die beiden von sigmaX und sigmaY über die Funktion getGaussianKernel generierten Faltungskerne, die jeweils einen Teil des Bildes horizontal und vertikal falten und schließlich einen Pixelwert erhalten. Der Pixelwert ist das Ergebnis der Faltung.)
Fügen Sie hier eine Bildbeschreibung ein

(2) Die spezifische Berechnung des Werts im Faltungskern (Gewichtsmatrix)

Schauen Sie sich zunächst die zweidimensionale Gaußsche Formel an: Hier sind die Zufallsvariablen X und Y unabhängig voneinander.
Informationen zur eindimensionalen Gaußschen

Fügen Sie hier eine Bildbeschreibung ein
Funktion
Fügen Sie hier eine Bildbeschreibung ein
von Formel:
wo Das Sigma wird von uns gegeben, wie werden also x und y erhalten? (Siehe Abbildung unten)

Fügen Sie hier eine Bildbeschreibung ein
Die Punkte um diese Matrix passieren
den oberen linken Punkt: (x-1,y+1)
den Scheitelpunkt: (x,y+1)
den oberen rechten Punkt: (x+1,y+1)
der rechte Scheitelpunkt: (x+ 1, y)
linker Scheitelpunkt (x-1, y)
unterer linker Scheitelpunkt: (x-1, y-1)
unterer Scheitelpunkt: (x, y-1)
unterer rechter Scheitelpunkt: (x+1 , y-1)
Bei dieser Berechnungsmethode kann der Wert des Faltungskerns über die obige Matrix berechnet werden (die Gewichtswertmatrix, das Berechnungsergebnis ist wie folgt).

Fügen Sie hier eine Bildbeschreibung ein
Hinweis: Der durch die Formel berechnete mittlere Datenwert ist der größte Wenn das Bild gefaltet wird, ist die Mitte Der Anteil des Pixelwerts ist am größten, und je größer der Abstand von der Mitte, desto kleiner ist der Gewichtsanteil. Aber was bedeutet das? Da wir berechnen, dass das Bild geglättet wird (durch Unschärfe), hängen die Pixelwerte um einen Pixelpunkt herum weitgehend zusammen. Je weiter der Abstand vom Mittelpunkt dieses Pixels entfernt ist, desto weiter entfernt ist die Beziehung zwischen den Pixeln. , Welche Beziehung besteht, wie oben erwähnt, zwischen dem eindimensionalen Gaußschen Bild, das sich mit σ ändert, und unserem geglätteten Bild? Tatsächlich wird die Gewichtsmatrix durch die Gaußsche Formel berechnet, und diese Gewichtsmatrix erfüllt dies auch als Abstand von Der Mittelpunkt des Pixels nimmt zu, je kleiner die Beziehung zwischen den Pixelwerten ist. Wenn daher σ größer wird, ist die Differenz jedes Gewichtswerts der Gewichtsmatrix nicht sehr groß, was der Durchschnittsvorlage ähnelt, und der Glättungseffekt auf das Bild ist offensichtlicher.

Zusammenfassung: Wenn Sie also in Zukunft SigmaX und SigmaY festlegen, können Sie sich über den spezifischen Prozess ihrer Arbeit im Klaren sein. Je größer das Sigma eingestellt ist, desto geringer ist der Unterschied in den Gewichten, die mit derselben 3x3-Matrix berechnet werden. Dies liegt nahe am Mittelwertfilter und der Glättungseffekt auf das Bild ist offensichtlicher (der Effekt wird anhand der folgenden Codebeispiele demonstriert).


3. Code-Kampf

import os
import cv2
import random
import numpy as np

def GaussFilter(img_path='images/lenna_GaussNoise.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(450,450))
    img=cv2.GaussianBlur(src=img,ksize=(5,5),sigmaX=0,sigmaY=1.0)
    cv2.imshow('img',img)
    cv2.imshow('img_src',img_src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')
    GaussFilter()

Fügen Sie hier eine Bildbeschreibung ein

(1) Wenn Sigma = 0,0, mit der Differenz von ksize, glatter Effekt

#无sigma的处理
def GaussFilter(img_path='images/lenna_GaussNoise.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(450,450))
    img_5x5=cv2.GaussianBlur(src=img,ksize=(5,5),sigmaX=0)
    img_11x11 = cv2.GaussianBlur(src=img, ksize=(11,11), sigmaX=0)
    img_27x27 = cv2.GaussianBlur(src=img, ksize=(27,27), sigmaX=0)
    cv2.imshow('img_src', img_src)
    cv2.imshow('img_5x5',img_5x5)
    cv2.imshow('img_10x10', img_11x11)
    cv2.imshow('img_20x20', img_27x27)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Fügen Sie hier eine Bildbeschreibung ein

(2) Wenn der Sigma-Wert nicht auf 0 eingestellt ist, nimmt der Glättungseffekt auf das Bild mit Sigma zu

def GaussFilterSigmax(img_path='images/lenna_GaussNoise.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(450,450))
    img_sigma_1=cv2.GaussianBlur(src=img,ksize=(5,5),sigmaX=1.0)
    img_sigma_5 = cv2.GaussianBlur(src=img, ksize=(11,11), sigmaX=5.0)
    img_sigma_10 = cv2.GaussianBlur(src=img, ksize=(27, 27), sigmaX=10.0)
    cv2.imshow('img_src', img_src)
    cv2.imshow('img_sigma_1',img_sigma_1)
    cv2.imshow('img_sigma_5', img_sigma_5)
    cv2.imshow('img_sigma_10', img_sigma_10)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Fügen Sie hier eine Bildbeschreibung ein
Es ist ersichtlich, dass mit zunehmendem Sigma die Glättung des Bildes deutlicher wird.

https://blog.csdn.net/jiangyutongyangyi/article/details/105281262
https://blog.csdn.net/jgj123321/article/details/94448463

Guess you like

Origin blog.csdn.net/Keep_Trying_Go/article/details/125203273