背景与简介
此前,我在开发一款 ASCII 渲染程序时,偶然看到 Computerphile 频道的一则视频。视频中建议,如果要在图像中使用边缘检测技术,最好先对图像进行高斯模糊处理。
那么,什么是高斯模糊呢?简单来说,它是一种借助高斯函数实现的图像模糊技术。通过这一技术处理后的图像,不仅能呈现出柔和的模糊效果,图像原有的色彩信息还能最大程度得以保留。
从原理上看,“高斯” 二字源于 “钟形曲线”(即正态分布)。与普通的均值采样模糊不同,高斯模糊采用正态分布采样来实现图像模糊。从正态分布曲线(如下图所示)可以清晰看到,数值主要集中在中心区域,随着与中心距离的增加,数值会逐渐减小。这一特性正是高斯模糊效果的核心逻辑来源。
(注:原文此处配有正态分布曲线示意图,图中标注了 - 4σ 到 4σ 的标准差范围,并分别对应 68.3%、95.4%、99.7% 的数值分布比例,图片来源为维基共享资源)
高斯模糊与盒式模糊的对比
为了更直观地理解高斯模糊的特点,我们可以将其与盒式模糊(Box Blur)进行对比。
从处理后的图像效果来看,若不仔细观察,很难直接区分两者的差异,尤其是在使用较小参数进行模糊处理时。但当我们将图像放大到单个像素级别,就能明显发现两者的不同:
-
高斯模糊:像素颜色过渡更为平滑自然,中心像素对周围像素的影响呈现出渐进式衰减,不会出现明显的色彩断层。
-
盒式模糊:由于采用了简单的均值计算(将 kernel 内所有像素颜色求和后除以像素数量),相邻像素对中心像素的影响强度一致,放大后容易看到生硬的色彩边界,模糊效果相对粗糙。
高斯模糊的核心公式
高斯模糊的实现依赖于高斯函数生成的卷积核(Kernel Convolution)。若你对卷积核的概念尚不了解,可参考相关视频教程(原文作者推荐了一则讲解清晰的视频)。其核心公式如下:
公式中各参数的含义如下:
-
:像素坐标(在编程中通常称为索引),用于定位卷积核内的具体像素位置。
-
(西格玛):控制模糊强度和范围的关键参数,后文会详细说明。
-
:欧拉数(约等于 2.718281828459045)。
-
:圆周率(约等于 3.1416)。
需要特别注意的是,通过该公式生成的卷积核,所有数值之和应接近 1(且不超过 1)。这是因为 “1” 代表 100% 保留原图信息,若总和为 0.6,则意味着最终图像仅保留了原图 60% 的色彩信息,若总和偏离 1 过多,会导致图像过亮或过暗。
公式的两大组成部分
高斯函数可拆分为 “归一化因子” 和 “指数衰减项”,两者共同决定了卷积核的数值分布。
1. 归一化因子(Normalization Factor)
公式:
作用:确保卷积核内所有数值之和接近 1,避免图像因数值总和异常导致色彩失真。若缺少归一化因子,处理后的图像可能出现整体过亮(总和大于 1)或过暗(总和小于 1)的问题,严重偏离原图色彩基调。
2. 指数衰减项(Exponential Decay)
公式:
作用:决定卷积核内各像素对中心像素的影响权重。由于高斯函数的正态分布特性,该部分会生成 “中心数值大、边缘数值小” 的权重分布 —— 距离中心像素越远,权重越小,从而实现自然的模糊过渡。
这一特性正是高斯模糊优于盒式模糊的关键:盒式模糊中所有相邻像素权重相同,而高斯模糊通过指数衰减,让中心像素始终保持较强的 “主导地位”,避免相邻像素过度干扰中心色彩,使模糊效果更贴近人眼对 “柔和模糊” 的感知。
关键参数 (西格玛)的作用
是控制高斯模糊效果的核心参数,主要有两大功能:
-
决定模糊强度: 的数值越大,模糊效果越强。例如, 时仅产生轻微模糊, 时图像会呈现明显的朦胧感。
-
影响卷积核尺寸:卷积核尺寸(通常用 表示, 为奇数)可通过 估算,公式为:。其中 表示向上取整,该公式能确保卷积核覆盖正态分布中 99.7% 的关键区域,避免因核尺寸过小导致模糊效果不完整。
高斯模糊的实现步骤
以生成一个 、 的卷积核为例,详细说明实现过程(为了更清晰地展示 “非标准核尺寸” 的处理逻辑,此处未使用上述核尺寸估算公式,而是手动设定为 )。
步骤 1:初始化卷积核并调整坐标
首先创建一个 的空卷积核(初始值均为 0):
由于高斯函数以中心为原点(),需要将卷积核的坐标进行调整:
-
卷积核的中心位置(原索引为 )对应 。
-
左上角位置(原索引为 )对应 ,其他位置以此类推(如 对应 )。
在编程实现时,需通过代码逻辑将卷积核的索引转换为上述坐标(例如,对于 的核,中心偏移量为 ,某点索引 对应的坐标为 ,)。
步骤 2:遍历计算卷积核数值
通过双重循环(遍历 和 方向),将每个坐标代入高斯公式计算对应数值,核心逻辑如下:
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
计算示例
以两个关键位置为例,展示具体计算过程(取 ,):
- 中心位置(x=0, y=0):
-
第一步:计算归一化因子
-
第二步:计算指数衰减项
-
第三步:两者相乘得到结果
- 左上角位置(x=-2, y=-2):
-
第一步:归一化因子与中心位置相同,约为 0.017683
-
第二步:计算指数衰减项
-
第三步:两者相乘得到结果
按照上述方法计算所有位置后,得到初始卷积核:
从该卷积核可以清晰看到,数值从中心向边缘逐渐减小,完全符合高斯函数的正态分布特性。
步骤 3:卷积核的归一化修正
此时若计算初始卷积核所有数值的和,会发现结果约为 0.3465,远小于 1。这是因为我们手动设定了 的核尺寸,未遵循 对应的标准核尺寸(按公式计算应为 ),导致数值分布不完整。
若直接使用该卷积核,最终图像仅能保留原图 30% 左右的色彩信息,会明显过暗。因此需要进行归一化修正,具体方法为:将卷积核内每个数值除以所有数值的总和,并用新结果替换原数值。
以中心数值 0.01768 为例,修正后的结果为:。
按照此方法修正所有数值后,得到最终的归一化卷积核:
此时卷积核数值总和约为 1.0358,虽略大于 1,但在实际应用中可满足基本需求。若追求更高精度(尤其是在编程实现中),可重复上述归一化步骤,直至总和接近 1(如 0.999999),以规避计算机浮点数精度误差带来的影响。
卷积核在图像中的应用方法
生成归一化卷积核后,即可将其应用于图像实现模糊效果,核心流程如下:
-
创建输出图像:新建一个与原图像尺寸(宽 × 高 )相同的空白图像,用于存储模糊后的结果。
-
遍历原图像像素:通过双重循环遍历原图像的每个像素,对每个像素执行以下操作:
-
以当前像素为中心,提取与卷积核尺寸相同的 “邻域像素” 区域。
-
将邻域像素的色彩值与卷积核对应位置的权重相乘,再将所有结果求和,得到当前像素的新色彩值。
-
将新色彩值赋值给输出图像的对应像素位置。
- 处理图像边缘问题:在图像边缘(如左上角像素 ),若使用 卷积核,会出现 “邻域像素超出图像范围” 的情况(如需要获取 位置的像素,但该位置不存在)。此时可采用 “零填充”(Zero Padding)的方法解决:将超出图像范围的像素色彩值设为 0,这是最简单且常用的边缘处理方式。