Opencv图像滤波原理

筅森魡賤 提交于 2019-11-29 09:38:41

高斯滤波

二维情况下的高斯滤波分布
12πσxσyexp(xu)2+(yv)22σxσy\frac{1}{2\pi \sigma_x \sigma_y} \exp { -\frac{(x-u)^2 + (y-v)^2}{2\sigma_x \sigma_y} }
不过一般情况下都是让xx方向和yy方向的方差相等
12πσ2exp(xu)2+(yv)22σ2\frac{1}{2\pi \sigma^2} \exp { -\frac{(x-u)^2 + (y-v)^2}{2\sigma^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链接.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!