OpenCV-Python图像平滑处理

理论基础

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

OpenCV-Python图像平滑处理_第1张图片
图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。取近似值的方式很多,主要包括:

  • 均值滤波
  • 方框滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波
  • 2D 卷积(自定义滤波)

均值滤波

均值滤波是指用当前像素点周围 N·N 个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
例如,希望对图中位于第 5 行第 5 列的像素点进行均值滤波。
OpenCV-Python图像平滑处理_第2张图片
在进行均值滤波时,首先要考虑需要对周围多少个像素点取平均值。通常情况下,我们会以当前像素点为中心,对行数和列数相等的一块区域内的所有像素点的像素值求平均。例如,在图 中,可以以当前像素点为中心,对周围 3×3 区域内所有像素点的像素值求平均,也可以对周围 5×5 区域内所有像素点的像素值求平均。当前像素点的位置为第 5 行第 5 列,我们对其周围 5×5 区域内的像素值求平均,计算方法为:
新值=[(197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75)]/25
=126

dst = cv2.blur( src, ksize, anchor, borderType )
dst 是返回值,表示进行均值滤波后得到的处理结果。
src 是需要处理的图像,即原始图像
ksize 是滤波核的大小,其值可以为(5, 5) (3,3)
OpenCV-Python图像平滑处理_第3张图片

import cv2
o=cv2.imread("image\\lenaNoise.png") #读取待处理图像
r=cv2.blur(o,(5,5)) #使用 blur 函数处理 
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV-Python图像平滑处理_第4张图片

方框滤波

dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )
normalize 表示在滤波时是否进行归一化

  • 当参数 normalize=1 时,表示要进行归一化处理,要用邻域像素值的和除以面积。
  • 当参数 normalize=0 时,表示不需要进行归一化处理,直接使用邻域像素值的和。

例如,针对 5×5 邻域,当参数 normalize=1 时,要进行归一化处理,此时计算的就是均值滤波。这种情况下,函数cv2.boxFilter()和函数 cv2.blur()的作用是一样的。此时,对应的卷积核为:
OpenCV-Python图像平滑处理_第5张图片
同样针对 5×5 邻域,当参数 normalize=0 时,不进行归一化处理,此时滤波计算的是邻域像素值之和,使用的卷积核是:
OpenCV-Python图像平滑处理_第6张图片
normalize=0 时,因为不进行归一化处理,因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值。这样,就会得到一幅纯白色的图像。

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(2,2),normalize=0) 
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV-Python图像平滑处理_第7张图片

高斯滤波

在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。
在高斯滤波中,卷积核中的值不再都是 1。
OpenCV-Python图像平滑处理_第8张图片
OpenCV-Python图像平滑处理_第9张图片
dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.GaussianBlur(o,(5,5),0,0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV-Python图像平滑处理_第10张图片

中值滤波

中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻域内所有像素值的中间值来替代当前像素点的像素值。
OpenCV-Python图像平滑处理_第11张图片
按升序排序后得到序列值为:[66,78,90,91,93,94,95,97,101]。处于中心位置的值是“93”,因此用该值替换原来的像素值 78,作为当前点的新像素值。

dst = cv2.medianBlur( src, ksize)

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.medianBlur(o,3)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV-Python图像平滑处理_第12张图片
中值滤波不存在均值滤波等滤波方式带来的细节模糊问题。但是由于需要进行排序等操作,中值滤波需要的运算量较大。

你可能感兴趣的:(#,OpenCv,opencv)