OpenCV-python学习笔记(七)——图像平滑处理

第七章 图像平滑处理

图像平滑处理: 在尽量保持原有图像信息的情况下,过滤掉图像内部的噪声,得到的图像为平滑图像。

原理: 将噪声所在像素点的像素值处理为期周围临近像素点的值的近似值。

取近似值的方法有:均值滤波,方框滤波,高斯滤波,中值滤波,双边滤波,2D卷积滤波(自定义卷积滤波)

7.1 均值滤波

指用当前像素点周围N*N个像素值的均值来代替当前像素值。该方法会遍历图像内的每一个像素点。

7.1.1 语法

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

dst: 返回值

src: 原图像

ksize: 滤波核的大小。指在均值处理过程中,其邻域图像的高度和宽度。

anchor: 锚点。默认值为(-1.-1),表示当前计算均值的点位于核中心点位置。一般采用默认值。

borderType: 边界样式,一般采用默认值。

所以函数cv2.blur()的一般形式为:

dst=cv2.blur (src,ksize,)

示例:

使用5×5的卷积核和30×30的卷积核,结果30×30的图像失真,所以卷积核越大去噪效果越好,失真现象更严重。

import cv2
o=cv2.imread ("lenanoise.png")
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 ()

结果:
在这里插入图片描述

7.2 方框滤波

自由选择是否对均值滤波的结果进行归一化,可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和,

(1)邻域像素值的平均值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAWNpCFF-1658741749324)(D:\python\opencv学习笔记\opencv3 笔记\笔记图片\方框滤波平均值.png)]

(2)邻域像素值之和

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGStNOqP-1658741749325)(D:\python\opencv学习笔记\opencv3 笔记\笔记图片\方框滤波像素值之和.png)]

7.2.1 语法

dst=cv2.boxFilter (src,ddepth,ksize,anchor,normalize,borderType)

ddepth:处理结果图像的图像深度,-1表示与原始图像使用相同的深度图像。

ksize:滤波核大小

anchor:锚点

normalize: 在滤波时是否进行归一化。1真(均值),0假(之和)

borderType :边界样式

常用形式:

dst=cv2.boxFilter (src,ddepth,ksize)

示例:

2×2大小滤波,参数normalize为0,即不归一化,去方框像素值之和。

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

结果:
在这里插入图片描述

7.3 高斯滤波

均值和方框滤波中,邻域内每个像素的权重都是相等的,在高斯滤波中,中心点的权重值值会加大,远离中心点的权重会减小。

卷积核:
在这里插入图片描述

卷积核高度宽度可以不相同,但必须是奇数

不同大小的卷积核:
在这里插入图片描述

7.3.1 语法

dst=cv2.GaussianBlur (src,ksize,sigmaX,sigmaY,borderType)

ksize: 滤波核的大小

sigmaX: 卷积核在X轴方向的标准差,控制的是权重比例。

sigmaY: 卷积核在Y轴方向的标准差,控制的是权重比例。

sigmaX=0.3×[ (ksize.width-1) ×0.5-1]+0.8

sigmaY=0.3×[ (ksize.height-1 ) ×0.5-1]+0.8

borderType :边界样式

sigmaY和borderType是可选参数。sigmaX是必选参数,但是可以将该参数设置为0,让函数自己去计算sigmaX的具体值。

常用形式:

dst=cv2.GaussianBlur ( src,ksize,0,0)

7.4 中值滤波

领域内所有像素值的中值代替当前像素点的像素值

将领域内的像素值排序,将位于中间的像素值作为当前像素点的像素值

7.4.1 语法

dst=cv2.medianBlur (src,ksize)

ksize: 滤波核的大小

中值滤波不存在细节模糊问题,在中值滤波中,噪声成分很难被选上,几乎可以在不影响原有图像的情况下去除全部噪声,但是运算量较大。

7.5 双边滤波

综合考虑空间信息色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息

距离信息(距离越远,权重越小),色彩信息(色彩差别越大,权重越小),能有效保护边缘信息。

dst=cv2.bilateralFilter (src,d,sigmaColor,sigmaSpace,borderType)

d: 空间距离参数,表示以当前像素点为中心点的直径,

sigmaColor: 选取的颜色差值范围,该值确定了哪些像素点能够参加到滤波来,与当前像素点的像素值

sigmaSpace: 坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。

示例:

import cv2
o=cv2.imread ( "lenanoise.png")
r=cv2.bilateralFilter (o,25,100,100)
cv2.imshow ( "original",o)
cv2.imshow ( "result",r )
cv2.waitKey ()
cv2.destroyAllWindows ()

特点: 更好的处理边缘信息,但是在处理噪声效果并不好。

结果:
在这里插入图片描述

7.6 2D卷积

使用自定义卷积核实现卷积操作。

dst=cv2.filter2D ( src,ddepth,kernel,anchor,delta,borderType)

ddepth: 处理结果图像的图像深度,-1表示使用与原始图像深度相同的图像深度

kernel: 卷积核,是一个单通道数组。

anchor: 锚点,默认值(-1,-1),表示当前点位于核的中心点的位置。

delta: 修正值,可选参数,在基础滤波的结果上加上该值作为滤波结果

常用形式:

dst=cv2.filter2D (src,ddepth,kernel)

示例:

设计9×9的卷积核大小,权重相等。

import cv2
import numpy as np
o=cv2.imread ( "bgra.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 ()

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56321457/article/details/125979917