OpenCV第七章——滤波器

1.均值滤波器

均值滤波(Mean Filtering)是一种常用的图像处理技术,主要用于去除图像中的噪声,平滑图像。它通过对图像进行局部区域的平均操作来实现。以下是均值滤波的基本原理和步骤:

原理

均值滤波的核心思想是用图像中每个像素的邻域像素的均值来替代该像素的值。这样做的目的是减少图像中的局部噪声,并使图像更加平滑。

步骤

  1. 定义滤波器(卷积核): 滤波器通常是一个矩形的区域(比如3x3、5x5的矩阵),其大小决定了计算均值时考虑的邻域范围。

  2. 滑动滤波器: 将滤波器在图像上逐像素滑动(也就是移动滤波器到图像的每一个位置)。

  3. 计算均值: 对于每个位置,将滤波器覆盖的区域内的所有像素值求平均,这个平均值就作为该位置像素的新值。

  4. 更新图像: 用计算出的均值替换原图像中对应位置的像素值。

OpenCV将均值滤波器封装成了blur()方法, 语法结构如下:

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

参数说明:

src:被处理的图像

ksize:滤波核大小, 其格式为(高度, 宽度)建议宽高相等的奇数边长,滤波核越大, 处理后图像越模糊。

anchor:可选参数,滤波核的锚点

borderType:可选参数,边界样式

下面是一个均值滤波操作示例:

python 复制代码
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(5).jpg")  
dst1 = cv2.blur(img, (3, 3))  # 使用大小为3*3的滤波核进行均值滤波
dst2 = cv2.blur(img, (5, 5))  # 使用大小为5*5的滤波核进行均值滤波
dst3 = cv2.blur(img, (9, 9))  # 使用大小为9*9的滤波核进行均值滤波
cv2.imshow("img", img)  
cv2.imshow("3*3", dst1)  # 显示滤波效果
cv2.imshow("5*5", dst2)
cv2.imshow("9*9", dst3)
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

2.中值滤波器

中值滤波(Median Filtering)是一种图像处理技术,用于去除图像中的噪声,尤其是盐和胡椒噪声。与均值滤波不同,中值滤波通过替换像素值为其邻域像素值的中位数来平滑图像,而不是均值。

原理

中值滤波的核心思想是对图像中的每个像素点,其邻域内的像素值进行排序,然后用这些值的中位数替代原像素的值。这样做有助于去除孤立的噪声点,而不会像均值滤波那样导致图像的边缘模糊。

步骤

  1. 定义滤波器(窗口): 滤波器通常是一个矩形区域(如3x3、5x5的矩阵),确定了计算中位数时的邻域范围。

  2. 滑动滤波器: 将滤波器在图像上逐像素滑动,即移动滤波器到图像的每一个位置。

  3. 计算中位数: 对于滤波器覆盖的每个位置,提取该区域内的所有像素值,将它们排序,找到中间的值,这个值就是该位置像素的新值。

  4. 更新图像: 用计算出的中位数替换原图像中对应位置的像素值。

OpenCV将均值滤波器封装成了medianBlur()方法, 语法结构如下:

dst = cv2.medianBlur(src, ksize)

参数说明:

src:被处理的图像

ksize:滤波核大小, 其格式为(高度, 宽度)建议宽高相等的奇数边长,滤波核越大, 处理后图像越模糊。

下面是一个中值滤波的操作代码:

python 复制代码
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(5).jpg")  
dst1 = cv2.medianBlur(img, 3)  # 使用宽度为3的滤波核进行中值滤波
dst2 = cv2.medianBlur(img, 5)  # 使用宽度为5的滤波核进行中值滤波
dst3 = cv2.medianBlur(img, 9)  # 使用宽度为9的滤波核进行中值滤波
cv2.imshow("img", img)  
cv2.imshow("3", dst1)  
cv2.imshow("5", dst2)
cv2.imshow("9", dst3)
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

3.高斯滤波器

高斯滤波是一种图像处理技术,用于平滑图像并减少噪声。这种方法使用了高斯函数来对图像进行卷积。以下是高斯滤波的基本概念:

高斯函数

高斯函数是一个数学函数,其形状呈钟形曲线,定义为: [ G(x, y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} ] 其中:

  • ( x ) 和 ( y ) 是像素的坐标。
  • ( \sigma ) 是标准差,控制高斯函数的宽度和形状。

卷积

在高斯滤波中,我们使用一个高斯卷积核(或滤波器)来处理图像。这个核的尺寸和形状由高斯函数决定。高斯滤波的过程如下:

  1. 构造高斯核:根据所需的标准差 (\sigma) 和核的大小,构造一个高斯函数矩阵。这个矩阵的值反映了邻域内每个像素对中心像素的影响程度。

  2. 卷积操作:将高斯核与图像的每个像素进行卷积操作。这意味着将核的每个值与图像上对应像素的值相乘,然后求和,得到新的像素值。这个过程会在图像的每个位置进行。

  3. 平滑效果:卷积操作后,图像的每个像素值都会被替换为其邻域内的加权平均值。高斯核的中心值权重最大,离中心较远的像素权重较小。这样,图像会变得更加平滑,噪声会被减少。

应用

高斯滤波主要用于以下目的:

  • 去噪:减少图像中的随机噪声。
  • 平滑:使图像变得更柔和,减少细节。
  • 边缘检测前的预处理:在进行边缘检测之前,使用高斯滤波可以减少图像中的噪声,提高边缘检测的效果。

总的来说,高斯滤波是一种有效的图像平滑工具,通过减少高频噪声来提高图像的质量。
OpenCV将高斯滤波器封装成了GaussianBlur()方法,语法结构如下:

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

参数说明:

src:被处理的图像

ksize:滤波核的大小,宽高必须是奇数

sigmaX:卷积核水平方向的标准差

sigmaY:卷积核数值方向的标准差

(两个参数写为0, 方法会自动根据滤波核的大小自动计算出合适的权重比例)

borderType:可选参数, 边界样式

下面是高斯滤波操作代码示例:

python 复制代码
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(5).jpg")  
dst1 = cv2.GaussianBlur(img, (5, 5), 0, 0)  # 使用大小为5*5的滤波核进行高斯滤波
dst2 = cv2.GaussianBlur(img, (9, 9), 0, 0)  # 使用大小为9*9的滤波核进行高斯滤波
dst3 = cv2.GaussianBlur(img, (15, 15), 0, 0)  # 使用大小为15*15的滤波核进行高斯滤波
cv2.imshow("img", img)  
cv2.imshow("5", dst1)  
cv2.imshow("9", dst2)
cv2.imshow("15", dst3)
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像如下:

4.双边滤波器

双边滤波器(Bilateral Filter)是一种图像平滑技术,旨在去除噪声同时保持边缘。与传统的滤波器不同,双边滤波器在平滑图像时不仅考虑空间距离,还考虑像素值的差异,从而更好地保留图像细节。

原理

双边滤波器通过结合两个加权函数来计算每个像素的新值:

  1. 空间权重:基于像素在空间上的距离,距离较近的像素对中心像素的影响更大。
  2. 强度权重:基于像素值的差异,值相似的像素对中心像素的影响更大。

步骤

  1. 定义滤波器窗口:选择一个窗口大小(例如5x5),并在图像上逐像素滑动。
  2. 计算权重:对于每个像素,计算空间权重和强度权重,权重的计算基于高斯函数。
  3. 加权平均:使用计算出的权重对窗口内的像素进行加权平均,得到新的像素值。

优点

  • 边缘保留:在平滑过程中有效保留图像的边缘和细节。
  • 噪声去除:能够去除噪声的同时减少对图像结构的破坏。

应用

  • 图像去噪:减少噪声,同时保持图像细节。
  • 图像增强:平滑图像而不损失边缘信息。

双边滤波器是处理图像时一个强大的工具,特别适合需要细节保留的应用场景。
OpenCV将双边滤波器封装成了bilateralFilter()方法, 语法结构如下:

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

参数说明:

src:被处理的图像

d:以当前像素为中心的整个滤波区域的直径

,若d<0,则自动根据sigmaSpace参数计算得到,该值与保留的边缘信息数量成正比, 与方法运行效率成正比

sigmaSpace:坐标空间的sigma值, 该值越大, 参与计算的像素数量就越多

borderType:可选参数, 边界样式

下面是一个双边滤波操作与高斯滤波操作对比代码示例:

python 复制代码
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(5).jpg")  
dst1 = cv2.GaussianBlur(img, (15, 15), 0, 0)  # 使用大小为15*15的滤波核进行高斯滤波
# 双边滤波,选取范围直径为15,颜色差为120
dst2 = cv2.bilateralFilter(img, 15, 120, 100)
cv2.imshow("img", img)  
cv2.imshow("Gauss", dst1)  # 高斯滤波效果
cv2.imshow("bilateral", dst2)  # 双边滤波效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果如下:

那么有关于滤波器的 解释就到这里了,谢谢大家的观看!!!

相关推荐
嗨,紫玉灵神熊11 分钟前
使用 OpenCV 实现图像中心旋转
图像处理·人工智能·opencv·计算机视觉
cmoaciopm15 分钟前
FastGPT部署的一些问题整理
人工智能
odoo中国19 分钟前
机器学习实操 第一部分 机器学习基础 第6章 决策树
人工智能·决策树·机器学习
giszz20 分钟前
DeepSeek提示词技巧
人工智能
AI技术学长22 分钟前
训练神经网络的批量标准化(使用 PyTorch)
人工智能·pytorch·神经网络·数据科学·计算机技术·批量标准化
ccLianLian24 分钟前
深度学习·经典模型·Transformer
人工智能·深度学习·transformer
Chat_zhanggong34536 分钟前
deepseek海思SD3403边缘计算AI产品系统
人工智能·边缘计算
人大博士的交易之路1 小时前
龙虎榜——20250429
人工智能·数学建模·数据挖掘·量化分析·涨停回马枪·龙虎榜
哲讯智能科技1 小时前
无锡哲讯科技:SAP财务系统——赋能企业智慧财务管理
大数据·人工智能
爱吃饼干的熊猫1 小时前
(开源)视频画面增强模型:Ev-DeblurVSR (可以解决视频画面不清晰的问题)
计算机视觉·开源