python-openCV学习笔记(6)-图像平滑处理

本文介绍了OpenCV中常见的图像平滑处理方法,包括均值滤波、方框滤波、高斯滤波、中值滤波和双边滤波。通过实例展示了如何在OpenCV中使用这些滤波函数,并强调了它们在噪声去除、边缘保留等方面的应用。
摘要由CSDN通过智能技术生成

在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像。图像平滑处理,通常伴随图像模糊操作,因此图像平滑处理有时也被称为图像模糊处理。
图像滤波是图像处理和计算机视觉中最常见、最基本的操作。图像滤波允许在图像上进行各种各样的操作,因此有时我们也会把图像平滑处理称为图像滤波。

均值滤波

均值滤波是指用当前像素点周围N*N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内每一个像素点,即可完成整幅图像的均值滤波。
在OpenCV中,进行滤波时会出一个矩阵,这个矩阵就是卷积核,其一般格式如下:
K = 1 M ∗ N [ 1 1 . . . 1 1 1 . . . 1 . . . . . . . . . . . . 1 1 . . . 1 ] K=\frac{1}{M*N}\begin{bmatrix}1&1&...&1\\1&1&...&1\\...&...&...&...\\1&1&...&1\\ \end{bmatrix} K=MN1 11...111...1............11...1
式中,M,N分别为对应高度和宽度。一般情况下,M和N是相等的。如果M和N的值越大,参与运算的像素点数量就越多,图像失真越严重。
在OpenCV中,实现均值滤波的函数是cv2.blur(),其语法格式为:
dst=cv2.blur(src,ksize,anchor,borderType)
式中:
dst是返回值,表示进行均值滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它可以有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U,CV_16U,CV_16S,CV_32F或者CV_64F中的一种。
ksize是滤波核的大小。滤波核大小是指在均值处理过程中,其领域图像的高度和宽度。
anchor是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
borderType是边界样式,该值决定了以何种方式处理边界,其值如下表。
040343f8328f72c7dc8c4eb252aed74.jpg

img = cv2.imread('lena.jpg')
r=cv2.blur(img,(5,5))
cv2.imshow("img",img)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

方框滤波

方框滤波可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是领域像素值之和的平均值还是领域像素值之和。
在OpenCV中,实现方框滤波的函数是cv2.boxFilter(),其语法格式为:
dst=cv2.boxFilter(src,ddepth,ksize,anchor,normallize,borderType)
式中:
dst是返回值,表示进行方框滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任何数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U,CV_16U,CV_16S,CV_32F或者CV_64F中的一种。
ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的深度。
ksize是滤波核的大小。滤波核大小是指在滤波处理过程中,其领域图像的高度和宽度。
anchor是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
normalize表示在滤波是是否进行归一化。
当参数为1时,表示进行归一化处理,即结果为领域像素值之和的平均值。
当参数为0时,表示不进行归一化处理,即结果为领域像素值之和。
borderType是边界样式,该值决定了以何种方式处理边界,其值如下表。

img = cv2.imread('lena.jpg')
r5=cv2.boxFilter(img,-1,(5,5),normalize=1)
r2=cv2.boxFilter(img,-1,(2,2),normalize=0)
cv2.imshow("img",img)
cv2.imshow("result5",r5)
cv2.imshow("result2",r2)
cv2.waitKey()
cv2.destroyAllWindows()

高斯滤波

在进行均值滤波和方框滤波时,其领域内每个像素的权重时相等的。在高斯滤波中,会将中心的权重值加大,远离中心点的权重值减小,在此基础上计算领域内各个像素值不同权重的和。
注意,在高斯滤波中,核的宽度和高度可以不相同,但它们都必须是奇数。
在OpenCV中,实现高斯滤波的函数是cv2.GaussianBlur(),该函数的语法格式为:
cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
式中:
dst是返回值,表示进行高斯滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任何数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U,CV_16U,CV_16S,CV_32F或者CV_64F中的一种。
ksize是滤波核的大小。滤波核大小是指在滤波处理过程中,其领域图像的高度和宽度。需要注意,滤波核的值必须是奇数。
sigmaX是卷积核在水平方向上(X轴方向)的标准差,其控制的是权重比例。
sigmaY是卷积核在垂直方向上(Y轴方向)的标准差,如果将该值设置为0,则只采用sigmaX的值;如果sigmaX和sigmaY都是0,则通过ksize.width和ksize.height计算得到。
其中:
s i g m a X = 0.3 ∗ [ ( k s i z e . w i d t h − 1 ) ∗ 0.5 − 1 ] + 0.8 s i g m a Y = 0.3 ∗ [ ( k s i z e . h e i g h t − 1 ) ∗ 0.5 − 1 ] + 0.8 sigmaX=0.3*[(ksize.width-1)*0.5-1]+0.8\\ sigmaY=0.3*[(ksize.height-1)*0.5-1]+0.8 sigmaX=0.3[(ksize.width1)0.51]+0.8sigmaY=0.3[(ksize.height1)0.51]+0.8
borderType是边界样式,该值决定了以何种方式处理边界,其值如下表。

img = cv2.imread('lena.jpg')
r5=cv2.GaussianBlur(img,(5,5),0,0)
cv2.imshow("img",img)
cv2.imshow("result5",r5)
cv2.waitKey()
cv2.destroyAllWindows()

中值滤波

中值滤波与前面介绍的滤波方式不同,不用采用加权求均值的方式计算滤波结果。它用领域内所有像素值的中间值来替代当前像素点的像素值。
中值滤波会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的值。
在OpenCV中,实现中值滤波的函数是cv2.medianBlur(),其语法格式如下:
dst=cv2.medianBlur(src,ksize)
式中:
dst是返回值,表示进行中值滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任何数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U,CV_16U,CV_16S,CV_32F或者CV_64F中的一种。
ksize是滤波核的大小。滤波核大小是指在滤波处理过程中,其领域图像的高度和宽度。需要注意,滤波核的值必须是比1大的奇数。其和上面的滤波的核不同,其为3,5等,不用加()

img = cv2.imread('lena.jpg')
r5=cv2.medianBlur(img,5)
cv2.imshow("img",img)
cv2.imshow("result5",r5)
cv2.waitKey()
cv2.destroyAllWindows()

注意,在中值滤波处理中,噪声成分很难被选上,所以可以在几乎不影响原有图像的情况下去除全部噪声。但是由于需要排序等操作,中值滤波需要的运算量较大。

双边滤波

双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效的保护图像内的边缘信息。双边滤波在计算某一个像素点的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)。
在OpenCV中,实现双边滤波的函数是cv2.bilateralFilter(),该函数的语法是:
dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
式中:
dst是返回值,表示进行双边滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任何数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U,CV_16U,CV_16S,CV_32F或者CV_64F中的一种。
d是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数sigmaSpace计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9.
sigmaColor是滤波处理时选取的颜色差值范围,该值决定了周围那些像素点能够参与到l滤波中来。与当前像素点的像素值差值小于sigmaColor的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中,该值为0时,滤波失去意义。该值为255时,指定直径内的所有点都可以参与运算。
sigmaSpace时坐标空间中的sigma的值,它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定领域大小;否则d与sigmaSpace的值成比例。
borderType是边界样式,该值决定了以何种方式处理边界,其值如下表。

注意,为了简单起见,一般把sigmaColor和sigmaSpace设置为一样的。如果他们的值比较小,滤波的效果将不太明显。如果他们的值较大,则滤波效果会比较明显,会产生卡通效果。双边滤波对去除噪声的效果并不好,但其的优势体现在对边缘信息的处理上,可以很好的保留边缘信息。

img = cv2.imread('lena.jpg')
r55=cv2.GaussianBlur(img,(55,55),0,0)
r5=cv2.bilateralFilter(img,55,100,100)
cv2.imshow("img",img)
cv2.imshow("result55",r55)
cv2.imshow("result5",r5)
cv2.waitKey()
cv2.destroyAllWindows()

2D卷积

在OpenCV中允许用户自定义卷积核实现卷积操作,使用自定义卷积核实现卷积操作的函数为cv2.filter2D()其语法格式为:
dst=cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
式中:
dst是返回值,表示进行滤波后得到的处理结果。
src是需要处理的图像,即原始图像。它能够有任何数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U,CV_16U,CV_16S,CV_32F或者CV_64F中的一种。
ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的深度。
kernel是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。
anchor是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
delta是修正值,他是可选项,如果该值存在,会在基础滤波的结果上加上该值做为最终的滤波处理结果。
borderType是边界样式,该值决定了以何种方式处理边界,其值如下表。

img = cv2.imread('lena.jpg')
kernel=np.ones((9,9),np.float32)/81
r5=cv2.filter2D(img,-1,kernel)
cv2.imshow("img",img)
cv2.imshow("result5",r5)
cv2.waitKey()
cv2.destroyAllWindows()
  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小菜花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值