opencv-python 笔记搬运02:几个简单的滤波函数

滤波算法

卷积运算需要用到:卷积矩阵、图像矩阵。
卷积矩阵是一个二维数组。构成卷积矩阵的主要元素有:奇数行、奇数列、锚点(感兴趣元
素),卷积矩阵又被称为卷积核。
例如,若一个卷积矩阵为:
k e r n e l = ∣ − 1 − 1 − 1 − 1 9 − 1 − 1 − 1 − 1 ∣ kernel = \left |\begin{array}{cccc} -1 &-1 & -1 \\ -1 &9 & -1 \\ -1 & -1& -1 \\ \end{array}\right| kernel=111191111
该矩阵中,感兴趣的像素权重为 9,其周围的元素权重为 -1。对于被计算的像素点而言,该点的新像
素值为用当前的像素值乘以 9,然后减去该像素周围的各像素值(之所以是减去,是因为
其余八个像素点的权重为 -1)。
假设有一个 3×3 大小的图像,其像素值为:
k e r n e l = ∣ A 1 A 2 A 3 B 1 B 2 B 3 C 1 C 2 C 3 ∣ kernel = \left |\begin{array}{cccc} A_{1} &A_{2}&A_{3} \\ B_{1} &B_{2}&B_{3} \\ C_{1} &C_{2}&C_{3} \\ \end{array}\right| kernel=A1B1C1A2B2C2A3B3C3
则以B2像素为例,其像素值计算公式为:
像 素 值 = ( − 1 ) ∑ i = 1 3 A i + ( − 1 ) ∑ i = 1 3 C i + ( − B 1 ) + ( − B 3 ) + + ( 9 B 2 ) 像素值 =(-1)\sum\limits_{i=1}^{3}A_{i} + (-1)\sum\limits_{i=1}^{3}C_{i} + (-B_{1})+(-B_{3})++(9B_{2}) =(1)i=13Ai+(1)i=13Ci+(B1)+(B3)++(9B2)
卷积矩阵的各个元素之和如果为 1,则图像的亮度不会改变。如果矩阵各个元素相加之和为
0,则会将边缘转换成白色,非边缘转换成黑色。

几个常用的滤波函数

均值滤波函数 cv2.blur( )

这个函数的组成元素有:在这里插入图片描述
对于 OpenCV 而言,一个对图像进行操作的函数一般都会有一个输入数组(InputArray)和
一个输出数组(OutputArray),这两个参数分别用来输入要处理的图像和输出处理后的图像。

第三个参数(Ksize)的作用为设置卷积核的大小,可以是(3,3)或(5,5)等。边缘检测与模糊化
函数的参数很多,但总会有 ksize 参数(奇数),其表示滤波核的宽和高。对于 medianBlur()
函数,它的 Ksize 设在 3 以下相当于关闭效果,Ksize 值越高,代价越大。

第四个参数为锚点坐标,默认输入为(-1,-1),即为锚点处在卷积核的中心,如果不想改变这
个锚点的位置,可以跳过对这个参数的输入。

最后一个参数为边界类型,这个参数同样有一个默认值,BORDER_DEFAULT 的作用为,将
输出图像的边缘地区用原图像的边缘像素来填充。(输出的图像一般会比输入的原图像要大,
这样做是为了使程序能够有效处理原图像的边界)

在 python 中,dst 一般作为接收函数返回值的变量,而不直接写入到函数中。

在最简单的调用中,只需要输入两个值:

dst = cv2.blur(img,(5,5))
  1. 原图像
  2. 卷积核大小

处理结果大致如下:
在这里插入图片描述在这里插入图片描述

中值滤波 cv2.medianBlur( )

为缓解识别边缘时的噪声影响,通常在使用边缘检测滤波之前,要对图像进行模糊化处
理,cv2.medianBlur()函数对处数字化视频噪声非常有效,特别是除去彩色图像的噪声。

该函数的组成成员有:
在这里插入图片描述
Ksize 为卷积核的大小。
卷积核大小越大,滤波的效果就越明显。

result = cv2.medianBlur(img, 5)

这里也采用大小为 5x5 的核。
在这里插入图片描述在这里插入图片描述

双边滤波 cv2. bilateralFilter( )

该函数的成员有:
在这里插入图片描述
成员 int d:
这个 d 表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace
中计算得到。如果滤波空间较大,则运算速度会较慢,一般推荐 d=5。对于较大噪声的滤波,
可以选择 d=9。

成员 sigmaColor:
这个值决定了周围有哪些点能参与滤波计算,与当前像素点像素值的差值小于这个 sigma 值
的像素将参与滤波运算。当取 255 时,当前像素点周围的所有点都将参与运算。

必要的参数:

dst = cv2.bilateralFilter(img, d=9, sigmaColor = 255, sigmaSpace = 0)

运行结果
在这里插入图片描述

方框滤波 cv2.boxFilter( )

该函数的成员有:
在这里插入图片描述
成员 int ddepth:
该变量表示输出图像的深度,如果该值为-1,则深度和原图像相同。

成员 bool normalize:
该变量为归一化处理变量,默认值为 true,当该值为 true 时,方框滤波就是均值滤波。
(如果想使用该成员的默认值,在输入参数时无需输入该成员/或输入 normalize = true)

必要参数:

dst = cv2.boxFilter(img, -1, (5,5))

运行结果:
输入:

dst = cv2.boxFilter(img, -1, (5,5), normalize = False)

得到:
在这里插入图片描述

高斯滤波 cv2. GaussianBlur( )

该函数的成员有:
在这里插入图片描述
成员 sigmaX:
表示核在 X 轴上的标准偏差。

成员 sigmaY:
表示核在 Y 轴上的标准偏差。当该值为 0 时,表示与 sigmaX 取同样的值。

必要成员:

dst = cv2.GaussianBlur(img, (11,11), 0)

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

OK今天的砖先搬到这。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值