Opencv图像滤波原理

匿名 (未验证) 提交于 2019-12-03 00:03:02

高斯滤波

二维情况下的高斯滤波分布
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]] 

第二部分是一个卷积的操作,应该叫相关相关操作之前先把图像翻转180o180^o就是卷积了
如果你嫌麻烦,opencv有卷积的API

# 这个K就是上面计算出来的高斯核 Gaussian_k = K.copy() plt.imshow(cv.filter2D(img_d1_copy, -1, Gaussian_k)) 


执行代码

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([]) 

中值滤波

中值滤波和均值滤波都很简单

原理

在图像上给出一个核的大小,计算一个核内的全部像素值,然后把核中心的像素替换为整个核内像素的中值

Opencv_API

plt.imshow(cv.medianBlur(img_d1_copy, 5)) 

欢迎一起来参与leetcode刷题项目

刷题的GitHub: github链接.

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