苦学Opencv的第十天:滤波器

Python OpenCV入门到精通学习日记:滤波器

前言

在数字图像处理中,滤波器是一个不可或缺的工具。它们可以帮助我们去除图像中的噪声,平滑图像,甚至实现更复杂的图像效果。OpenCV提供了多种滤波器,每种滤波器都有其独特的用途和效果。OpenCV中的滤波器,包括均值滤波器、中值滤波器、高斯滤波器和双边滤波器,一起来看看吧。

滤波器
均值滤波器
中值滤波器
高斯滤波器
双边滤波器

1. 均值滤波器

图像中可能会出现一种这样的像素,该像素与周围像素的差别非常大,这导致在视觉上无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种像素就叫做图像的噪声,并且如果图像中的噪声都是随机的纯黑像素或者纯白像素,这样的噪声叫作“椒盐噪声”和“盐噪声”

以一个像素为核心,其周围像素可以组成一个n行n列(简称n×n)的矩阵,这样的矩阵结构在滤波操作中被称为“滤波核”。矩阵的行、列数决定了滤波核的大小,如图11.2所示的滤波核大小为3×3,包含9个像素;图11.3所示的滤波核大小为5×5,包含25个像素。(这里借用书上原图)

在这里插入图片描述

均值滤波器——也称低通滤波器,是一种基本的图像平滑技术,它可以把图像中的每一个像素都当作滤波核的核心,通过计算核内所有像素的平均像素值来替换核心像素的原像素值。这种方法简单有效,但可能会导致图像细节的丢失。OpenCV中的blur()方法实现了均值滤波。

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

参数说明:

  • src:原始图像。
  • ksize:滤波核大小,格式为(高度,宽度),推荐使用奇数边长。滤波核越大,处理之后的图像就越模糊
  • anchor:可选参数,滤波核的锚点,通常使用默认值。
  • borderType:可选参数,边界样式,通常使用默认值。

示例代码:

import cv2

img = cv2.imread("img.png")
dst = cv2.blur(img, (3, 3))
cv2.imshow("Original", img)
cv2.imshow("Blurred", dst)
cv2.waitKey()
cv2.destroyAllWindows()

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

2. 中值滤波器

中值滤波器是一种非线性滤波器,它和均值滤波器特别的相似,不同的地方是它通过选择像素邻域内的中值来替换原像素值。这种方法对椒盐噪声(随机分布的黑点和白点)特别有效。OpenCV中的medianBlur()方法实现了中值滤波。

dst = cv2.medianBlur(src, ksize)

参数说明:

  • src:原始图像。
  • ksize:滤波核的边长,必须是大于1的奇数。该方法根据此边长自动创建一个正方形的滤波核。

注意:
中值滤波器的ksize参数是边长,而其他滤波器的ksize参数通常为(高,宽)。

示例代码:

import cv2

img = cv2.imread("img.png")
dst = cv2.medianBlur(img, 3)
cv2.imshow("Original", img)
cv2.imshow("Median Blurred", dst)
cv2.waitKey()
cv2.destroyAllWindows()

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

滤波核的边长越长,处理之后的图像就越模糊。这里需要注意的是:中值滤波处理的图像会比均值滤波处理的图像丢失更多细节。

3. 高斯滤波器

高斯滤波也被称为高斯模糊或高斯平滑,是目前应用最广泛的平滑处理算法。高斯滤波可以很好地在降低图片噪声、细节层次的同时保留更多的图像信息,经过处理的图像呈现“磨砂玻璃”的滤镜效果。

高斯滤波器是一种线性滤波器,它使用高斯函数对像素邻域内的像素进行加权平均

什么叫加权平均呢?进行均值滤波处理时,核心周围每个像素的权重都是均等的,也就是每个像素都同样重要,所以计算平均值即可。但在高斯滤波中,越靠近核心的像素权重越大,越远离核心的像素权重越小,像素权重不同不能取平均值,要从权重大的像素中取较多的信息,从权重小的像素中取较少的信息。简单概括就是“离谁更近,跟谁更像”。这种方法在降低图像噪声的同时,能够较好地保留图像的边缘信息。

高斯滤波的计算过程涉及卷积运算,会有一个与滤波核大小相等的卷积核。我们以3×3的滤波核为例,简单地描述一下高斯滤波的计算过程。

卷积核中保存的值就是核所覆盖区域的权重值,其遵循图11.8的规律(这里引用书上的原图)。
在这里插入图片描述
卷积核中所有权重值相加的结果为1。例如,3×3的卷积核可以是如图11.9所示的值。随着核大小、σ标准差的变化,卷积核中的值也会发生较大变化,图11.9仅是一种最简单的情况。
在这里插入图片描述
进行高斯滤波的过程中,滤波核中像素与卷积核进行卷积计算,最后将计算结果赋值给滤波核的核心像素。其计算过程如图11.10所示。
在这里插入图片描述
我们可以看出就是卷积计算就是两个核内元素一一对应的计算,再将九个值相加,四舍五入取整,最后得到的这个结果就是高斯滤波的计算结果。

OpenCV中的GaussianBlur()方法实现了高斯滤波。

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

参数说明:

  • src:原始图像。
  • ksize:滤波核的大小,宽高必须是奇数。
  • sigmaX:水平方向的标准差。
  • sigmaY:垂直方向的标准差。
  • borderType:可选参数,边界样式,建议使用默认值。

🌟修改 sigmaX 或 sigmaY 的值都可以改变卷积核中的权重比例。如果不知道如何设计这2个参数值,就直接把这2个参数的值写成0,该方法就会根据滤波核的大小自动计算合适的权重比例。

示例代码:

import cv2

img = cv2.imread("img.png")
dst = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imshow("Original", img)
cv2.imshow("Gaussian Blurred", dst)
cv2.waitKey()
cv2.destroyAllWindows()

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

再在这里啰嗦一句:滤波核越大,处理之后的图像就越模糊和均值滤波、中值滤波处理的图像相比,高斯滤波处理的图像更加平滑,保留的图像信息更多,更容易辨认

4. 双边滤波器

双边滤波器是一种在平滑图像的同时,能够保护图像边缘的滤波器。它根据像素的相似度和空间距离来调整滤波的权重。什么意思呢?也就是说 双边滤波器自动判断滤波核处于“平坦”区域还是“边缘”区域:如果滤波核处于“平坦”区域,则会使用类似高斯滤波的算法进行滤波;如果滤波核处于“边缘”区域,则加大“边缘”像素的权重,尽可能地让这些像素值保持不变

比如说:一幅黑白拼接图像,对这幅图像进行高斯滤波,黑白交界处就会变得模糊不清,但如果对
这幅图像进行双边滤波,黑白交界处的边界则可以很好地保留下来。

OpenCV中的bilateralFilter()方法实现了双边滤波。

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

参数说明:

  • src:原始图像。
  • d:以当前像素为中心的整个滤波区域的直径。如果d<0,则自动根据sigmaSpace参数计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比。
  • sigmaColor:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值之差小于这个值时,周围的像素才进行滤波计算。值为255时,表示所有颜色都参与计算。
  • sigmaSpace:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多。
  • borderType:可选参数,边界样式,建议默认。

示例代码:

import cv2

img = cv2.imread("img.png")
dst = cv2.bilateralFilter(img, 15, 75, 75)
cv2.imshow("Original", img)
cv2.imshow("Bilateral Filtered", dst)
cv2.waitKey()
cv2.destroyAllWindows()

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

我们轻易地就可以发现双边滤波器处理的效果明显比前几种滤波器要好的多,双边滤波保留了较清晰的边缘信息。

小结

通过学习,也是了解了OpenCV中几种常用的滤波器及其使用方法。每种滤波器都有其特定的应用场景和效果。在实际的图像处理任务中,选择合适的滤波器对于改善图像质量和实现特定的图像效果至关重要。

在下一章中,继续学习腐蚀与膨胀,敬请期待!!!如果你有任何问题或建议,欢迎在评论区讨论。

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃点李子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值