图像滤波原理
高斯滤波
二维情况下的高斯滤波分布
2πσxσy1exp−2σxσy(x−u)2+(y−v)2
不过一般情况下都是让x方向和y方向的方差相等
2πσ21exp−2σ2(x−u)2+(y−v)2
先看原图
plt.imshow(img_d1)
这个颜色是因为opencv的默认格式为BGR
在opencv里调用API如下
# 这里设置方差都为0.8,你也可以让两个方向的方差不等
plt.imshow(cv.GaussianBlur(img_d1_copy, (5,5), 0.8))
原理代码
# Gaussian filter
def gaussian_filter_zp(img, K_size=5, sigma=0.8):
if len(img.shape) == 3:
H, W, C = img.shape
else:
img = np.expand_dims(img, axis=-1)
H, W, C = img.shape
## Zero padding
pad = K_size // 2
print(pad)
out = 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 Kernel
K = 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[x + pad, y + pad] = np.exp( -(x ** 2 + y ** 2) / (2 * (sigma ** 2)))
K /= (sigma * 2 * np.pi)
K /= K.sum()
print(K)
tmp = out.copy()
# filtering
for 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 = out[pad: pad + H, pad: pad + W].astype(np.uint8)
return out
上诉代码分两部分,第一部分是根据给定的K_size和方差计算内核
K_size=5, sigma=0.8情况下的内核为
[[0.00048091 0.00501119 0.01094545 0.00501119 0.00048091]
[0.00501119 0.0522178 0.11405416 0.0522178 0.00501119]
[0.01094545 0.11405416 0.2491172 0.11405416 0.01094545]
[0.00501119 0.0522178 0.11405416 0.0522178 0.00501119]
[0.00048091 0.00501119 0.01094545 0.00501119 0.00048091]]
执行代码
plt.subplot(131),plt.imshow(img_d1_copy),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(cv.GaussianBlur(img_d1_copy, (3,3), 1, 1)),plt.title('Gaussian_opencv')
plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(gaussian_filter_zp(img_d1_copy)),plt.title('gaussian_filter_zp')
plt.xticks([]), plt.yticks([])
欢迎一起来参与leetcode刷题项目
刷题的GitHub: github链接.