高斯模糊

123 阅读8分钟

背景与简介

此前,我在开发一款 ASCII 渲染程序时,偶然看到 Computerphile 频道的一则视频。视频中建议,如果要在图像中使用边缘检测技术,最好先对图像进行高斯模糊处理。

那么,什么是高斯模糊呢?简单来说,它是一种借助高斯函数实现的图像模糊技术。通过这一技术处理后的图像,不仅能呈现出柔和的模糊效果,图像原有的色彩信息还能最大程度得以保留。

从原理上看,“高斯” 二字源于 “钟形曲线”(即正态分布)。与普通的均值采样模糊不同,高斯模糊采用正态分布采样来实现图像模糊。从正态分布曲线(如下图所示)可以清晰看到,数值主要集中在中心区域,随着与中心距离的增加,数值会逐渐减小。这一特性正是高斯模糊效果的核心逻辑来源。

image.png

(注:原文此处配有正态分布曲线示意图,图中标注了 - 4σ 到 4σ 的标准差范围,并分别对应 68.3%、95.4%、99.7% 的数值分布比例,图片来源为维基共享资源)

高斯模糊与盒式模糊的对比

为了更直观地理解高斯模糊的特点,我们可以将其与盒式模糊(Box Blur)进行对比。

从处理后的图像效果来看,若不仔细观察,很难直接区分两者的差异,尤其是在使用较小参数进行模糊处理时。但当我们将图像放大到单个像素级别,就能明显发现两者的不同:

image.png

  • 高斯模糊:像素颜色过渡更为平滑自然,中心像素对周围像素的影响呈现出渐进式衰减,不会出现明显的色彩断层。

  • 盒式模糊:由于采用了简单的均值计算(将 kernel 内所有像素颜色求和后除以像素数量),相邻像素对中心像素的影响强度一致,放大后容易看到生硬的色彩边界,模糊效果相对粗糙。

image.png

高斯模糊的核心公式

高斯模糊的实现依赖于高斯函数生成的卷积核(Kernel Convolution)。若你对卷积核的概念尚不了解,可参考相关视频教程(原文作者推荐了一则讲解清晰的视频)。其核心公式如下:

G(x,y)=12πσ2ex2+y22σ2G(x, y) = \frac{1}{2\pi\sigma^2} \, e^{ -\frac{x^2 + y^2}{2\sigma^2} }

公式中各参数的含义如下:

  • x,yx, y:像素坐标(在编程中通常称为索引),用于定位卷积核内的具体像素位置。

  • σ\sigma(西格玛):控制模糊强度和范围的关键参数,后文会详细说明。

  • ee:欧拉数(约等于 2.718281828459045)。

  • π\pi:圆周率(约等于 3.1416)。

需要特别注意的是,通过该公式生成的卷积核,所有数值之和应接近 1(且不超过 1)。这是因为 “1” 代表 100% 保留原图信息,若总和为 0.6,则意味着最终图像仅保留了原图 60% 的色彩信息,若总和偏离 1 过多,会导致图像过亮或过暗。

公式的两大组成部分

高斯函数可拆分为 “归一化因子” 和 “指数衰减项”,两者共同决定了卷积核的数值分布。

1. 归一化因子(Normalization Factor)

公式:12πσ2\frac{1}{2\pi\sigma^2}

作用:确保卷积核内所有数值之和接近 1,避免图像因数值总和异常导致色彩失真。若缺少归一化因子,处理后的图像可能出现整体过亮(总和大于 1)或过暗(总和小于 1)的问题,严重偏离原图色彩基调。

2. 指数衰减项(Exponential Decay)

公式:ex2+y22σ2e^{ -\frac{x^2 + y^2}{2\sigma^2} }

作用:决定卷积核内各像素对中心像素的影响权重。由于高斯函数的正态分布特性,该部分会生成 “中心数值大、边缘数值小” 的权重分布 —— 距离中心像素越远,权重越小,从而实现自然的模糊过渡。

这一特性正是高斯模糊优于盒式模糊的关键:盒式模糊中所有相邻像素权重相同,而高斯模糊通过指数衰减,让中心像素始终保持较强的 “主导地位”,避免相邻像素过度干扰中心色彩,使模糊效果更贴近人眼对 “柔和模糊” 的感知。

关键参数 σ\sigma(西格玛)的作用

σ\sigma 是控制高斯模糊效果的核心参数,主要有两大功能:

  1. 决定模糊强度σ\sigma 的数值越大,模糊效果越强。例如,σ=1\sigma=1 时仅产生轻微模糊,σ=5\sigma=5 时图像会呈现明显的朦胧感。

  2. 影响卷积核尺寸:卷积核尺寸(通常用 n×nn \times n 表示,nn 为奇数)可通过 σ\sigma 估算,公式为:n2×3σ+1n \approx 2 \times \lceil 3\sigma \rceil + 1。其中 \lceil \cdot \rceil 表示向上取整,该公式能确保卷积核覆盖正态分布中 99.7% 的关键区域,避免因核尺寸过小导致模糊效果不完整。

高斯模糊的实现步骤

以生成一个 5×55 \times 5σ=3\sigma=3 的卷积核为例,详细说明实现过程(为了更清晰地展示 “非标准核尺寸” 的处理逻辑,此处未使用上述核尺寸估算公式,而是手动设定为 5×55 \times 5)。

步骤 1:初始化卷积核并调整坐标

首先创建一个 5×55 \times 5 的空卷积核(初始值均为 0):

[0000000000000000000000000]\begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ \end{bmatrix}

由于高斯函数以中心为原点(x=0,y=0x=0, y=0),需要将卷积核的坐标进行调整:

  • 卷积核的中心位置(原索引为 (2,2)(2,2))对应 (x=0,y=0)(x=0, y=0)

  • 左上角位置(原索引为 (0,0)(0,0))对应 (x=2,y=2)(x=-2, y=-2),其他位置以此类推(如 (0,1)(0,1) 对应 (x=2,y=1)(x=-2, y=-1))。

在编程实现时,需通过代码逻辑将卷积核的索引转换为上述坐标(例如,对于 n×nn \times n 的核,中心偏移量为 n12\frac{n-1}{2},某点索引 (i,j)(i,j) 对应的坐标为 x=in12x = i - \frac{n-1}{2}y=jn12y = j - \frac{n-1}{2})。

步骤 2:遍历计算卷积核数值

通过双重循环(遍历 xxyy 方向),将每个坐标代入高斯公式计算对应数值,核心逻辑如下:

Loop x:
    Loop y:
        x, y = figuring out how to present 0 index value to -2 x,y point
        apply gaussian function with x, y
    End Loop
End Loop

计算示例

以两个关键位置为例,展示具体计算过程(取 π=3.1416\pi=3.1416e=2.718281828459045e=2.718281828459045):

  1. 中心位置(x=0, y=0)
  • 第一步:计算归一化因子

    12×3.1416×320.017683\frac{1}{2 \times 3.1416 \times 3^2} \approx 0.017683

  • 第二步:计算指数衰减项

    e02+022×32=e0=1e^{ -\frac{0^2 + 0^2}{2 \times 3^2} } = e^0 = 1

  • 第三步:两者相乘得到结果

    0.017683×10.017680.017683 \times 1 \approx 0.01768

  1. 左上角位置(x=-2, y=-2)
  • 第一步:归一化因子与中心位置相同,约为 0.017683

  • 第二步:计算指数衰减项

    e(2)2+(2)22×32=e8180.68e^{ -\frac{(-2)^2 + (-2)^2}{2 \times 3^2} } = e^{ -\frac{8}{18} } \approx 0.68

  • 第三步:两者相乘得到结果

    0.017683×0.680.011340.017683 \times 0.68 \approx 0.01134

按照上述方法计算所有位置后,得到初始卷积核:

[0.011340.013650.014160.013650.011340.013650.015820.016720.015820.013650.014160.016720.017680.016720.014160.013650.015820.016720.015820.013650.011340.013650.014160.013650.01134]\begin{bmatrix} 0.01134 & 0.01365 & 0.01416 & 0.01365 & 0.01134 \\ 0.01365 & 0.01582 & 0.01672 & 0.01582 & 0.01365 \\ 0.01416 & 0.01672 & 0.01768 & 0.01672 & 0.01416 \\ 0.01365 & 0.01582 & 0.01672 & 0.01582 & 0.01365 \\ 0.01134 & 0.01365 & 0.01416 & 0.01365 & 0.01134 \\ \end{bmatrix}

从该卷积核可以清晰看到,数值从中心向边缘逐渐减小,完全符合高斯函数的正态分布特性。

步骤 3:卷积核的归一化修正

此时若计算初始卷积核所有数值的和,会发现结果约为 0.3465,远小于 1。这是因为我们手动设定了 5×55 \times 5 的核尺寸,未遵循 σ=3\sigma=3 对应的标准核尺寸(按公式计算应为 2×3×3+1=19×192 \times \lceil 3 \times 3 \rceil + 1 = 19 \times 19),导致数值分布不完整。

若直接使用该卷积核,最终图像仅能保留原图 30% 左右的色彩信息,会明显过暗。因此需要进行归一化修正,具体方法为:将卷积核内每个数值除以所有数值的总和,并用新结果替换原数值

以中心数值 0.01768 为例,修正后的结果为:0.01768÷0.34650.05100.01768 \div 0.3465 \approx 0.0510

按照此方法修正所有数值后,得到最终的归一化卷积核:

[0.03270.03940.04090.03940.03270.03940.04560.04820.04560.03940.04090.04820.05100.04820.04090.03940.04560.04820.04560.03940.03270.03940.04090.03940.0327]\begin{bmatrix} 0.0327 & 0.0394 & 0.0409 & 0.0394 & 0.0327 \\ 0.0394 & 0.0456 & 0.0482 & 0.0456 & 0.0394 \\ 0.0409 & 0.0482 & 0.0510 & 0.0482 & 0.0409 \\ 0.0394 & 0.0456 & 0.0482 & 0.0456 & 0.0394 \\ 0.0327 & 0.0394 & 0.0409 & 0.0394 & 0.0327 \\ \end{bmatrix}

此时卷积核数值总和约为 1.0358,虽略大于 1,但在实际应用中可满足基本需求。若追求更高精度(尤其是在编程实现中),可重复上述归一化步骤,直至总和接近 1(如 0.999999),以规避计算机浮点数精度误差带来的影响。

卷积核在图像中的应用方法

生成归一化卷积核后,即可将其应用于图像实现模糊效果,核心流程如下:

  1. 创建输出图像:新建一个与原图像尺寸(宽 ww × 高 hh)相同的空白图像,用于存储模糊后的结果。

  2. 遍历原图像像素:通过双重循环遍历原图像的每个像素,对每个像素执行以下操作:

  • 以当前像素为中心,提取与卷积核尺寸相同的 “邻域像素” 区域。

  • 将邻域像素的色彩值与卷积核对应位置的权重相乘,再将所有结果求和,得到当前像素的新色彩值。

  • 将新色彩值赋值给输出图像的对应像素位置。

  1. 处理图像边缘问题:在图像边缘(如左上角像素 (0,0)(0,0)),若使用 5×55 \times 5 卷积核,会出现 “邻域像素超出图像范围” 的情况(如需要获取 (1,0)(-1,0) 位置的像素,但该位置不存在)。此时可采用 “零填充”(Zero Padding)的方法解决:将超出图像范围的像素色彩值设为 0,这是最简单且常用的边缘处理方式。