Opencv学习九:图像平滑处理之均值滤波

在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像。

一、均值滤波

均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。

1.基本原理

Opencv学习九:图像平滑处理之均值滤波_第1张图片

在进行均值滤波时,我们通常会以当前像素点为中心,对行数和列数相等的一块区域内的所有像素点求平均。例如上图:
Opencv学习九:图像平滑处理之均值滤波_第2张图片
通过计算我们得到红色点的像素新值=126,那么我们就将126作为当前像素点均值滤波后的像素值。

2.函数语法

在Opencv中,实现均值滤波的是函数cv2.bulr(),其语法格式为:

dst = cv2.blur( src, ksize, anchor, borderType)

式中:

  • dst:返回值,表示进行均值滤波处理后的结果;

  • src:需要处理的图像,可以有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种;

  • ksize:滤波核大小。滤波核是指在均值处理过程中,其邻域图像的高度和宽度。例如,其值可以为(5,5),表示以5x5大小的邻域均值作为图像均值滤波处理的结果,如下图所示:
    Opencv学习九:图像平滑处理之均值滤波_第3张图片

  • anchor:锚点,其默认值是(-1,-1),表示计算均值的点位于核中心点位置。该值使用默认就可以了,在特殊情况下可以指定不同的点作为锚点;

  • borderType:边界样式,该值决定了以何种方式处理边界,一般情况下不需要考虑该值的取值,直接采用默认即可。

通常情况下,使用均值滤波函数时,对于锚点anchor和边界样式borderType,直接采用默认值。因此,函数cv2.blur()的一般形式为:
dst = cv2.blur( src,ksize,)

3.程序实例

(1)使用cv2.blur()函数对图像进行均值滤波处理,代码如下:

import cv2
o = cv2.imread("C:\\Users\\asus\\Desktop\\noise.jpg")
r = cv2.blur(o,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()


(2)针对噪声图像,还可以使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况。

调整函数cv2.blur()中的ksize参数,分别将卷积核设置为5x5大小和30x30大小,对比均值滤波的结果,代码如下:

import cv2
o = cv2.imread("C:\\Users\\asus\\Desktop\\noise.jpg")
r5 = cv2.blur(o,(5,5))
r30 = cv2.blur(o,(30,30))
cv2.imshow("original",o)
cv2.imshow("result5",r5)
cv2.imshow("result30",r30)
cv2.waitKey()
cv2.destroyAllWindows()


从结果图中我们可以看出,使用5x5的卷积核进行滤波时,图像的失真不明显;而使用30x30的卷积核进行滤波处理时,图像失真明显。

结论:卷积核越大,参与到均值计算中的像素就会越多,即当前点计算的是更多点的像素值的平均值。因此,卷积核越大,去噪效果越好,当然话费的时间也会越长,图像失真情况也会越严重。在实际处理中,我们要在失真和去噪之间取得平衡,选取合适大小的卷积核。

你可能感兴趣的:(opencv)