Hallo, ich bin Ramu. Dieses Mal werden wir einen Gaußschen Filter implementieren, der Rauschen im Bild entfernt.
Der Gaußsche Filter ist ein Filter, der das Bild glättet. Durch Anwenden dieses Filters können Sie das gesamte Bild verschwommen erscheinen lassen.
In diesem Filter werden die peripheren Pixel des interessierenden Pixels durch die Gaußsche Verteilung gewichtet, und je näher am mittleren Pixel des Filters liegt, desto größer ist das Gewicht. Die Gewichtung nach Gaußscher Verteilung ist wie folgt definiert.
g(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}
Beispielsweise werden die folgenden Filter häufig für 3x3- und 5x5-Gauß-Filter verwendet. Wenn Sie für das Argument s etwa $ σ = 0,85 $ angeben, ist dies wahrscheinlich dieser Wert.
Unter der Annahme, dass das interessierende Pixel das Zentrum ist, sollte das interessierende Pixel durch die Summe der Produkte der peripheren Pixel und der entsprechenden Filterwerte ersetzt werden. Für einen 3 × 3-Filter ist $ I (x_0, y_0) × \ frac {1} {16} + I (x_0, y_1) × \ frac {2} {16} + ... I (x_2, y_2) × Ersetzen Sie das interessierende Pixel durch den Wert \ frac {1} {16} $.
Da die Bildkante nicht gefiltert werden kann, wird 0 für nicht vorhandene Pixel verwendet. Dies wird als 0-Auffüllung bezeichnet.
gaussianFilter.py
import numpy as np
import cv2
import matplotlib.pyplot as plt
def gaussianFilter(img,k,s):
w,h,c = img.shape
size = k // 2
#0 Auffüllvorgang
_img = np.zeros((w+2*size,h+2*size,c), dtype=np.uint8)
_img[size:size+w,size:size+h] = img.copy().astype(np.uint8)
dst = _img.copy()
#Filtererstellung
ker = np.zeros((k,k), dtype=np.float)
for x in range(-1*size,k-size):
for y in range(-1*size,k-size):
ker[x+size,y+size] = (1/(2*np.pi*(s**2)))*np.exp(-1*(x**2+y**2)/(2*(s**2)))
ker /= ker.sum()
#Filterprozess
for x in range(w):
for y in range(h):
for z in range(c):
dst[x+size,y+size,z] = np.sum(ker*_img[x:x+k,y:y+k,z])
dst = dst[size:size+w,size:size+h].astype(np.uint8)
return dst
#Bild lesen
img = cv2.imread('image.jpg')
#Gaußscher Filter
#2. Argument: Filtergröße, 3. Argument: Standardabweichung(σ)
img = gaussianFilter(img,21,2)
#Bild speichern
cv2.imwrite('result.jpg', img)
#Bildschirm
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
Das Bild links ist das Eingabebild und das Bild rechts ist das Ausgabebild. Sie können sehen, dass das punktuelle Geräusch reduziert wird.
Wenn Sie Fragen haben, können Sie sich gerne an uns wenden. imori_imoris Github hat die offizielle Antwort. Bitte überprüfen Sie dies ebenfalls. .. Da Python ein Anfänger ist, weisen Sie bitte auf Fehler hin.
Recommended Posts