模板、金字塔与滤波器组
前两章分别从空间域和频率域介绍了图像滤波。滤波还有第三种视角:把滤波器看作模板(Template),将图像中的每个局部区域与模板进行比较,找到最相似的位置。这就是模板匹配——计算机视觉中「找东西」的最朴素方法。
在此基础上,本章引入图像金字塔(Image Pyramid)来处理尺度变化,然后讨论如何同时分解尺度和方向信息,最终建立起多尺度、多方向的图像表示框架——这正是人类视觉系统处理信息的方式。
模板匹配
给定一个小的模板图像(比如一只眼睛),如何在一张大图中找到它出现的位置?这就是模板匹配(Template Matching)的任务。核心挑战在于:如何衡量两个图像块的相似度?
互相关匹配
最直接的思路是用上一章学过的互相关:将模板 当作滤波器,对图像 做互相关运算:
结果 在每个位置给出模板与对应图像块的「匹配得分」——得分越高,越相似。
但直接互相关有一个致命问题:它对亮度敏感。一个明亮的区域即使与模板完全不像,也可能因为像素值本身就大而得到很高的得分。
零均值互相关
改进方法是先减去模板的均值——让匹配关注形状而非亮度:
其中 是模板所有像素的均值。减去均值后,模板的正值区域表示「比平均亮」,负值区域表示「比平均暗」,互相关变成了对形状的匹配。
效果好了很多,能找到真正的匹配位置,但仍有误检——因为它没有考虑图像局部区域自身的亮度和对比度。
平方差之和
平方差之和(Sum of Squared Differences, SSD)从另一个角度衡量相似度——直接计算模板与图像块之间的逐像素差异:
SSD 越小表示越相似。将 SSD 展开可以发现它包含三项:(常数)、(互相关)和 (图像局部能量)。前两项可以用线性滤波计算,但 依赖于图像局部内容,不是线性滤波能直接得到的。
SSD 的缺点是对整体亮度变化敏感:如果图像某个区域整体偏亮或偏暗,即使形状完全匹配,SSD 也可能很大。
归一化互相关
归一化互相关(Normalized Cross-Correlation, NCC)是模板匹配的「黄金标准」,它同时消除了亮度和对比度的影响:
其中 是以 为中心的图像块的局部均值。NCC 的值域是 ,其中 1 表示完美匹配。分子减去了均值(消除亮度偏移),分母做了归一化(消除对比度差异)。
| 方法 | 速度 | 对亮度的鲁棒性 | 对对比度的鲁棒性 |
|---|---|---|---|
| 互相关 | 最快 | 差 | 差 |
| 零均值互相关 | 快 | 中 | 差 |
| SSD | 较快 | 差 | 差 |
| NCC | 最慢 | 好 | 好 |
选择哪种方法?
没有一种方法在所有场景下都最优。如果光照条件稳定,零均值互相关或 SSD 的速度优势更重要;如果光照变化大,NCC 是最可靠的选择。
高斯金字塔
为什么需要多尺度
模板匹配有一个根本问题:它假设模板和图像中的目标尺度相同。但现实中同一物体可能出现在不同的距离,因此在图像中占据不同大小的区域。仅靠平移不变性是不够的,我们还需要尺度不变性(Scale Invariance)。
一种方案是准备多个不同大小的模板,但模板是连续变化的,不可能穷举。更聪明的做法是固定模板大小,把图像本身缩放到不同的分辨率,在每个分辨率上做匹配——这就是图像金字塔(Image Pyramid)的思想。
构建高斯金字塔
高斯金字塔(Gaussian Pyramid)的构建过程非常简单:对原图反复执行「高斯模糊 + 2 倍降采样」。
1 2 3 4 5 6 7 8 9 10 | import cv2 import numpy as np def build_gaussian_pyramid(img, levels): pyramid = [img] for _ in range(levels - 1): blurred = cv2.GaussianBlur(pyramid[-1], (5, 5), 1) downsampled = blurred[::2, ::2] pyramid.append(downsampled) return pyramid |
用 表示第 层, 表示第 层的「模糊+降采样」算子,则:
经典的滤波核采用 权重,这是一个近似高斯的可分离核。
每一层的分辨率是上一层的一半——图像像金字塔一样越来越小,这就是「金字塔」名称的由来。
高斯金字塔的应用
由粗到精配准(Coarse-to-Fine Registration)是高斯金字塔最经典的应用。思路是先在最粗(最小)的层上进行全局搜索——由于图像很小,搜索空间极小,速度很快。然后逐层向上传递结果,在更精细的层上只需要在局部范围内搜索微调。这种策略不仅快得多,还能避免陷入局部最优。
多尺度模板匹配的流程也类似:
- 在当前尺度上匹配模板
- 对图像降采样(实践中缩放步长取 1.1 到 1.2 而非 2)
- 重复步骤 1-2 直到图像非常小
- 对所有响应做阈值筛选和非极大值抑制
从图像金字塔到特征金字塔
经典金字塔在每个尺度上独立提取特征,效率低下。深度学习时代提出了更巧妙的方案。
CNN 本身就天然产生层次化特征——浅层特征分辨率高但语义弱,深层特征分辨率低但语义强。特征金字塔网络(Feature Pyramid Network, FPN)利用了这一点:通过自顶向下的路径将深层的强语义信息传递回高分辨率层,每一层都兼具高分辨率和强语义。
flowchart LR
subgraph 自底向上
C2["C₂<br/>高分辨率<br/>弱语义"] --> C3["C₃"] --> C4["C₄"] --> C5["C₅<br/>低分辨率<br/>强语义"]
end
subgraph 自顶向下
P5["P₅"] --> P4["P₄"] --> P3["P₃"] --> P2["P₂<br/>高分辨率<br/>强语义"]
end
C5 -.-> P5
C4 -.-> P4
C3 -.-> P3
C2 -.-> P2
classDef bottom fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef top fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
class C2,C3,C4,C5 bottom
class P2,P3,P4,P5 top
FPN 的关键操作是:将深层特征 2 倍上采样,加上经过 卷积对齐通道数的浅层特征——这个简单的 add 操作就完成了语义信息的传递。
金字塔结构后来也被引入 Vision Transformer:Pyramid Vision Transformer(PVT)通过逐阶段降低分辨率来构建层次化特征,Swin Transformer 则通过 patch merging 实现类似效果。这些架构证明了多尺度表示不仅适用于 CNN,也是 Transformer 处理密集预测任务的基本需求。
金字塔的思想还跨越了数据模态的界限:在视频理解中,时间金字塔(Temporal Pyramid)沿时间轴构建多尺度表示来捕获不同速度的运动;在三维点云处理中,类似的层次化下采样结构也被用于提取多尺度几何特征。
拉普拉斯金字塔
从低通到带通
高斯金字塔的每一层都是原图的低通滤波版本——包含该尺度及以下的所有频率信息。但如果我们想知道每一层新增了哪些信息——即只属于该尺度的频率分量——就需要做减法。
拉普拉斯金字塔(Laplacian Pyramid)的第 层定义为高斯金字塔相邻两层之差:
由于 的分辨率只有 的一半,需要先上采样到相同大小再做差。上采样的方法是:先插入零值(使尺寸翻倍),再用平滑核进行插值。
拉普拉斯金字塔的本质
每一层 捕获的是 相比 多出的细节信息——高斯金字塔是逐步丢弃高频,而拉普拉斯金字塔是把这些被丢弃的高频「存」起来。在频率域中,每一层对应一个环形带通滤波器(annular band-pass filter),不同层的频段互不重叠。
用矩阵形式表示更清楚。令 为模糊+降采样算子, 为上采样+模糊算子,则:
其中 就是带通滤波矩阵——对 先降采样再上采样会丢失细节,原图减去这个「丢失细节后的版本」就得到了细节本身。
LoG 与 DoG
拉普拉斯金字塔的名字来源于高斯的拉普拉斯算子(Laplacian of Gaussian, LoG)。脉冲信号减去高斯信号,得到的形状近似于 LoG:
实际计算中常用高斯差分(Difference of Gaussians, DoG)来近似 LoG:
在空间域中,两个宽度不同的低通滤波器相减得到一个带通滤波器;在频率域中,这就是两条高斯曲线围成的「带状」区域。DoG 是半倍频 LoG 的良好近似,计算更简单。
完美重建
拉普拉斯金字塔的一个关键性质是可完美重建(Perfect Reconstruction):给定所有拉普拉斯层 和最粗层的高斯残差 ,可以精确恢复原图。
重建过程是自底向上的:
从最粗层 开始,逐层加上对应的拉普拉斯细节,最终恢复出原图 。这意味着拉普拉斯金字塔是一种无损的多尺度分解——它把图像拆分成不同频段的分量,任何时候都可以完整地拼回去。
混合图像的金字塔视角
上一章介绍的混合图像也可以用拉普拉斯金字塔来理解。将混合图像分解为拉普拉斯金字塔后,高频层显示的是高频源图像(如猫的轮廓),低频层显示的是低频源图像(如骷髅的整体形态)——不同频段来自不同的原图。
图像融合
拉普拉斯金字塔最经典的应用之一是图像融合(Image Blending)。
直接把两张图左右拼接,接缝处会出现明显的边界。最朴素的解决方案是用一个渐变的 alpha 遮罩:。但渐变窗口的大小很难选择——窗口太宽,两张图相互「透」过来产生鬼影(ghosting);窗口太窄,接缝仍然可见。
这里有一个深刻的洞察:不同频率的内容需要不同宽度的混合窗口。高频细节(如边缘)需要窄窗口才不会模糊,低频内容(如整体亮度)需要宽窗口才能平滑过渡。而拉普拉斯金字塔恰好把图像按频段拆分——每个频段可以用适合自己的窗口分别混合。
拉普拉斯金字塔融合算法
- 分别构建两张图像 、 的拉普拉斯金字塔 、
- 构建遮罩 的高斯金字塔 (遮罩在每一层都被平滑了不同程度)
- 在每一层用对应的遮罩混合:
- 从混合后的拉普拉斯金字塔重建出最终图像
这就是经典的「苹果+橙子 = orapple」实验:苹果和橙子各自分解为金字塔,在每个频段用不同宽度的遮罩混合,重建后得到自然无缝的过渡。
可控金字塔
方向的缺失
高斯金字塔和拉普拉斯金字塔只分解了尺度信息,每一层对所有方向一视同仁。但现实中很多任务需要同时感知尺度和方向——比如检测特定朝向的纹理,或分析图像中边缘的走向。拉普拉斯金字塔的带通滤波器在频率域中是环形的(各向同性),如果想分辨方向信息,需要把这个环切成若干「扇形」(wedge)。
高斯导数与方向
先考虑如何检测特定方向的边缘。二维高斯函数 对 求偏导得到:
对垂直方向的边缘有强响应;类似地, 对水平方向的边缘有强响应。那对于 45° 或其他方向呢?
可控滤波器
关键的数学事实是:沿任意方向 的平滑方向梯度,是 和 响应的线性组合。
这意味着只需要计算两次滤波( 和 ),就可以合成出任意方向的滤波结果。这种性质称为可控性(Steerability)——用固定方向的基滤波器的线性组合来合成任意方向的滤波器。
合成 30° 方向的滤波器
只需预计算 0° 和 90° 两个基滤波器的响应图,然后对每个像素按上式线性组合,就能得到 30° 方向的响应——不需要重新做一次完整的滤波。
可控金字塔
可控金字塔(Steerable Pyramid)将可控滤波器与多尺度分解结合起来。在每个尺度上,应用一组不同方向的带通滤波器(),得到该尺度下各方向的分量 。然后对残余低频信号做降采样,进入下一层继续分解。
可控金字塔有几个重要性质:
保持所有信息。它是一种过完备表示(Overcomplete Representation)——系数总数多于原始像素数。但好处是可以从系数完美重建原图(自逆性),且各频段/方向的子带之间没有混叠。
独立通道。每个子带表示特定尺度和方向上的信息,可以独立操作。比如增强某个方向的纹理而不影响其他方向。
方向分析。通过比较各方向子带的响应强度,可以得到每个位置的主方向(dominant orientation),生成方向场。
可控金字塔的应用包括纹理合成、噪声去除、运动分析和运动放大等。
flowchart TD
subgraph 三种金字塔对比
G["高斯金字塔<br/>逐步模糊+降采样<br/>→ 尺度不变性"]
L["拉普拉斯金字塔<br/>相邻层之差<br/>→ 带通分解 + 融合"]
S["可控金字塔<br/>尺度 × 方向<br/>→ 纹理/特征分析"]
end
G --> L --> S
classDef gauss fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef lap fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
classDef steer fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
class G gauss
class L lap
class S steer
人类视觉系统中的多尺度处理
金字塔和滤波器组并非人为发明——它们在很大程度上模仿了人类视觉系统的信息处理方式。视觉信号从眼睛到大脑,经历了一个多级处理流水线。
视网膜与外侧膝状体
光信号到达视网膜后,经由视网膜神经节细胞(Retinal Ganglion Cell)初步处理,再传入外侧膝状体(Lateral Geniculate Nucleus, LGN)。这些早期视觉神经元的感受野具有中心-环绕(Center-Surround)结构:
开中心细胞(On-center Cell)在中心区域受到光刺激时兴奋,在环绕区域受到光刺激时抑制——它检测的是「亮点」或「比周围亮的区域」。关中心细胞(Off-center Cell)则相反。
这种中心-环绕结构可以用高斯差分(DoG)精确建模——中心兴奋区对应窄高斯,环绕抑制区对应宽高斯,两者之差就是 DoG。不同大小的感受野对应不同的 ,形成多尺度的带通分析——这正是拉普拉斯金字塔的生物学原型。
LGN 和视网膜神经元的感受野是圆形对称的,它们对所有方向的刺激响应相同,只区分不同的空间频率(尺度)。
初级视觉皮层与 Gabor 滤波器
信号从 LGN 传到初级视觉皮层(Primary Visual Cortex, V1),处理方式发生了质变。V1 中的简单细胞(Simple Cell)具有方向选择性——它们只对特定朝向的边缘或条纹产生强烈响应。
V1 简单细胞的感受野可以用 Gabor 滤波器(Gabor Filter)精确建模。Gabor 函数本质上是一个被高斯窗口调制的正弦波:
其中 控制空间范围(高斯包络的宽度), 控制空间频率(正弦波的密度)。取实部和虚部分别得到余弦(偶对称)和正弦(奇对称)两种滤波器:
直觉上,余弦型(偶对称)对亮暗交替的条纹结构有最强响应,正弦型(奇对称)对亮暗跳变的边缘结构有最强响应。一对余弦和正弦 Gabor 滤波器组合起来可以测量局部的方向能量(Oriented Energy),用于检测特定方向上的轮廓。
通过旋转坐标 ,可以得到任意方向的 Gabor 滤波器。不同 的 Gabor 对应不同的空间频率,不同 对应不同的方向——整个视觉系统就是一个庞大的多尺度多方向滤波器组。
Gabor 滤波器与人脑
实验表明,V1 简单细胞的感受野与二维 Gabor 函数的拟合几乎完美——拟合残差与噪声无法区分。这一发现表明,人脑在视觉处理的早期阶段本质上就是在做多尺度、多方向的带通滤波——与可控金字塔的思想不谋而合。
不同 的 Gabor 对应不同的空间频率,不同 对应不同的方向——整个视觉系统就是一个庞大的多尺度多方向滤波器组。这也自然引出了下一个话题:如何将这种多尺度多方向的滤波器组应用于具体的视觉任务?纹理分析就是最直接的应用之一。
滤波器组与纹理分析
什么是纹理
纹理(Texture)是视觉中无处不在、容易识别、却难以定义的现象。直觉上,纹理是大量小型局部图案的重复出现——砖墙的砖块排列、树皮的裂纹、布料的织纹都是典型的纹理。
纹理构成了一个连续的谱系:从完全规则的重复图案(如棋盘格、圆点阵列),到接近规则的(如砖墙),到不规则的(如碎石路面),再到近乎随机的(如云彩、火焰),直到完全随机的(如沙粒、泥土)。
纹理受到三个因素的影响:材质(同一种材料有相似的纹理)、方向(同一种树皮旋转后看起来不同)、尺度(从远处看到的砖墙和近处看到的砖墙纹理模式不同)。此外,不同的光照和观察方向也会改变同一材料的纹理外观。
为什么分析纹理
纹理分析之所以重要,是因为纹理经常反映材料的物理属性——看一眼就能区分木头和金属、布料和石头。当不同物体的形状相似时(如柠檬和芒果),纹理可能是区分它们的关键线索。
纹理相关的任务包括:
- 从纹理推断形状(Shape from Texture):纹理元素在表面上的变形揭示了表面的三维朝向
- 纹理分割/分类:将图像中具有一致纹理的区域分组
- 纹理合成:给定示例纹理,生成新的纹理图像
一个有趣的心理学发现是:某些纹理差异可以通过前注意感知(Preattentive Perception)被瞬间捕捉到——不需要逐点仔细观察,一眼扫过就能感知到「这里不一样」。这说明人类视觉系统在非常早期的阶段就对纹理进行了自动化的分析,而且这种分析与尺度相关的线性滤波器密切相关。
滤波器组
如何用数学方法表示纹理?核心思路是:用一组滤波器检测局部图案,然后统计这些图案在图像中的分布。
一个滤波器组(Filter Bank)由多个滤波器组成,通常覆盖多种尺度和方向,包括检测边缘(Edges)、条纹(Bars)和斑点(Spots)的滤波器。将整个滤波器组应用于图像后,每个像素位置得到一个 维的特征向量( 为滤波器个数),描述该位置的局部图案特征。
flowchart LR
I["输入图像"] --> FB["滤波器组<br/>(多尺度 × 多方向)"]
FB --> R1["响应图 1"]
FB --> R2["响应图 2"]
FB --> Rd["响应图 d"]
R1 --> S["局部统计量<br/>(均值/方差/直方图)"]
R2 --> S
Rd --> S
S --> FV["纹理特征向量"]
classDef input fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef filter fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
classDef response fill:#f8f9fa,stroke:#495057,stroke-width:2px
classDef feature fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
class I input
class FB filter
class R1,R2,Rd response
class S,FV feature
在每个局部窗口内,对滤波器响应计算统计量(如均值、标准差),就得到了该窗口的纹理描述。相似的纹理在特征空间中距离近,不同的纹理距离远。
纹理子与纹理识别
纹理子(Textons)的概念将纹理分析推进了一步。流程如下:
- 对大量纹理图像应用滤波器组,得到每个像素的 维响应向量
- 对所有响应向量做 -means 聚类,聚类中心就是 textons——代表了纹理中反复出现的典型局部图案
- 将每个像素标记为最近的 texton,得到 texton 标记图
- 统计每种材料中各 texton 的出现频率,得到 texton 直方图
材料识别就变成了直方图比较。两种材料的相似度可以用 距离衡量:
这个框架将纹理识别从像素级提升到了语义级——不再比较原始像素,而是比较局部图案的统计分布。
纹理合成
除了分析和识别纹理,另一个重要的任务是纹理合成(Texture Synthesis)——给定一个小的纹理样本,生成任意大小的新纹理图像,使其在视觉上与样本无法区分。
一种经典的非参数方法是逐像素合成:对于要填充的每个新像素,在已有图像中搜索邻域模式最相似的位置,然后复制该位置的像素值。搜索是在一个局部窗口内进行的,相似度用窗口内像素的 SSD 来衡量。
窗口大小是关键参数:窗口太小,只能捕捉局部结构,合成结果可能逐渐「长出垃圾」(growing garbage)或丧失全局一致性;窗口太大,可能直接逐块复制原图(verbatim copying),失去了合成的意义。好的窗口大小应当刚好能覆盖纹理中最大的重复单元。
这种逐像素合成方法的思路也可以扩展到其他任务:给纹理「补洞」(Hole Filling)或向外延伸纹理(Extrapolation)。虽然深度学习方法如今在纹理合成上表现更好,但非参数方法的直觉——「通过局部邻域匹配来传播模式」——仍然是理解纹理生成的基础。
三种表示方式的权衡
回顾本章涉及的所有概念,可以发现图像有三种互补的表示方式:
| 表示 | 空间信息 | 频率信息 | 适用场景 |
|---|---|---|---|
| 像素 | 精确 | 无 | 直接显示、像素级操作 |
| 傅里叶变换 | 无 | 精确 | 全局频率分析、滤波器设计 |
| 金字塔/滤波器组 | 有(局部) | 有(频段) | 多尺度分析、纹理、特征提取 |
像素表示和傅里叶变换各自走向了一个极端——一个只有空间信息,一个只有频率信息。金字塔和滤波器组在两者之间找到了平衡,同时保留了空间和频率信息(尽管都不是精确的)。这种「既知道在哪里,又知道是什么频率」的能力,正是它们在计算机视觉中如此重要的原因。