opencv Python实现之图像平滑处理

opencv Python实现之图像平滑处理

Q:什么是图像平滑处理?

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

图像平滑处理的基本原理是:将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。取近似值的方式很多,主要介绍的方法是:

  • 1.均值滤波
  • 2.方框滤波
  • 3.高斯滤波
  • 4.中值滤波
  • 5.双边滤波
  • 6.2D卷积(自定义滤波)

1均值滤波

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

语法格式:
dst=cv2.blur(src,ksize,anchor,borderType)

  • src 是需要处理的图像,即原始图像。它可以有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F中的一种。
  • ksize是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。
    例如,其值可以为(5,5),表示以5×5大小的邻域均值作为图像均值滤波处理的结果。
  • anchor 是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
  • borderType是边界样式,该值决定了以何种方式处理边界,其值如表7-1所示。一般情况下不需要考虑该值的取值,直接采用默认值即可。

eg.

image=cv2.imread('ufo_noise.png')
dst=cv2.blur(image,(7,7))
cv2.imshow('origin',image)
cv2.imshow('dst',dst)
if cv2.waitKey(0)==27:
    cv2.destroyAllWindows()

2方框滤波

方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均值。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

语法格式:
dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)

  • ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
  • normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真(值为1)或假(值为0)。
  • 当参数normalize=1时,表示要进行归一化处理,要用邻域像素值的和除以面积。
  • 当参数normalize=0时,表示不需要进行归一化处理,直接使用邻域像素值的和。

eg.

image=cv2.imread('ufo_noise.png')
dst=cv2.boxFilter(image,-1,(7,7))
cv2.imshow('origin',image)
cv2.imshow('dst',dst)
if cv2.waitKey(0)==27:
    cv2.destroyAllWindows()

3高斯滤波

在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

语法格式:
dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
*ksize的height,width必须为奇数

  • sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。例如,图7-25中是不同的sigmaX决定的卷积核,它们在水平方向上的标准差不同。
  • sigmaY是卷积核在垂直方向上(Y轴方向)的标准差。如果将该值设置为0,则只采用sigmaX的值;如果sigmaX和sigmaY都是0,则通过ksize.width和ksize.height计算得到。

eg.

o=cv2.imread("ufo_noise.png")

r=cv2.GaussianBlur(o,(5,5),0,0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

4中值滤波

中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻域内所有像素值的中间值来替代当前像素点的像素值。

语法格式:(一般形式)
dst=cv2.medianBlur(src,ksize)
*ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,核大小必须是比1大的奇数,比如3、5、7等。

eg.

image=cv2.imread('ufo_noise.png')
after=cv2.medianBlur(image,5)
cv2.imshow('before',image)
cv2.imshow('after',after)
if cv2.waitKey(0)==27:
    cv2.destroyAllWindows()

5双边滤波

双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息
双边滤波的优势体现在对于边缘信息的处理上,下面通过一个例题来展示不同形式的滤波在边缘处理效果上的差异。

语法格式:
dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)

  • 是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。
    如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。
  • sigmaColor:是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。
    与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。
    该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。
  • sigmaSpace:是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,
    d都指定邻域大小;否则,d与sigmaSpace的值成比例。

eg.

o=cv2.imread("ufo_noise.png")
g=r=cv2.GaussianBlur(o,(55,55),0,0)
b=cv2.bilateralFilter(o,55,100,100)
cv2.imshow("original",o)
cv2.imshow("Gaussian",g)
cv2.imshow("bilateral",b)
cv2.waitKey()
cv2.destroyAllWindows()

6 2D卷积

允许用户自定义卷积核实现卷积操作,使用自定义卷积核实现卷积操作的函数是cv2.filter2D()

语法格式:(一般形式)
dst=cv2.filter2D(src,ddepth,kernel)

  • 是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。

eg.

dst=cv2.filter2D(src,ddepth,kernel)
o=cv2.imread("ufo_noise.png")
kernel=np.ones((9,9),np.float32)/81
r=cv2.filter2D(o,-1,kernel)
cv2.imshow("original",o)
cv2.imshow("Gaussian",r)
cv2.waitKey()
cv2.destroyAllWindows()

本节内容引用自《OpenCV轻松入门:面向Python》 李立宗著。

下节我们将学习 OpenCV之形态学操作

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值