Salut, je suis Ramu. Cette fois, nous allons implémenter un filtre gaussien qui supprime le bruit dans l'image.
Le filtre gaussien est un filtre qui lisse l'image. En appliquant ce filtre, vous pouvez rendre l'image entière floue.
Dans ce filtre, les pixels périphériques du pixel d'intérêt sont pondérés par la distribution gaussienne, et plus le pixel central du filtre est proche, plus le poids est important. La pondération par distribution gaussienne est définie comme suit.
g(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}
Par exemple, les filtres suivants sont souvent utilisés pour les filtres gaussiens 3x3 et 5x5. Probablement, si vous spécifiez environ $ σ = 0,85 $ pour l'argument s, ce sera cette valeur.
En supposant que le pixel d'intérêt est le centre, la somme des produits des pixels périphériques et des valeurs de filtre correspondantes doit être remplacée par le pixel d'intérêt. Pour un filtre 3 × 3, $ I (x_0, y_0) × \ frac {1} {16} + I (x_0, y_1) × \ frac {2} {16} + ... I (x_2, y_2) × Remplacez la valeur de \ frac {1} {16} $ par le pixel d'intérêt.
De plus, comme le bord de l'image ne peut pas être filtré, 0 est utilisé pour les pixels inexistants. C'est ce qu'on appelle le remplissage 0.
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 processus de remplissage
_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()
#Création de filtres
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()
#Processus de filtrage
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
#Lecture d'image
img = cv2.imread('image.jpg')
#Filtre gaussien
#2ème argument: taille du filtre, 3ème argument: écart type(σ)
img = gaussianFilter(img,21,2)
#Enregistrer l'image
cv2.imwrite('result.jpg', img)
#Affichage de l'image
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
L'image de gauche est l'image d'entrée et l'image de droite est l'image de sortie. Vous pouvez voir que le bruit ponctué est réduit.
Si vous avez des questions, n'hésitez pas à nous contacter. [Github] de imori_imori (https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_01_10/answers_py/answer_6.py) a la réponse officielle, veuillez donc vérifier cela également. .. De plus, comme python est un débutant, veuillez signaler toute erreur.
Recommended Posts