高斯卷积的算法流程:
①对图像进行zero padding
②根据高斯滤波器的核大小和标准差大小实现高斯滤波器
③使用高斯滤波器对图像进行滤波(相乘再相加)
④输出高斯滤波后的图像
高斯卷积核公式:
ux,uy表示中心坐标,中心坐标为(0,0)
x为(-1,1),y为(-1, 1)
而卷积核初始化时坐标只能从(0,0)开始,所以要一一对应上
σ的意义及选取
通过上述的实现过程,不难发现,高斯滤波器模板的生成最重要的参数就是高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。
import cv2import numpy as np# Gaussian filterdef gaussian_filter(img, K_size=3, sigma=1.3):if len(img.shape) == 3:H, W, C = img.shapeelse:img = np.expand_dims(img, axis=-1)H, W, C = img.shape## Zero paddingpad = K_size // 2out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)## prepare KernelK = np.zeros((K_size, K_size), dtype=np.float)for x in range(-pad, -pad + K_size):for y in range(-pad, -pad + K_size):K[y + pad, x + pad] = np.exp( -(x ** 2 + y ** 2) / (2 * (sigma ** 2)))K /= (2 * np.pi * sigma * sigma)K /= K.sum()tmp = out.copy()# filteringfor y in range(H):for x in range(W):for c in range(C):out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])out = np.clip(out, 0, 255)out = out[pad: pad + H, pad: pad + W].astype(np.uint8)return out# Read imageimg = cv2.imread("../paojie.jpg")# Gaussian Filterout = gaussian_filter(img, K_size=3, sigma=1.3)# Save resultcv2.imwrite("out.jpg", out)cv2.imshow("result", out)cv2.waitKey(0)cv2.destroyAllWindows()
参考博客:
https://blog.csdn.net/Ibelievesunshine/article/details/104881204
下一篇:【专项训练】泛型递归、树的递归