在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像
图像平滑处理会对图像中与周围像素点的像素值差异较大的像素点进行处理,将其调整为周围像素点像素值的近似值
1、均值滤波 均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
在OpenCV中,实现均值滤波的函数是cv2.blur()
其语法格式为
dst = cv2.blur( src, ksize, anchor, bordertype)
dst是返回值,表示进行均值滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它可以有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
ksize是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。例如,其值可以为(5, 5),表示以5×5大小的邻域均值作为图像均值滤波处理的结果,如下式所示。
● anchor是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
● borderType是边界样式,该值决定了以何种方式处理边界,其值如表所示。一般情况下不需要考虑该值的取值,直接采用默认值即可。
dst = cv2.blur(src ,ksize ,)
示例程序
import cv2
img = cv2.imread("adc.jpg") #读取待处理图像
r = cv2.blur(img,(5,5)) #均值滤波
cv2.imshow("original",img)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destoryAllWindows()
2、方框滤波
OpenCV还提供了方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均值。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。
语法格式如下
dst = cv2.boxFilter( stc, ddepth, ksize, anchor, normalize, borderType)
dst是返回值,表示进行方框滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者CV_64F中的一种。
ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
ksize是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以3×3大小的邻域均值作为图像均值滤波处理的结果,如下式所示。
anchor是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
normalize表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真(值为1)或假(值为0)。
当参数normalize=1时,表示要进行归一化处理,要用邻域像素值的和除以面积。
当参数normalize=0时,表示不需要进行归一化处理,直接使用邻域像素值的和。
borderType是边界样式,该值决定了以何种方式处理边界
通常情况下, 在使用方框滤波函数时,对于参数anchor、normalize和borderType,直接采用其默认值即可。 因此,函数cv2.boxFilter()的常用形式为:dst = cv2.boxFilter( src, ddepth, ksize)
3、高斯滤波
在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。
在openCV中实现高斯滤波的函数是cv2.GaussoianBlur() 该函数语法为dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )
dst是返回值,表示进行高斯滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
ksize是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,滤波核的值必须是奇数。
sigmaX是卷积核在水平方向上(X轴方向)的标准差,其控制的是权重比例。例如,图中是不同的sigmaX决定的卷积核,它们在水平方向上的标准差不同。
不同的sigmaX决定的卷积核
sigmaY是卷积核在垂直方向上(Y轴方向)的标准差。如果将该值设置为0,则只采用sigmaX的值;如果sigmaX和sigmaY都是0,则通过ksize.width和ksize.height计算得到。
其中:
borderType是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。
在该函数中,sigmaY和borderType是可选参数。sigmaX是必选参数,但是可以将该参数设置为0,让函数自己去计算sigmaX的具体值。
官方文档建议显式地指定ksize、sigmaX和sigmaY三个参数的值,以避免将来函数修改后可能造成的语法错误。 当然,在实际处理中,可以显式指定sigmaX和sigmaY为默认值0。 因此,函数cv2.GaussianBlur()的常用形式为:dst = cv2.Gaussianblur( src, ksize, 0, 0)
4、中值滤波
中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻域内所有像素值的中间值来替代当前像素点的像素值。
在OpenCV中,实现中值滤波的函数是cv2.medianBlur() 其语法格式如下:dst = cv2.medianBlur( src, ksize)
程序示例
import cv2
img = cv2.imread("Experment.jpg")
r = cv2.medianBlur(img,3)
cv2.imshow("demo",img)
cv2.imshow("r",r)
cv2.waitKey()
cv2.destroyAllWindows()
结果为:
还有未记录的为双边滤波