OpenCV||超详细的图像平滑

消除噪声的工作称为图像平滑

平滑处理算法

  • 基于二维离散卷积的高斯平滑、均值平滑;
  • 基于统计学方法的中值平滑;
  • 具备保持边缘作用的双边滤波、导向滤波。

平滑滤波算法:线性平滑、非线性平滑、自适应平滑

一、线性滤波

1.1 归一化方框滤波器

概述:归一化方框滤波器,也被称为均值滤波器,是图像处理中常用的一种线性滤波技术。其核心思想在于,通过计算图像中每个像素点周围邻域内像素值的平均值,来替代该像素点的原始值,从而达到平滑图像的目的。

特点

  1. 线性:均值滤波是一种线性滤波技术,其输出是输入像素值的线性组合。
  2. 平滑效果:能够有效地去除图像中的随机噪声,但同时也会使图像变得模糊,特别是在图像的边缘部分。
  3. 计算简单:由于只涉及平均值的计算,因此均值滤波的计算复杂度相对较低。

API:

在OpenCV中,均值滤波可以通过cv2.blur()函数实现。该函数的参数包括要处理的图像、核的大小(即窗口的大小)等。需要注意的是,cv2.blur()函数内部实际上已经实现了归一化处理,因此无需额外进行归一化操作。

示例

复制代码
import cv2  
  
# 读取图像  
img = cv2.imread('path_to_image.jpg')  
  
# 应用均值滤波  
blurred_img = cv2.blur(img, (5, 5))  # 核的大小为5x5  
  
# 显示结果  
cv2.imshow('Original Image', img)  
cv2.imshow('Blurred Image', blurred_img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

注意事项

  • 核的大小:核的大小会直接影响滤波的效果。核越大,平滑效果越明显,但图像也会变得更加模糊。
  • 噪声类型:均值滤波对于随机噪声(如高斯噪声)有较好的去除效果,但对于某些类型的噪声(如椒盐噪声)效果可能不佳。
  • 边缘效应:由于均值滤波会计算邻域内的平均值,因此在图像的边缘部分可能会出现模糊效应。为了减轻这种效应,可以在滤波前对图像进行边界扩展处理。

1.2 高斯滤波

高斯滤波对去除高斯噪声有很好的效果

概念:高斯滤波通过对图像中的每个像素点应用高斯函数,将其邻域内的像素值加权平均后替换原像素值。高斯函数是一个钟形曲线,其标准差(σ)决定了曲线的宽度和平滑程度。标准差越大,曲线越宽,滤波效果越明显,图像越模糊。

实现方式

  • 用离散化窗口滑窗卷积(常用)
  • 傅里叶变换(当离散化的窗口非常大、用滑窗计算量非常大的情况使用)

卷积知识

  • 卷积核:用来对图像矩阵进行平滑的矩阵,也称为过滤器;
  • 锚点:卷积核和图像矩阵重叠,进行内积运算后,锚点位置的像素点会被计算值取代。一般选取奇数卷积核的中心点作为锚点。
  • 步长:卷积核沿着图像矩阵每次移动的长度。
  • 内积:卷积核和图像矩阵对应像素点相乘,然后相加得到一个总和(不要和矩阵乘法弄混淆)。

API:

复制代码
cv2.GaussianBlur()
  • src:输入图像。
  • ksize:高斯核的大小,(宽度, 高度)。宽度和高度都应为正数和奇数,或者可以设置为(0, 0),此时由sigma计算得出。
  • sigmaX:X方向上的高斯核标准差。如果sigmaX为零,则从ksize.width中计算得出;如果两个sigma都为零,则分别从ksize.widthksize.height中计算得出;如果它们都不为零,则分别指定高斯核在X和Y方向上的标准差。
  • sigmaY:Y方向上的高斯核标准差。如果sigmaY为零,则与sigmaX相同。

注意事项

  • 核大小(ksize)和标准差(sigma)是控制高斯滤波效果的关键参数。核越大,标准差越大,图像的平滑效果就越明显,但可能会丢失更多的细节。
  • 在某些情况下,你可能需要根据图像的噪声类型和程度来调整这些参数,以达到最佳的滤波效果。
  • 高斯滤波是一种线性滤波技术,它在平滑图像的同时可能会模糊边缘和细节。因此,在选择滤波参数时需要权衡平滑效果和细节保留之间的平衡。

二、非线性滤波

2.1 中值滤波

概念:中值滤波用像素点领域灰度值的中值来代替该像素点的灰度值,也就是说用一片区域的中间值来代替所有值,可以除去最大值、最小值。

优点:对除去斑点噪声和椒盐噪声很有用,均值滤波噪声也被参与运算。

缺点:中值滤波的时间在均值滤波的5倍以上。

API

复制代码
dst = cv2.medianBlur(src, ksize)
  • src:源图像,可以是任意数量的单通道图像,数据类型为8位或浮点型。
  • ksize:中值滤波的窗口大小,必须是正奇数(例如3, 5, 7等)。这是中值滤波中最重要的参数。它定义了滤波器窗口的大小,窗口内的像素值将被用来计算中值。由于中值滤波是一个邻域操作,因此窗口大小的选择对滤波效果有显著影响。窗口越大,滤波效果越强,但同时可能会导致图像细节的损失。通常,窗口大小的选择取决于图像中噪声的强度和分布。

注意事项

  • 中值滤波对椒盐噪声特别有效,但可能不适用于其他类型的噪声(如高斯噪声)。
  • 窗口大小的选择应根据具体应用场景和噪声特性进行调整。
  • 滤波后的图像可能会损失一些细节信息,因此在实际应用中需要权衡滤波效果和细节保留之间的关系。

2.2 双边滤波

概念:双边滤波(Bilateral Filter)是一种非常有效的图像去噪技术,它能够在去除噪声的同时很好地保持边缘信息。双边滤波不仅考虑像素之间的空间邻近度,还考虑像素值之间的相似性,这使得它在处理图像时能够同时去除噪声和保持边缘清晰。

优点:

  1. 边缘保持:双边滤波能够很好地保持图像的边缘信息。这是因为它在滤波过程中同时考虑了像素的空间邻近度和颜色相似性。空间上接近且颜色相似的像素会被赋予更高的权重,从而保留了边缘细节。
  2. 去噪能力强:对于图像中的噪声,双边滤波能够有效地去除,特别是对于那些颜色与周围像素差异较大的噪声点(如椒盐噪声)。
  3. 适用范围广:双边滤波不仅适用于灰度图像,也适用于彩色图像。在彩色图像中,它可以分别对每个颜色通道进行处理,或者在转换到适当的颜色空间后进行处理,以更好地去除噪声并保留颜色信息。
  4. 自动卡通化或图画滤波器:双边滤波的强大功能可以使其作为一个自动的卡通化或图画滤波器,通过平滑平坦区域同时保持边缘锐化,使图像看起来更加清晰和生动。

缺点:

  1. 计算复杂度高:双边滤波的计算复杂度相对较高,因为它需要为每个像素点计算其邻域内所有像素点的权重,并根据这些权重进行加权平均。这导致双边滤波的运行时间相对较长,特别是对于大尺寸图像或高分辨率图像。
  2. 可能保留高频噪声:尽管双边滤波在去除噪声方面表现出色,但它可能会保留一些高频噪声,特别是当噪声的颜色与周围像素相似时。这是因为双边滤波在颜色相似性方面也有一定的容忍度,导致一些高频噪声可能无法被完全去除。
  3. 参数选择敏感:双边滤波的效果很大程度上取决于其参数的选择,包括滤波器的直径(d)、颜色空间的标准差(sigmaColor)和坐标空间的标准差(sigmaSpace)。选择合适的参数需要一定的经验和试验,否则可能导致滤波效果不理想。
  4. 可能导致图像模糊:如果参数设置不当,特别是当sigmaSpace值过大时,双边滤波可能会导致图像边缘模糊。这是因为过大的sigmaSpace值会使距离较远的像素点也参与滤波计算,从而模糊了边缘信息。

API

复制代码
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType=cv2.BORDER_DEFAULT)
  • src:输入图像,即需要进行滤波处理的图像。
  • d:滤波器的直径。这个参数定义了滤波时考虑的邻域范围的大小,它必须是正奇数。直径越大,滤波效果越明显,但同时计算量也越大。
  • sigmaColor:颜色空间的标准差,用于控制颜色相似性的权重。该值越大,表示在颜色上越接近的像素点将具有更大的权重,即更多的颜色将被混合在一起。这有助于去除颜色噪声,但过大的值可能会导致图像颜色过于平滑。
  • sigmaSpace:坐标空间的标准差,用于控制空间邻近度的权重。该值越大,表示在位置上越接近的像素点将具有更大的权重,即更多的像素将被包括在滤波过程中。这有助于去除空间噪声,但过大的值可能会导致边缘模糊。
  • borderType (可选):边界像素的外推方法,默认值为cv2.BORDER_DEFAULT。这个参数在大多数情况下可以保持默认值。

注意事项

  • 选择合适的dsigmaColorsigmaSpace值对于获得理想的滤波效果至关重要。较小的d值会导致较快的处理速度,但可能会错过一些噪声。较大的sigmaColor值会导致更多的颜色混合,可能使图像看起来过于平滑。而sigmaSpace值的选择则需要在去除噪声和保留细节之间找到平衡。
  • 双边滤波在处理具有明显边缘的图像时效果尤为显著,因为它能够在去除噪声的同时保持边缘的清晰度。
  • 由于双边滤波需要同时考虑颜色和空间两个因素,因此其计算量相对较大,处理速度可能不如一些简单的滤波方法。

链接跳转:

章节一、OpenCV||超细节的基本操作

章节二、OpenCV||超简略的Numpy小tip

章节三、OpenCV||超详细的图像处理模块

章节四、OpenCV||超详细的灰度变换和直方图修正

章节六、OpenCV||超详细的几何变换

相关推荐
NAGNIP11 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab12 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab12 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP16 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年16 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼16 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS16 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区17 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈17 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang18 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx