图像平滑处理
在为尽量保留原有图像信息的情况下,过滤掉图像内部的噪声,这就是图像的平滑处理。图像平滑处理会对图像中与周围像素点的像素值差异较大的像素点进行处理,将其值调整为与周围像素值的近似值。取近似值的方法有很多,比如:均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波、2D滤波(自定义滤波)。
图像平滑处理(Smoothing Images)通常伴随着图像的模糊操作,用此常被称为图像的模糊处理(Blurring Images)。也有人称为图像滤波(Images Filtering)
1.均值滤波
均值滤波是指用当前像素点周围MN个像素值得平均值来代替当前的像素值。用此方法来遍历每一个像素,就可以完成整幅图的均值滤波。一般来说M和N是相等的,这两个值越大,图像失真越严重。
1.1函数语法
dst = cv2.blur(src, ksize, anchor, borderType)
src: 需要处理的图像。可以有任意数量的通道。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
ksize: 是滤波核的大小,即MN的大小,代表均值处理过程中其邻域的高度和宽度。
anchor: 锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。
borderType: 边界样式,决定了以何种方式处理边界。一般用默认值即可。
课件处理后图像变模糊了。
2.方框滤波
与均值滤波不同的是,,方框滤波可以自由的选择是否对均值滤波的结果进行归一化,即可以选择是取邻域像素之和的平均值,还是取邻域像素值之和。
dst_box = cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
其中前三个参数是必选参数;
ddepth: 是处理结果图像的图像深度,一般使用-1, 表示图像深度与原图像相同。
normalize: 表示滤波时是否进行归一化,该参数是一个逻辑值,为真(值为1),或为假(值为0)。默认为1,此时与cv2.blur()方法等效。
3.高斯滤波
在均值滤波和方框滤波中,邻域里每个像素的权重是一致的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上进行邻域像素值得加权求和。
在高斯滤波中,卷积核的宽度和高度可以不同,但必须是奇数。每一种尺寸的卷积核都可以有不同形式的权重比例。在实际计算中心卷积核是归一化处理的(求和为1)。
dst_gauss = cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
src:是需要处理的原始图像。它可以是多通道,并能够对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
ksize:是滤波核的大小。
sigmaX:是卷积核在水平方向上(X轴方向)的标准差,其控制的是权重的比例。
sigmaY:是卷积核在垂直方向上(Y轴方向)的标准差。如果该值是0,则只采用singmaX的值;如果sigmaX 和sigmaY都是0,则通过ksize.width和ksize.height计算得到。其中
borderType:是边界样式,该值决定了以什么方式处理边界。一般情况下可以用默认值。
例如:
4.中值滤波
中值滤波它用邻域内所有所有像素值的中间值来代替当前像素点的值。
median_dst=cv2.medianBlur(src,ksize)
src:是需要处理的原始图像。它可以是多通道,并能够对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
ksize: 是滤波核的大小。指在滤波处理过程中其邻域图像的高度和宽度。且核的大小必须是比1大的奇数。
例如:可以看到效果还不错
由于没有进行均值处理,中值滤波不存在均值滤波方式带来的细节模糊问题。在中值滤波处理过程中,噪声成分很难被选上,所以可以在几乎不影响原有图像的情况下去除全部噪声,但由于排序操作,中值滤波需要的运算量非常大。
5.双边滤波
双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能有效的保护图像内的边缘信息。
在均值滤波、方框滤波、高斯滤波中,都会计算边缘上各个像素点的加权平均值,从而模糊边缘信息。在双边滤波中,当处于边缘上,与当前像素点色彩相近的像素点会被赋予较大的权重,而与当前色彩差别较大的像素点会被赋予较小的权重(极端条件下可以是0)。这样就保护了边缘信息、
dst= cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
src:是需要处理的原始图像。它可以是多通道,并能够对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
d: 是在滤波时选取的空间距离参数,这里表示以当前像素点为中心的直径。如果该值是非正数,则由sigmaSpace参数计算得到。如果滤波空间较大(d>5),则速度较慢,因则在实际应用中,推荐d=5。对于较大噪声的离线绿波,可以选择d=9。
sigmaColor:是滤波处理时选择的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于sigmaColor的像素点,能够参与到当前的滤波当中,该值越大说明有越多的像素点可以参与到运算中。当值为0时,滤波失去意义;该值是255,指定指定直径内的所有点够能参与运算。
sigmaSpace::是坐标空间中sigma的大小。该值越大说明有越多的像素点可以参与到运算中。当d>0时,无论sigmaSpace是何值,d都指定邻域大小。否则d与sigmaSpace的值成正比。(sigmaSpace参数表示坐标空间的标准方差(像素单位),一般尽可能小)。
双边滤波去除噪声的效果并不理想,他的优势体现在对于边缘信息的处理上。
img = cv2.imread('filter_bil.png')
# 均值滤波
dst = cv2.blur(img, (5,5))
#中值滤波
median_dst=cv2.medianBlur(img,3)
#高斯滤波
dst_gauss = cv2.GaussianBlur(img,(5,5),sigmaX=2)
# 双边滤波
bilateral_img = cv2.bilateralFilter(img,5,100,100)
cv2.imshow("img",img)
cv2.imshow("mean_img",dst )
cv2.imshow("median_dst",median_dst)
cv2.imshow("dst_gauss",dst_gauss)
cv2.imshow("bilateral_img",bilateral_img)
6.2D卷积
有时我们需要使用特定的卷积核实现卷积操作,方法如下:
dst = cv2.filter2D(img,ddepth,kernel,anchor,delta,borderType)
src: 需要处理的图像;
ddepth: 是处理结果图像的图像深度,一般使用-1, 表示图像深度与原图像相同;
kernel: 是卷积核。是一个简单的数组。如果想要在处理彩色图像时,让每一个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成。
anchor: 是锚点,默认值是(-1,-1), 表示当前计算均值的点位于核的中心位置。
delta: 是修正值,它是可选值。如果该值存在,会在基础滤波的结果上加上该值,作为最终结果。
如: