图像滤波:去噪、找图、缩放、拼全景,竟是同一个邻域运算
滤波(filtering)是图像处理最基础也最容易低估的概念。这篇专题是整套图像处理专题的入口,只回答一个问题:改图像这堆数字的基本动作是什么,它凭什么同时长出去噪、找图、换尺度、拼全景四件毫不相干的事,最后一头还扎进深度学习。
1. 图像在计算机眼里只是一堆数字——改它的基本动作叫邻域运算
图像在计算机里从来不是"照片"。一张 800×600 的彩色照片落到内存里,就是一张 800×600×3 的数值矩阵:高 800、宽 600、3 个颜色通道,每个格子存一个 0 到 255 的整数。人眼看到的是物体、光影和纹理,计算机读到的只有这堆数字。这个"数字 ≠ 感知"的落差,是整片讨论的出发点。
数字图像是怎么来的?先看一条完整的成像链条:

图注:数字图像的获取过程:照明源照射场景元素,光线进入成像系统,投影到内部像平面,最后采样数字化成右侧网格状的像素阵列。"照片变成数字",就发生在这最后一段。
链条的最后一环把连续的光影切成离散的格子,这一步叫采样与量化。量化前后的差别,看图就明白:

图注:(a) 投影到传感器阵列上的连续图像,边缘光滑、色调渐变;(b) 同一形状采样量化后的结果,每个格子只能填一个灰度等级,轮廓变成方块阶梯。
从这一刻起,所有图像处理问题都收敛成同一个问题:怎么改这堆数字?
基本动作只有一个,邻域运算(neighborhood operator)。每个输出像素的值,只由输入图像里它周围一小圈像素决定。Szeliski 的教材把这句话写成邻域算子的标准定义:输出像素只依赖于输入像素的小邻域。Szeliski2022
在线性情形下,它就是一次加权求和。SzeliskiCh3
$$g(i,j) = \sum_{k,l} f(i+k, j+l), h(k,l)$$
这里 $h$ 是一组权重,名字叫核(kernel)。核的形状决定滤波效果,这句话先记住,后面每章都在验证它:

图注:3×3 高斯核(Gaussian kernel)H[u,v] = 1/16 × [[1,2,1],[2,4,2],[1,2,1]],中心权重最大、离中心越远越小;输入图 F[x,y] 上的红色方框标出一个 3×3 邻域。输出就是把邻域像素按核加权求和。图来自华盛顿大学 CSE576 课程 2020 年配套课件(Steve Seitz 主讲),与 Szeliski 教材第 3 章概念一致。CSE576Slides
换一组权重,就是另一种操作。用全 1 的均值核,结果立刻变样:

图注:同一个输入 F[x,y](中心一个 1),用 3×3 全 1 的均值核 H,输出 G[x,y] 变成一个 3×3 的方块。均值滤波会把一个亮点扩散成一整块,所以输出看起来"方方块块"。同样来自 UW CSE576 配套课件。CSE576Slides
对写过 numpy 的工程师来说,这里没有任何新东西:图像就是一张 H×W×3 的数值张量,邻域运算就是一次"用周围元素更新当前元素"的向量化操作,和你手动用 ndarray 滑窗算均值是同一种心智模型。区别只在于,这里的"滑窗"被标准化成了核与卷积这两个概念。
至于相关(correlation)与卷积(convolution)的区别、核怎么手工设计、边界怎么处理,这些机制细节《线性滤波与卷积核:图像的像素级手术刀》一篇会逐一展开。本篇只需要带走这一句:图像是一堆数字,而改这堆数字的最小动作,是在每个像素的局部邻域上做一次运算。
2. 同一个邻域运算,怎么长出去噪、找图、换尺度、拼世界四根枝干?
邻域运算不是一把刀,而是一个工具箱。Szeliski 把图像处理操作分成六大族,其中"邻域运算"这一族内部还有线性、非线性、形态学、半全局之分。教材 Figure 3.9 把这份家底摊开给你看:

图注:邻域运算家族的部分成员:上面两行是同一张彩色静物的四种处理(原图、模糊、锐化、边缘保持平滑),下面两行是二值图像上的形态学操作(二值化、膨胀、距离变换、连通分量)。注意这不是一张形式化的分类树,而是八个示例摆在一起,证明"同一套邻域上做函数"的机制能长出多少种玩法。图来自 Szeliski 教材第 1 版草稿第 3 章 Figure 3.9。SzeliskiCh3
图像处理,本质上就是对同一张原图施加不同的操作。Szeliski 用同一朵鸢尾花的六种处理演示这一点:

图注:(a) 原图;(b) 提高对比度;(c) 改变色相;(d) 颜色 posterize(量化);(e) 模糊;(f) 旋转。同一张图,六种操作,六种结果。图来自 Szeliski 教材第 1 版草稿第 3 章 Figure 3.1。SzeliskiCh3
为什么滤波值得占一整章?因为邻域运算同时服务三类目标:增强图像(去噪、锐化、调对比度),提取信息(边缘、角点、纹理),检测模式(模板匹配、相关响应)。Szeliski 在教材里一句话点明:neighborhood operators 可以用来 remove noise(去噪)、sharpen details(锐化细节)、accentuate edges(强调边缘)、add soft blur(软模糊)。Szeliski2022
落到四个典型任务上,就是四根枝干:
| 枝干 | 它回答的问题 | 深入机制在哪一篇 |
|---|---|---|
| 去噪 | 把图像本身的质量改好 | 《图像去噪实战:先认噪声,再选滤波器》 |
| 模板匹配 | 在图像里把"那一小块"找出来 | 《模板匹配:在图像里把「那一小块」找出来》 |
| 图像金字塔 | 一个尺度不够,就用一组尺度 | 《图像金字塔:一个尺度不够,就用一组尺度》 |
| 图像混合 | 把多个图像世界无缝拼成一个 | 《图像混合:把两个世界无缝拼在一起》 |
整棵树的形状先画在这里,后面各章逐支验证:
有趣的是,沿着四根枝干往下走,每一支都会暴露上一支留下的缺口:去噪暴露出线性滤波在边缘处失效,找东西暴露出单一尺度不够用,拼接暴露出单带混合必然留缝。缺口正是下一根枝干存在的理由。
3. 去噪:线性滤波跨过边缘就糊,非线性保边怎么破局?
先看第一根枝干,去噪。最直接的做法是线性低通:把每个像素换成邻域的加权平均,噪声被平均掉,代价是边缘一起糊掉。因为边缘两侧的像素本来就不相似,加权平均把它们混在一起,一条清晰的台阶被抹成斜坡。高斯核再精致,也治不了这个病:线性滤波的核心假设是"图像在空间上缓慢变化",这个假设在平滑区域成立,在边缘处崩溃。Bilateral
破局思路是给"不像的邻居"降权。双边滤波(bilateral filter)把权重拆成两个高斯相乘:一个管空间距离(domain,离得越近权重越大),一个管强度距离(range,灰度越像权重越大)。只有当邻居既在空间上近、又在强度上像时,权重才显著。看图:

图注:双边滤波的机理三联图:(a) 含噪的台阶输入;(b) 相似度权重的钟形分布;(c) 滤波后噪声被磨平、台阶边缘原样保留。把滤波器中心放在边缘亮侧时,钟形权重只覆盖亮侧,暗侧像素被自动忽略。Bilateral
物理直觉值得讲透:把滤波器中心放在边缘的亮侧,亮侧邻居与中心强度接近,权重接近 1;暗侧邻居强度差很大,权重被压到接近 0。除以归一化常数 $k(x)$ 之后,输出只由亮侧像素决定,台阶因此原样保留,而平滑区域内的噪声依旧被平均掉。这就是"同时做到去噪与保边"的全部秘密。
这一机制的结构与 attention(注意力)完全同构:query 与 key 越像、权重越大,softmax 归一化保证权重总量不变;这里空间距离与强度距离就是两个"key 的相似度",归一化常数 $k(x)$ 就是 softmax 的分母。类比到此为止,真正要记住的还是那一句:不像的邻居,自动降权。
在真实灰度图上,效果长这样:

图注:左侧是洋葱切片的原图细节,表面布满细密纹理和噪点;右侧是双边滤波后的同一细节,纹理被磨平,但圆形轮廓和明暗分布保留下来。Bilateral
双边滤波只是非线性保边家族的一位成员。另一条经典路径是各向异性扩散(anisotropic diffusion):它把去噪写成扩散方程,让扩散系数随图像梯度局部变化,梯度大的边缘处扩散被自动抑制。二者殊途同归,都在回答"线性滤波跨过边缘就糊"这个痛点。两者在可比尺度上的效果对比如下:

图注:四条并列路线:(a) 含噪原图;(b) 各向异性扩散在 10、20、80 次迭代下的结果,噪声被压平而物体轮廓保持锐利;(c) 对应的边缘图;(d) 可比尺度下 Canny 检测器(高斯滤波后求导)的边缘图。两类边缘轮廓大体一致,细尺度细节走向不同。AnisoDiff
所以非线性保边家族也不止一位成员。至于噪声长什么样、高斯和双边各自怎么选、σ 怎么权衡,那是《图像去噪实战:先认噪声,再选滤波器》一篇的事。这里带走一条主线:线性滤波在边缘处抹糊结构,非线性保边滤波通过给"不像的邻居"降权,同时做到去噪与保边。
4. 在图像里找一小块:模板匹配为何对尺度过敏,金字塔何以对症?
第二根枝干把"改图像"升级成"读图像"。模板匹配(template matching)的思路直接得惊人:把模板当成核,在整张图上做一次邻域运算,也就是相关(correlation)滤波,响应图的峰值就是匹配位置。还记得第一章那张核图吗?那里核是手工设计的高斯权重,这里核直接就是你要找的那一小块图像。找东西和修图,用的是同一个动作。
但固定模板有一个致命弱点:对尺度过敏。物体在画面里离镜头近就大、离镜头远就小,模板尺寸一旦固定,物体缩放了就找不着了。旋转和光照变化是另外两个维度的过敏,匹配相似度的种种改进《模板匹配:在图像里把「那一小块」找出来》一篇会讲;本篇只看尺度这一件事,它正是下一根枝干的入口。
答案叫作图像金字塔(image pyramid):不用单一尺度,而是一组尺度。先看长什么样:

图注:同一幅图像按 1/2、1/4、1/8 逐级缩小,每一层都比上一层更模糊。先低通再降采样,得到的这一摞图像就是一组尺度。图来自 UW CSE576 配套课件。CSE576Slides
这一摞图像是怎么生成的?这要回到 1983 年 Burt 与 Adelson 的奠基论文。他们用 REDUCE 算子定义高斯金字塔:每一层都是上一层"与 5×5 生成核卷积、再隔行隔列降采样"的结果,迭代下去就堆出一组逐层减半的尺度。BurtAdelson83

图注:论文里的一维示意:一串采样点经过 REDUCE 逐级汇聚,9 个点合成 5 个、再合成 1 个。高斯金字塔就是反复"低通卷积 + 隔行隔列降采样"叠出来的。BurtAdelson83
有了高斯金字塔,再定义拉普拉斯金字塔(Laplacian pyramid)只需一句话:相邻两层高斯之差,$L_l = G_l - \text{EXPAND}[G_{l+1}]$。每一层 $L_l$ 都是该尺度上的高频残差,而把全部拉普拉斯层展开加回去,能无损还原原图。这套"可逆的尺度分解"是后面混合分支的地基。
对玩过游戏引擎或地图应用的工程师来说,金字塔一点都不陌生:游戏给同一个物体准备多档精度的网格,远处用粗网格、近处用细网格;地图逐级放大时先出粗轮廓再补细节。图像金字塔是同一思想在图像上的落地,一组尺度代替单一尺度,匹配、配准、融合都在这组尺度上由粗到细地跑。金字塔的构建细节、防混叠原理、由粗到细配准,《图像金字塔:一个尺度不够,就用一组尺度》一篇会展开。这里带走一条主线:匹配对尺度过敏,金字塔用一组尺度来回应。
5. 把两个世界拼在一起:为何要低频慢混、高频快混?
最后一根枝干,拼接。把两张拍自不同位置的照片拼成一张全景,重叠区怎么处理?最朴素的想法是沿拼接缝做加权平均。而平均的过渡宽度是固定的,它必须同时服务所有频率,这正是接缝的根源:要压平低频的亮度阶跃,过渡区得够宽;要不让高频细节双重曝光,过渡区又得够窄。一个固定宽度没法同时满足,于是接缝就留下了。
Brown 与 Lowe 2003 年的全景拼接论文把这个问题展示得最直观。先看只做几何注册、不做混合的中间状态:

图注:同一场景 80 张照片中前 40 张只做了几何注册、还没混合的中间状态:多道垂直拼接缝、相邻帧之间明显的亮度跳变,以及上下大片尚未覆盖的黑色区域。这还只是"摆好位置",远没到能看的地步。PanoramaBlend
再看同一场景全部 80 张图经过 multi-band blending(多频段混合)渲染后的最终结果:

图注:同一组建筑群的最终全景:草地连贯、天空色调统一、屋脊线跨图保持一致,接缝和亮度斑块消失。PanoramaBlend
两张图摆在一起,答案就清楚了:混合必须按频率分带。这就是 Burt 与 Adelson 同一篇论文里的多分辨率样条(multiresolution spline):两幅图各自做拉普拉斯金字塔分解,在每一层用同一个掩膜的高斯金字塔做加权,最后把各层结果展开相加。低频用宽过渡区慢混,高频用窄过渡区快混。苹果和橙子的案例把几何直觉说得很直白:

图注:苹果-橙子拼接各频段的贡献拼版:高频分量几乎只在中线附近非零,低频分量横跨中线两侧、过渡带宽得多。混得慢的是低频,混得快的是高频,这不是人工设计,而是各层等效核宽度随层数放大后的自动结果。BurtAdelson83
理论是 N 带,工程上"够用就好"。Brown 与 Lowe 把整套金字塔压成两带:波长大于 2 像素的低频用线性加权求和,波长小于 2 像素的高频直接取权重最大的那张图。作者自己也承认,更多频带的样条函数设计仍是开放问题。这个两带简化与更细的混合代码,归《图像混合:把两个世界无缝拼在一起》一篇。
频率分解能玩出的花样还不止"把世界缝起来"。Oliva、Torralba 与 Schyns 2006 年的 Hybrid Images 把低通和高通两个分支拆开各自单独用在一张图上:$H = I_1 \cdot G_1 + I_2 \cdot (1 - G_2)$。一张图用低通只剩轮廓,另一张用高通只剩边缘和纹理,相加之后,同一张静态图就有了两种解读。 Hybrid Images

图注:大象原图经低通滤波后只剩模糊轮廓,豹子原图经高通滤波后只剩边缘斑点,两者叠加得到混合图(右侧 ⊕ 符号处):远看像大象的色调,近看是豹子的纹理。图中 cutoff 单位是 cycles/image(每图周期数),不是 σ。HybridImages
真实效果里,这种"近看高频、远看低频"会让人产生错觉:

图注:两个真实案例:近距离能看清女子脸上的猫毛纹理,退开几米纹理消失、只剩人脸;房屋同理,近看是施工中的脚手架,远看是完整房子。HybridImages
到这里,混合这一支的缺口也已补上:拼接留缝,是因为用同一个过渡区处理了所有频率;按频率分带、低频慢混、高频快混,才能无缝。而频率分解本身就是一个工具箱,拼接只是它的一个用途。
6. 邻域运算长进深度学习:卷积层就是可学习的滤波核
现在回到树的根,把它往前再长一段。CNN 的卷积层(convolutional layer)就是第一章那个邻域运算的现代落点:还是在每个位置对局部邻域做加权求和,图还是那张核图,唯一的变化是权重从手工设计(高斯核、Sobel 核)变成训练学出来的。Szeliski 在教材里明确把卷积层与线性滤波的邻域算子视为同构。Szeliski2022 多通道卷积也不过是多核并行:每个输出通道是一组独立学出来的核。
而"金字塔"这一根枝干,在深度学习里以三种形态复活。
第一种,SPP-Net(2014)。CNN 一度要求固定输入尺寸,这个约束的根源不是卷积层(它天然滑动、吃任意尺寸),而是后面的全连接层需要固定长度的向量。SPP-Net 用空间金字塔池化把任意尺寸的特征图切成 4×4、2×2、1×1 三组格子,每组格子内做 max pooling(最大池化),得到固定 21 个 bin(池化格子)、乘 256 个滤波器就是 5376 维: CNN CNN CNN

图注:三行对照:上行是传统做法,把图像裁剪或形变到固定尺寸,切掉内容或破坏几何;中间是普通 CNN 到全连接层;下行是 SPP-Net,在卷积特征图上做 4×4/2×2/1×1 三层空间金字塔池化,再进全连接层。SPP-Net
池化的窗口大小随特征图尺寸自动缩放,这正好是"邻域随图像本身伸缩"这句话的现代版本。检测场景下它还有另一层意义:特征图整张只算一次,所有候选窗在共享特征图上各自池化,不再每窗重跑一遍 CNN,论文报告相对 R-CNN 在 Pascal VOC 2007 上提速 24 到 64 倍。

图注:整张图只过一次卷积得到共享特征图;右侧多个任意大小、任意位置的候选窗,在这张特征图上分别做空间金字塔池化,各自输出固定长度的特征。SPP-Net
第二种,FPN(Feature Pyramid Networks,2016)。它把"多尺度"从输入图层面挪进特征图内部:CNN 前向本来就会逐层产生由细到粗的特征层级,FPN 用 top-down 上采样加 lateral connection(横向连接)把这些层级的语义串起来,每个尺度都富含语义,而且前向只跑一遍:

图注:四种策略对照:(a) 输入图像金字塔,每个尺度独立前向,慢;(b) 只用单尺度特征;(c) 重用 CNN 天然的多尺度层级,但只做最细层预测;(d) FPN,top-down 加 lateral 连接,让每个尺度都能产出预测。蓝框代表特征图,越粗语义越强。FPN
第三种,PSPNet(2016)。金字塔池化模块(Pyramid Pooling Module)把多尺度从空间位置推向语义上下文:在骨干网络最后一层 1/8 特征图上并行做 1×1、2×2、3×3、6×6 四级池化,聚合全图与各子区域的统计量,上采样后拼回像素级特征图,让每个像素做预测时同时看到全局场景和局部细节:

图注:(a) 输入图像;(b) CNN 骨干输出 1/8 特征图;(c) PPM 并行四路 1×1/2×2/3×3/6×6 池化,各自 1×1 卷积降维、上采样后与原特征图拼接,携带局部与全局上下文;(d) 卷积输出逐像素预测。PSPNet
到这里,整棵树的形状画完了:同一个邻域运算,权重手工设计就是经典滤波,权重交给数据学就是卷积层,把"一组尺度"的思想搬进网络就是 SPP、FPN、PSPNet。反向传播、RoI、损失函数这些机制细节属于更专门的材料,本篇的收口只有一句:你第一章认识的那个邻域运算,就是深度学习卷积层的数学起点。
参考文献
本专题引用的核心资料如下,建议深入学习时阅读原文:
- Computer Vision: Algorithms and Applications, 2nd edition (Szeliski 2022) — https://szeliski.org/Book
- Szeliski Chapter 3: Image Processing(第 1 版草稿) — http://mesh.brown.edu/engn1610/szeliski/03-ImageProcessing.pdf
- A Multiresolution Spline with Application to Image Mosaics (Burt & Adelson 1983) — https://www.cs.princeton.edu/courses/archive/fall05/cos429/papers/burt_adelson.pdf
- Bilateral Filtering for Gray and Color Images (Tomasi & Manduchi 1998) — https://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
- Scale-Space and Edge Detection Using Anisotropic Diffusion (Perona & Malik 1990) — https://authors.library.caltech.edu/records/1p8h5-5x870/files/PERieeetpami90.pdf
- Recognising Panoramas (Brown & Lowe 2003) — https://www.cs.ubc.ca/~lowe/papers/brown03.pdf
- Hybrid Images (Oliva, Torralba & Schyns 2006) — https://wcours.gel.ulaval.ca/GIF4105/tps/tp2/OlivaTorralb_Hybrid_Siggraph06.pdf
- Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition (He et al.) — arXiv:1406.4729
- Feature Pyramid Networks for Object Detection (Lin et al.) — arXiv:1612.03144
- Pyramid Scene Parsing Network (Zhao et al.) — arXiv:1612.01105