高斯滤波:是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。
高斯核计算方式:
公式中前一部分常数可以忽略不计,因为最后都是要进行归一化的。
python代码如下
import cv2 import numpy as np class Gaussian: def __init__(self, source_img, k, sigma): self.source_img = cv2.imread(source_img) self.k = k self.sigma = sigma def Gaussian_Filter(self): if len(self.source_img.shape) == 3: hight, width, coner = self.source_img.shape else: self.source_img = np.expand_dims(self.source_img, axis=-1) hight, width, coner = self.source_img.shape #图像填充 edge = self.k // 2 out_img = np.zeros((hight + edge * 2, width + edge*2, coner),dtype=np.float) out_img[edge:edge+hight, edge:edge + width] = self.source_img.copy().astype(np.float) #卷积核计算 kenerl = np.zeros((self.k, self.k), dtype=np.float) for x in range(-edge, -edge + self.k): for y in range(-edge, -edge + self.k): kenerl[y + edge, x + edge] = np.exp(-((x - edge -1)**2) + ((y - edge -1)**2)) / (2 * self.sigma**2) kenerl /= kenerl.sum() #归一化 #滤波 tmp = out_img.copy() for y in range(hight): for x in range(width): for c in range(coner): out_img[edge + y, edge + x, c]= np.sum(kenerl * tmp[ y:y + self.k, x: x + self.k, c] ) out_img = np.clip(out_img, 0, 255) out_img =out_img[edge:edge+hight, edge:edge+width].astype(np.uint8) cv2.imwrite('gauss.jpg', out_img) if __name__=="__main__": img = './example.jpg' #滤波的图片 k = 5 #卷积核的大小 sigma = 1.6 #方差 gauss = Gaussian(img, k, sigma) gauss.Gaussian_Filter()