【盘算机视觉】图像滤波

[复制链接]
发表于 2025-12-11 15:59:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 图像滤波界说

图像滤波是一种非常紧张的图像处理惩罚技能,图像平滑、边沿检测、边沿加强、去除噪声都属于图像滤波,图像滤波是一种基于邻域的算法。
通过图像滤波,可以实现图像平滑、边沿检测;图像平滑也叫图像含糊,用以去除图像中的噪声、伪影等,它是图像处理惩罚和盘算机视觉的常见步调。
函数含糊范例特点使用场景cv.blur均值含糊简朴快速,全部像素权重相当根本平滑和降噪cv.GaussianBlur高斯含糊中央权重高,含糊结果更自然,边沿细节生存较好图像处理惩罚前降噪、边沿检测cv.medianBlur中值含糊抗噪本领强,尤其恰当去除椒盐噪声去噪或细节掩护的平滑处理惩罚2. 均值滤波

均值滤波是一种简朴的图像平滑方法,输出图像的每一个像素值都为其范畴内的全部原始图像像素值的均匀值。卷积核越大,滤波后的图像越含糊。
cv.blur 是 OpenCV 中的一种用于图像含糊处理惩罚的函数。它通过均值滤波(均匀含糊)来平滑图像,淘汰噪声和细节。以下是其详细功能和用法详解。
1. 函数界说
  1. cv.blur(src, ksize, dst=None, anchor=(-1, -1), borderType=cv.BORDER_DEFAULT) -> dst
复制代码

2. 参数详解


  • src

    • 输入图像,通常为单通道(灰度)或多通道(彩色)的矩阵。
    • 范例:numpy.ndarray

  • ksize

    • 滤波核的巨细,表现为 (width, height)。
    • 是一个元组,比方 (5, 5) 表现一个 5x5 的矩形核。
    • 核越大,含糊结果越显着。

  • dst(可选)

    • 输出图像,通常与输入图像巨细和范例雷同。假如未指定,会返回一个新的图像。

  • anchor(可选)

    • 滤波核的锚点,表现滤波核的参考点(默认值为 (-1, -1),纵然用核的中央作为锚点)。

  • borderType(可选)

    • 界限扩充模式,决定如那边置惩罚图像界限。常见选项:

      • cv.BORDER_CONSTANT:使用常量添补界限。
      • cv.BORDER_REFLECT:界限像素反射。
      • cv.BORDER_REFLECT_101:雷同反射,但不重复界限像素。
      • cv.BORDER_REPLICATE:复制界限像素。
      • cv.BORDER_WRAP:界限像素从另一侧复制。



3. 核心原理

cv.blur 是一种基于卷积的滤波方法。

  • 每个像素的值是由滤波核覆盖范围内的全部像素值的均匀值盘算得出的。
  • 公式:
    g(x,y)=1kw⋅kh∑u=0kw−1∑v=0kh−1f(x+u,y+v)g(x, y) = \frac{1}{k_w \cdot k_h} \sum_{u=0}^{k_w-1} \sum_{v=0}^{k_h-1} f(x+u, y+v)g(x,y)=kw​⋅kh​1​u=0∑kw​−1​v=0∑kh​−1​f(x+u,y+v)

    • ( g(x, y) ):输出图像的像素值。
    • ( f(x, y) ):输入图像的像素值。
    • ( k_w ),( k_h ):滤波核的宽和高。

3. 高斯滤波

高斯滤波是图像平滑或去噪的常用方法,高斯滤波的卷积核由高斯函数天生。
cv.GaussianBlur 是 OpenCV 中实现高斯含糊(Gaussian Blur)的函数,用于对图像举行平滑处理惩罚。相比平凡均值含糊 (cv.blur),高斯含糊接纳高斯权重分布,能更自然地淘汰图像噪声和细节,同时生存更多边沿信息。
1. 函数界说
  1. cv.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=0, borderType=cv.BORDER_DEFAULT) -> dst
复制代码
2. 参数详解


  • src

    • 输入图像,可以是单通道(灰度)或多通道(彩色)的图像。
    • 范例:numpy.ndarray

  • ksize

    • 高斯核巨细,表现为 (width, height),必须是奇数(如 (3, 3)、(5, 5))。
    • 假如指定核巨细为 (0, 0),会根据 sigmaX 和 sigmaY 自动盘算得当的核巨细。

  • sigmaX

    • X 方向上的高斯核标准差。
    • 标准差越大,含糊结果越显着。假如设置为 0,会根据核巨细自动盘算。

  • dst(可选)

    • 输出图像,与输入图像范例和巨细雷同。假如未指定,会返回一个新图像。

  • sigmaY(可选)

    • Y 方向上的高斯核标准差。假如设置为 0,默认与 sigmaX 雷同。

  • borderType(可选)

    • 界限扩展方式,决定如那边置惩罚图像界限。常见选项:

      • cv.BORDER_CONSTANT:用常量值添补界限。
      • cv.BORDER_REFLECT:界限像素反射。
      • cv.BORDER_REPLICATE:复制界限像素。
      • 等等。


3. 核心原理

高斯含糊通过高斯函数界说的权重对图像举行卷积。高斯函数的数学公式为:
G(x,y)=12πσ2exp⁡(−x2+y22σ2)G(x, y) = \frac{1}{2\pi \sigma^2} \exp\left(-\frac{x^2 + y^2}{2\sigma^2}\right)G(x,y)=2πσ21​exp(−2σ2x2+y2​)

  • 核心头脑是间隔中央点越远的像素权重越小,中央点的权重最大。
  • 核的外形和标准差 σ 决定含糊结果的强弱和范围。
4. 中值滤波

中值滤波是将每个像素值用范畴内全部像素值的中心值替换,差异于均值滤波和高斯滤波,中值滤波属于非线性滤波。
cv.medianBlur 是 OpenCV 中的一种中值含糊(Median Blur)处理惩罚函数,紧张用于去噪声,尤其对椒盐噪声有很好的克制结果。相比于均值含糊(cv.blur)和高斯含糊(cv.GaussianBlur),它更恰当在生存边沿的同时去除噪声。
以下是 cv.medianBlur 的详解:
1. 函数界说
  1. cv.medianBlur(src, ksize) -> dst
复制代码
2. 参数详解


  • src

    • 输入图像,可以是单通道(灰度)或多通道(彩色)的图像。
    • 范例:numpy.ndarray

  • ksize

    • 滤波核巨细,必须是正奇数(如 3, 5, 7)。
    • 核越大,含糊结果越强,但盘算量也越大。

  • 返回值 dst

    • 输出图像,与输入图像巨细和范例雷同。
    • 输出图像是中值含糊后的图像。

3. 核心原理

中值含糊是基于局部窗口(滤波核)的中值盘算。详细步调如下:

  • 选择窗口: 在目的像素附近,界说一个巨细为 ksize × ksize 的窗口。
  • 排序: 对窗口内的全部像素值举行排序。
  • 取中值: 用排序后的中心值更换窗口中央像素的值。
5. 双边滤波

双边滤波可以在去除噪声的同时,较好的生存图像的边沿;其卷积核综合思量了像素间的空间间隔和像素值的相似度。
1. 函数界说
  1. cv.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=cv.BORDER_DEFAULT) -> dst
复制代码
2. 参数详解


  • src

    • 输入图像,可以是单通道(灰度)或多通道(彩色)的图像。
    • 范例:numpy.ndarray

  • d

    • 滤波的像素邻域直径(kernel size),指定用于滤波盘算的地区范围。
    • 若设置为负值,则根据 sigmaSpace 自动盘算符合的值。

  • sigmaColor

    • 颜色空间的标准差,用于控制颜色相似性。
    • 值越大,颜色差异较大的像素也会加入含糊;值越小,仅对相近颜色的像素举行含糊。

  • sigmaSpace

    • 坐标空间的标准差,用于控制像素间的间隔权重。
    • 值越大,较远的像素也会影响当前像素;值越小,仅影响相近像素。

  • dst(可选)

    • 输出图像,与输入图像巨细和范例雷同。假如未指定,会返回一个新图像。

  • borderType(可选)

    • 界限处理惩罚方式,决定如那边置惩罚图像界限。常见选项:

      • cv.BORDER_CONSTANT:用常量值添补界限。
      • cv.BORDER_REFLECT:界限像素反射。
      • cv.BORDER_REPLICATE:复制界限像素。
      • 等等。



3. 核心原理

双边滤波是一种非线性滤波,联合了空间和颜色的双重信息对像素值举行加权均匀。其核心公式如下:
Ifiltered(p)=1Wp∑q∈ΩGs(∣∣p−q∣∣)⋅Gr(∣∣I(p)−I(q)∣∣)⋅I(q)I_{filtered}(p) = \frac{1}{W_p} \sum_{q \in \Omega} G_s(||p - q||) \cdot G_r(||I(p) - I(q)||) \cdot I(q)Ifiltered​(p)=Wp​1​q∈Ω∑​Gs​(∣∣p−q∣∣)⋅Gr​(∣∣I(p)−I(q)∣∣)⋅I(q)

  • ( p ) 和 ( q ):分别表现当前像素和邻域内像素。
  • ( \Omega ):滤波核的邻域范围。
  • ( G_s(||p - q||) ):空间权重,由坐标间隔 ( ||p - q|| ) 决定。
  • ( G_r(||I§ - I(q)||) ):颜色权重,由像素值差异 ( ||I§ - I(q)|| ) 决定。
  • ( W_p ):归一化系数,确保权重和为 1。
6. 自界说滤波

允许用户本身界说卷积核举行滤波。
cv.filter2D 是 OpenCV 中一个通用的二维卷积函数,允许用户对图像应用自界说的卷积核(滤波器)。它提供了一种机动的方式实现各种滤波操纵,比方锐化、边沿检测、含糊、浮雕结果等。
1. 函数界说
  1. cv.filter2D(src, ddepth, kernel, dst=None, anchor=(-1, -1), delta=0, borderType=cv.BORDER_DEFAULT) -> dst
复制代码
2. 参数详解


  • src

    • 输入图像,可以是灰度图像或彩色图像。
    • 范例:numpy.ndarray。

  • ddepth

    • 输出图像的深度(像素值范例),可以是以下选项之一:

      • cv.CV_8U:8 位无符号整数(标准图像)。
      • cv.CV_16U:16 位无符号整数。
      • cv.CV_16S:16 位有符号整数。
      • cv.CV_32F:32 位浮点数。
      • cv.CV_64F:64 位浮点数。

    • 若设为 -1,则输出图像的深度与输入图像雷同。

  • kernel

    • 卷积核(滤波器),通常是一个二维矩阵,界说滤波操纵的权重。
    • 范例:numpy.ndarray(比方,np.array([[...], [...], [...]]))。
    • 核的巨细必须是奇数(如 (3 \times 3)、(5 \times 5))。

  • dst(可选)

    • 输出图像,与输入图像巨细雷同。

  • anchor(可选)

    • 卷积核的锚点位置,表现核的哪个位置与输入图像像素对齐。默认值为 (-1, -1),表现核的中央点是锚点。
    • 比方,若核巨细为 (3 \times 3),默认锚点为 (1, 1)。

  • delta(可选)

    • 可选的偏移量,应用于卷积结果的每个像素。默认值为 0。

  • borderType(可选)

    • 界限像素添补方式,决定如那边置惩罚图像界限。常见选项包罗:

      • cv.BORDER_CONSTANT:添补常数值。
      • cv.BORDER_REFLECT:界限像素反射。
      • cv.BORDER_REPLICATE:复制界限像素。
      • 等等。


3. 核心原理

cv.filter2D 的工作原理是二维卷积。对于每个像素位置 ( (x, y) ),函数将卷积核与图像的对应地区举行逐点相乘并求和。其公式为:
dst(x,y)=∑i=0m−1∑j=0n−1kernel(i,j)⋅src(x+i−a,y+j−b)+deltadst(x, y) = \sum_{i=0}^{m-1} \sum_{j=0}^{n-1} kernel(i, j) \cdot src(x+i-a, y+j-b) + \text{delta}dst(x,y)=i=0∑m−1​j=0∑n−1​kernel(i,j)⋅src(x+i−a,y+j−b)+delta

  • ( m, n ):卷积核的宽度和高度。
  • ( (a, b) ):锚点的位置。
  • ( \text{delta} ):偏移量,默以为 0。
根本用法
  1. import cv2 as cv
  2. import numpy as np
  3. # 加载图像
  4. img = cv.imread('example.jpg', cv.IMREAD_GRAYSCALE)
  5. # 定义卷积核(例如:简单均值模糊核)
  6. kernel = np.ones((5, 5), np.float32) / 25
  7. # 应用卷积
  8. filtered_img = cv.filter2D(img, ddepth=-1, kernel=kernel)
  9. # 显示原图和卷积结果
  10. cv.imshow('Original', img)
  11. cv.imshow('Filtered', filtered_img)
  12. cv.waitKey(0)
  13. cv.destroyAllWindows()
复制代码
使用自界说卷积核
  1. # 锐化核
  2. sharpen_kernel = np.array([[ 0, -1,  0],
  3.                            [-1,  5, -1],
  4.                            [ 0, -1,  0]], np.float32)
  5. # 应用锐化卷积
  6. sharpened_img = cv.filter2D(img, ddepth=-1, kernel=sharpen_kernel)
  7. cv.imshow('Sharpened', sharpened_img)
  8. # 边缘检测核
  9. edge_kernel = np.array([[-1, -1, -1],
  10.                         [-1,  8, -1],
  11.                         [-1, -1, -1]], np.float32)
  12. # 应用边缘检测卷积
  13. edges_img = cv.filter2D(img, ddepth=-1, kernel=edge_kernel)
  14. cv.imshow('Edges', edges_img)
  15. cv.waitKey(0)
  16. cv.destroyAllWindows()
复制代码
5. 常用卷积核

功能卷积核(Kernel)均值含糊(19[111111111](\frac{1}{9}\begin{bmatrix}1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1\end{bmatrix}(91​​111​111​111​​高斯含糊([121242121]/16)(\begin{bmatrix}1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1\end{bmatrix} / 16)(​121​242​121​​/16)锐化([0−10−15−10−10](\begin{bmatrix}0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0\end{bmatrix}(​0−10​−15−1​0−10​​)程度边沿检测([−1−1−1000111](\begin{bmatrix}-1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1\end{bmatrix}(​−101​−101​−101​​)垂直边沿检测([−101−101−101](\begin{bmatrix}-1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1\end{bmatrix}(​−1−1−1​000​111​​)拉普拉斯边沿检测([−1−1−1−18−1−1−1−1](\begin{bmatrix}-1 & -1 & -1 \\ -1 & 8 & -1 \\ -1 & -1 & -1\end{bmatrix}(​−1−1−1​−18−1​−1−1−1​​)浮雕结果([−2−10−111012](\begin{bmatrix}-2 & -1 & 0 \\ -1 & 1 & 1 \\ 0 & 1 & 2\end{bmatrix}(​−2−10​−111​012​​)
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表