OpenCV 图像模糊化, 去噪音

一. 图像求卷积

“ 卷积 ” 计算,可以理解为每一个像素取周边像素的 “加权求和” 值,OpenCV 使用函数 cv2.filter2D 对图片进行卷积计算。

“ 加权求和 ” 在数值上来说,是一种“ 平滑化 ”,在图形上来说,相当于产生 “ 模糊 ” 效果。

OpenCV 中对卷积的使用一部分就体现在对图像进行模糊化处理中。



二. 图像模糊化

OpenCV 常用四种方法来实现图片模糊化处理:


1. 均值化 ( Gaussian Filtering )

均值化可以理解为每一个像素都取周边像素的平均值,OpenCV 中使用函数 cv2.blur 来对图像进行均值化处理,使用不同周边半径的代码如下 :


import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("zgf.jpg", cv2.IMREAD_COLOR)
b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])
dst1 = cv2.blur(img, (4, 4))
dst2 = cv2.blur(img, (8, 8))

plt.subplot(311), plt.imshow(img), plt.title("original")
plt.xticks([]), plt.yticks([])
plt.subplot(312), plt.imshow(dst1), plt.title("average_4")
plt.xticks([]), plt.yticks([])
plt.subplot(313), plt.imshow(dst2), plt.title("average_8")
plt.xticks([]), plt.yticks([])
plt.show()



运行代码,生成图像如下 : 


可见,周边半径越大,“模糊”效果越强烈。


2. 高斯滤波 ( Gaussian Filtering )

“均值化模糊” 中,每个像素点取周围像素的平均值,不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此相对于均值化平均,加权平均显得更合理,距离越近的点权重越大,距离越远的点权重越小,正态分布显然是一种可取的权重分配方式。


正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。正态分布也称为高斯分布。由于图像是二维的,所以我们对图片进行周边区域处理时候,用到的是二维正态分布。


OpenCV 使用函数 cv2.GaussianBlur 来对图像进行 “高斯过滤模糊” 处理,我们在代码中对比 “均值化模糊” 如下 :


import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("miao.jpg", cv2.IMREAD_COLOR)
b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])
dst1 = cv2.blur(img, (5, 5))
dst2 = cv2.GaussianBlur(img, (5, 5), 0)

plt.subplot(131), plt.imshow(img), plt.title("original")
plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(dst1), plt.title("average_5")
plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(dst2), plt.title("gaussian_5")
plt.xticks([]), plt.yticks([])
plt.show()



运行代码,输出图像如下:

由输出图片可以看到,均值化模糊给人一种 “ 全盘模糊,没有主次 ” 的感觉,高斯过滤模糊则相对显得更加“智能” 。

相对于 “ 均值化滤波 ”,“ 高斯滤波 ” 更能体现出图片中 “ 邻近像素点之间关系更加密切 ” 这个概念。


3. 中值滤波 ( Median Filtering )

中值滤波也是为了减少噪音,中值滤波计算出卷积核窗口内所有像素值的中值,作为卷积核窗口中心像素的新值。

和其他滤波相比,主要有以下不同 : 

1. 同均值滤波相比,中值滤波能够保留更多的细节

2. 均值滤波和高斯滤波中,滤波后卷积核中心像素的新值很有可能在原图中不存在,由中值滤波的定义,滤波后卷积核中心像素的新值在原图中肯定存在

3. 中值滤波更适合应对椒盐噪音 ( salt-and-pepper ) 这种频繁大颗粒噪音


OpenCV 使用函数 cv2.medianBlur( ) 来实现中值滤波,代码如下

median = cv2.medianBlur(img,5)


椒盐噪音如下图左,中值滤波效果如下图右 :




4. 双边滤波 ( Bilateral Filtering )

同高斯滤波相比,双边滤波更注重保持边缘原状,使用双边滤波的代码为 :

blur = cv2.bilateralFilter(img,9,75,75)

左图经过双边滤波成为右图,表面的纹理消失了,但是边缘处被保留了。




猜你喜欢

转载自blog.csdn.net/jiangmengya1/article/details/78628006