永兴的笔记-OpenCV-5图像滤波(python)

一、图像滤波是什么?

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
在这里插入图片描述

二、OpenCV-Python中的图像滤波:

在这里插入图片描述

1、均值滤波:

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
比如:
在这里插入图片描述
简单来说就是目标区域的每个将周围的8个像素点以及自身的平均值作为这个像素点的新值
在这里插入图片描述
cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)

  • src:原图像
  • ksize:内核(kernel)大小
    原理:它只取内核区域下所有像素的平均值并替换中心元素。3x3标准化的盒式过滤器如下所示:
    在这里插入图片描述
  • anchor: 字面意思是锚点,也就是处理的像素位于kernel的什么位置,默认值为(-1, -1)即位于kernel中心点,如果没有特殊需要则不需要更改
  • borderType:
    在这里插入图片描述
    于推断图像外部像素的边界模式,有默认值BORDER_DEFAULT

dst:处理后的图像

import cv2
img = cv2.imread("123.png")
result = cv2.blur(img,(3,3))
cv2.imshow("IMG",img)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
方框滤波:cv2.boxFilter(img,ddepth,ksize,normalize=None)
说明:当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示。
ddepth—输出图像的深度(-1使用src.depth())。

2、中值滤波:

顾名思义中值滤波就是用于卷积框对应像素的中值来代替中心像素的值,经常用来除去椒盐噪声。
在这里插入图片描述
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
cv2.medianblur(src, ksize, dst=None)

  • src:原图像
  • ksize:内核 ksize = 3 则表示3*3的矩阵 (只能为奇数)
  • dst:输出后的图像
import cv2
img = cv2.imread("123.png")
imgMedian = cv2.medianBlur(img,3)
cv2.imshow("img",img)
cv2.imshow("MedianBlur",imgMedian)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

3、高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
在这里插入图片描述
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
在这里插入图片描述
这里我们使用的是:离散化窗口滑窗卷积
在这里插入图片描述
cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

  • src:处理的图像
  • ksize:ksize高斯内核大小。 ksize.width和ksize.height可以不同,但​​它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。
  • sigmaX : X方向上的高斯核标准偏差。
  • sigmaY : Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于s如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出。(为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY)
  • borderType:
    在这里插入图片描述
    于推断图像外部像素的边界模式,有默认值BORDER_DEFAULT
import cv2
img = cv2.imread("123.png")
imgGau = cv2.GaussianBlur(img,(5,5),0)
cv2.imshow("img",img)
cv2.imshow("GaussianBlur",imgGau)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
细节实现原理

4、双边滤波:

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
在这里插入图片描述
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)

  • src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
  • d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第4个参数sigmaSpace计算该值。
  • sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace.
  • dst: 输出图像,和原图像有相同的尺寸和类型。
  • borderTypeborderType:
    在这里插入图片描述
    用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT
import cv2
img = cv2.imread("123.png")
imgBilateral = cv2.bilateralFilter(img,0,100,15)
cv2.imshow("img",img)
cv2.imshow("Bilateral",imgBilateral)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

练习题5:

用找到最好的方法对下图进行去噪:
在这里插入图片描述
评论出你的答案

发布了45 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_43505377/article/details/103763705