Opencv图像滤波原理

图像滤波原理

高斯滤波

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


先看原图

plt.imshow(img_d1)

Opencv图像滤波原理
这个颜色是因为opencv的默认格式为BGR

在opencv里调用API如下

# 这里设置方差都为0.8,你也可以让两个方向的方差不等
plt.imshow(cv.GaussianBlur(img_d1_copy, (5,5), 0.8))

Opencv图像滤波原理

原理代码

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

Opencv图像滤波原理

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

刷题的GitHub: github链接.

上一篇:图像分割——边缘检测——边缘连接的全局处理——霍夫变换(Matlab)


下一篇:根据nxp原厂uboot移植