使用低通滤波器可以达到图像平滑的目的。图像平滑可以去除图像中的噪声、边界等高频成分。在图像处理中可以去除图像细节,将像素点与周围的像素点混合,在边缘检测方面很有作用。OpenCV提供了四种模糊技术。常用的平滑方法有均值、高斯、中值、双边。
(1)均值平滑。平滑滤波是由一个归一化卷积框完成的,具体来说是用卷积核计算对应区域内所有像素的平均值来代替中心元素,可以使用函数cv2.blur()实现,在函数中需要设定卷积核的宽和高。下面是一个5×5的归一化卷积核,其大小也可以称为感受野:
利用cv2.blur()函数对opencv_logo图像进行5×5均值平滑,示例代码和效果如下(图3-13):
图3-13 均值平滑效果对比图
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('opencv_logo.png')
blur=cv2.blur(img,(5,5))
plt. subplot(121),plt.imshow(img),plt.title('Original')
plt. xticks([]),plt.yticks([])
plt. subplot(122),plt.imshow(blur),plt.title('Blurred')
plt. xticks([]),plt.yticks([])
plt. show()
上例中采用了5×5的卷积核,注意卷积核多采用奇数大小,均值平滑会在感受野内作平均,感受野越大,平滑效果越好。
(2)高斯平滑。高斯平滑是将上面的卷积核换成高斯核,即卷积核中的数据满足高斯分布,表现为卷积核中心的值最大,其余单元数值根据距离中心元素的距离递减。将求平均数变成求加权平均数,权为卷积核中的数值值。高斯平滑利用cv2.GaussianBlur()函数实现。在函数中需要指定高斯核的宽和高(图3-14)。上例中的代码可以修改为:
图3-14 高斯平滑效果对比图
import cv2(www.xing528.com)
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('opencv_logo.png')
blur=cv2.GaussianBlur(img,(5,5),0)
plt. subplot(121),plt.imshow(img),plt.title('Original')
plt. xticks([]),plt.yticks([])
plt. subplot(122),plt.imshow(blur),plt.title('Blurred')
plt. xticks([]),plt.yticks([])
plt. show()
(3)中值平滑。中值平滑是用与卷积核对应像素的中间值来替代中心像素的值。中值平滑经常用来去除噪声。均值平滑和高斯平滑都是利用计算得到的一个新值来取代中心像素的值,而中值平滑是用中心像素周围的值来替换中心像素的值。
为演示中值平滑的效果,可以在原始图像加上50%的噪声,然后再使用中值平滑(图3-15)。其采用的函数为medianBlur(),使用方法和实施作用如下:
median=cv2.medianBlur(img,5)
图3-15 中值平滑效果对比图
(4)双边平滑。双边平滑是一种可以保证边界清晰的去噪平滑方法,其采用的平滑滤波器由两个函数构成:一个函数是由几何空间距离决定的滤波器系数,另一个是由像素差决定的滤波器系数。这样能够将图像的空间关系和图像的灰度关系一同考虑,确保了图像边界不会被平滑掉。双边平滑在去除噪声与细节的同时保留了边缘信息,但处理速度相对较慢,其采用的函数为cv2.bilateralFilter()。实现代码如下,其中的参数9代表邻域大小,两个70分别代表空间高斯函数标准差和灰度值相似性高斯函数标准差(图3-16)。
blur=cv2.bilateralFilter(img,9,70,70)
图3-16 双边平滑效果对比图
从图3-16中可以看到图中的纹理被平滑处理,但是各部分的边界还十分明显。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。