Skip to content

Latest commit

 

History

History
131 lines (101 loc) · 4.46 KB

File metadata and controls

131 lines (101 loc) · 4.46 KB

GitHub上markdown的显示效果有些和我在线编辑的有些出入。需要更好的阅读体验可以通过在线预览markdown的方式:https://markdown.lovejade.cn/

高斯模糊效果的实现原理

极简总结步骤:

  1. 将图片转为像素矩阵
  2. 确认卷积核并进行矩阵运算 接下来分步骤详细拆解
将图片转为像素矩阵

所有图片均由像素点组成。每个像素都由颜色通道值组成。对于最常见的三通道像素值(rgb三通道),每个通道占一个字节,也就是8个二进制位,计算机中也经常用3个16进制表示。例如:红色像素 (255, 0, 0) → 字节表示为 [0xFF, 0x00, 0x00]。 那么对于一个2*2像素的rgb图像,可以被转为这样的像素矩阵:

[(R1,G1,B1), (R2,G2,B2)]  // 第一行像素
[(R3,G3,B3), (R4,G4,B4)]  // 第二行像素
高斯核的构造

高斯模糊效果所用的卷积核的公式:

K(x,y)=12πσ2e−x2+y22σ2

LaTeX代码: K(x, y) = \\frac{1}{2\\pi \\sigma^2} e^{-\\frac{x^2 + y^2}{2\\sigma^2}}

变量解释:(x,y):像素相对于核中心的坐标 σ:标准差,控制模糊强度(σ>0)。 数学原理在此不做展开解释

构造一个3*3的卷积核

$$ K = \frac{1}{16} \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{bmatrix} $$

详细说明这个卷积核是如何构造出来的:

  1. 确定采样点:对于 3×3 的核,我们取 x 和 y 在 [-1, 0, 1] 上的整数值。因此需要计算以下9个点的值: (x,y) = (-1,-1), (-1,0), (-1,1), (0,-1), (0,0), (0,1), (1,-1), (1,0), (1,1)
  2. 计算各点的高斯值: G(-1,-1) = (1/2π)e^(-(1+1)/2) = (1/2π)e^-1 ≈ 0.0585 G(-1,0) = (1/2π)e^(-(1+0)/2) = (1/2π)e^-0.5 ≈ 0.0965 G(-1,1) = 同 G(-1,-1) ≈ 0.0585 G(0,-1) = 同 G(-1,0) ≈ 0.0965 G(0,0) = (1/2π)e^0 = 1/2π ≈ 0.1592 G(0,1) = 同 G(0,-1) ≈ 0.0965 G(1,-1) = 同 G(-1,-1) ≈ 0.0585 G(1,0) = 同 G(-1,0) ≈ 0.0965 G(1,1) = 同 G(-1,-1) ≈ 0.0585
  3. 将上述值排列成矩阵:

$$ \begin{bmatrix}0.0585 & 0.0965 & 0.0585 \0.0965 & 0.1592 & 0.0965 \0.0585 & 0.0965 & 0.0585 \\ \end{bmatrix} $$

  1. 计算归一化系数:总和 ≈ 4×0.0585 + 4×0.0965 + 0.1592 ≈ 0.234 + 0.386 + 0.159 ≈ 0.779。归一化系数为 1/0.779 ≈ 1.2837
  2. 归一化后的核:将每个元素乘以归一化系数: 0.0585×1.2837 ≈ 0.075 0.0965×1.2837 ≈ 0.124 0.1592×1.2837 ≈ 0.204
  3. 近似为整数:为了简化计算,通常会将核中的值近似为最接近的整数比例: 0.075 ≈ 1/16 0.124 ≈ 2/16 0.204 ≈ 4/16

因此得到常用的整数比例核:

$$ K = \frac{1}{16} \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{bmatrix} $$

矩阵运算实现高斯模糊效果

假设有一个 3×3 的 RGB 图像和一个 3×3 高斯核。图像的像素矩阵为:

[
    [[100, 50, 20], [200, 100, 30], [50, 60, 70]],
    [[80, 90, 10], [150, 120, 80], [90, 80, 70]],
    [[70, 60, 50], [110, 100, 90], [40, 30, 20]]
]

高斯核为:

$$ K = \frac{1}{16} \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{bmatrix} $$

那么计算步骤可表示为(以R通道为例):

  1. 提取 R 通道的 3×3 区域:
[[100, 200, 50],
 [80, 150, 90],
 [70, 110, 40]]
  1. 逐元素乘以核权重并求和:
100 * 0.0625 + 200 * 0.125 + 50 * 0.0625 +
80 * 0.125  + 150 * 0.25  + 90 * 0.125  +
70 * 0.0625 + 110 * 0.125 + 40 * 0.0625 = 122.5
  1. 对 G、B 通道重复上述操作,得到输出像素 [122, 92, 52]。那么,一个3*3像素的区域,在与卷积核矩阵运算后,就变为单个像素。
  2. 最后,需要注意的是,对于一个4 * 4像素的图像,需要操作的矩阵运算次数为4次。原理很容易理解,将卷积核理解为一个窗口,对左上角9个像素进行矩阵运算后,将这个“窗口”向右平移一个单位,再进行矩阵运算。每次平移一个单位,如此往复,最终就是进行4次矩阵运算,输出一个2*2像素的图像。