文章目录
- 参考依据
- 目标
- 二维卷积(图像滤波)
- 图像模糊(图像平滑)
- 1. 平均滤波
- 2. 高斯滤波
- 3. 中值滤波
- 4. 双边滤波
目标
- 使用各种低通滤波器进行图像模糊
- 在图像上使用自定义滤波器(2D卷积)
二维卷积(图像滤波)
对于2D图像,我们可以使用低通滤波器或者高通滤波器进行滤波,低通滤波器通常用来去除噪声、模糊图像,高通滤波器用来检测边缘。OpenCV提供一个函数接口cv2.filter2D()来实现卷积的功能,(https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=filter#cv2.filter2D)。
例如使用filter2D()来实现一个平均滤波,它的卷积核大小为5x5,即:
img = cv2.imread('UESTC.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones([5,5], dtype=np.float32)/25
dst = cv2.filter2D(img, -1, kernel)
plt.subplot(1,2,1), plt.imshow(img)
plt.subplot(1,2,2), plt.imshow(dst)
plt.show()
图像模糊(图像平滑)
通常是经过低通滤波器来达到图像模糊的效果的,它能有效去除噪声,移除高频信号干扰。
1. 平均滤波
这个在上一个模块已经提到过了,就是获取卷积核区域内所有像素的平均值,并用平均值替换中心元素。可以直接通过cv2.blur()和cv2.boxFilter()来实现,这比cv2.filter2D()方便之处在于不用自己构造kernel,而是直接指定卷积核的长宽即可。
img = cv2.imread('UESTC.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.blur(img, (5,5))
plt.subplot(1,2,1), plt.imshow(img)
plt.subplot(1,2,2), plt.imshow(dst)
plt.show()
2. 高斯滤波
高斯滤波应该是最常用的一种低通滤波方式,OpenCV通过cv2.GaussianBlur()来提供高斯滤波。需要注意的是,高斯滤波器的长宽必须为正奇数。同时,我们还需要指定X方向和Y方向的标准差,如果只指定一个SigmaX一个值,那么SigmaY会等于SigmaY,如果不指定,则会根据Kernel大小自动计算。
高斯滤波有助于去除图像中的高斯噪声。
img = cv2.imread('UESTC.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.GaussianBlur(img, (5,5), 0)
plt.subplot(1,2,1), plt.imshow(img)
plt.subplot(1,2,2), plt.imshow(dst)
plt.show()
3. 中值滤波
OpenCV通过cv2.MedianBlur()来提供中值滤波,用窗口内的中位值来代替中间元素值,同样kernel的大小必须为正的奇数。中值滤波对于椒盐噪声的移除很有效。
dst = cv2.MedianBlur(img, 5)
P.S. 上图来自参考链接
4. 双边滤波
之前介绍的几种滤波其实都会影响到图像边缘,比如高斯滤波,它考虑周围像素空间的值,然后进行高斯加权计算,它并没有考虑当前像素是否位于图像边缘。如果我们期望在消除噪声的同时保留图像的边缘信息,可以使用双边滤波,cv2.bilateralFilter()。
双边滤波能够做到这种效果的大致原因为:双边滤波在同时使用空间域高斯权重和灰度值相似性高斯权重:空间高斯函数确保只有邻近区的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算,因此边界处的灰度值变化比较大。
详细参数请参考:https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?#gaussianblur
dst = cv2. BilateralFilter(img, 9, 75, 75)
可以看到,使用双边滤波之后,物体中央的纹理不见了,但是边缘信息仍会保留。