图像基础与特征提取¶
图像是计算机视觉的输入,理解图像的数学表示、基本处理操作和特征提取方法,是掌握所有视觉算法的基础。
一、数字图像的表示¶
像素与图像矩阵¶
一张数字图像可以看作一个二维函数 \(I(x, y)\),其中 \((x, y)\) 是空间坐标,\(I\) 是该点的亮度值。
- 灰度图:\(I \in \mathbb{R}^{H \times W}\),每个像素取值 \([0, 255]\),0 为黑色,255 为白色
- 彩色图:\(I \in \mathbb{R}^{H \times W \times 3}\),三个通道分别对应 R(红)、G(绿)、B(蓝)
直观理解
一张 \(1920 \times 1080\) 的彩色照片,本质上就是一个包含 \(1920 \times 1080 \times 3 \approx 622\) 万个数字的三维数组。计算机"看"图像,就是对这些数字做各种数学运算。
常见颜色空间¶
| 颜色空间 | 通道含义 | 典型用途 |
|---|---|---|
| RGB | 红、绿、蓝 | 显示器显示,深度学习输入 |
| HSV | 色调、饱和度、明度 | 颜色检测、图像增强 |
| YUV | 亮度、色度 | 视频压缩编码 |
| Lab | 亮度、a 色度、b 色度 | 感知均匀的颜色对比 |
为什么要用不同的颜色空间?
RGB 对人类不直观(比如"把颜色调亮一点"对应 RGB 什么操作?)。HSV 空间中,调亮度只需改 V 通道,检测红色只需限定 H 通道范围,操作更自然。
二、图像滤波¶
滤波是图像处理中最基本的操作——用一个卷积核(Kernel) 在图像上滑动,对覆盖区域的像素做加权求和,生成新的像素值。
卷积运算¶
二维离散卷积的数学定义:
其中 \(K\) 是大小为 \((2k+1) \times (2k+1)\) 的卷积核。
卷积 vs 相关
严格来说,上面的操作是相关(Correlation),真正的卷积需要先将核翻转 180°。在深度学习中,大家说的"卷积"其实都是相关运算,因为核的参数是学习出来的,翻不翻转无所谓。
常用滤波器¶
每个像素替换为邻域像素的平均值,用于去除噪声:
效果:图像变模糊,噪声减少,但边缘也会被模糊掉。
用高斯函数作为权重,离中心近的像素权重大:
优点:比均值滤波更自然,不会产生方块效应。\(\sigma\) 越大,模糊程度越高。
取邻域像素的中值(排序后取中间值),而非加权求和。
特点:对椒盐噪声(random black/white pixels)效果极好,且能较好保留边缘。
同时考虑空间距离和像素值差异:
效果:平滑噪声的同时能保留边缘,常用于美颜、HDR 处理。
三、边缘检测¶
边缘是图像中像素值剧烈变化的位置,对应物体的轮廓、遮挡边界等,是最重要的底层特征之一。
原理:梯度¶
图像的边缘 = 像素值变化最剧烈的地方 = 梯度幅值最大的位置。
图像在 \((x, y)\) 处的梯度:
- 梯度幅值:\(|\nabla I| = \sqrt{\left(\frac{\partial I}{\partial x}\right)^2 + \left(\frac{\partial I}{\partial y}\right)^2}\),表示边缘强度
- 梯度方向:\(\theta = \arctan\frac{\partial I / \partial y}{\partial I / \partial x}\),表示边缘朝向
常用边缘检测算子¶
| 算子 | 卷积核(水平方向) | 特点 |
|---|---|---|
| Sobel | \(\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}\) | 简单有效,有一定平滑效果 |
| Prewitt | \(\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix}\) | 类似 Sobel,无加权平滑 |
| Laplacian | \(\begin{bmatrix}0&1&0\\1&-4&1\\0&1&0\end{bmatrix}\) | 二阶导数,检测零交叉点 |
Canny 边缘检测¶
Canny 是最经典、效果最好的边缘检测算法,包含 4 个步骤:
graph LR
A[高斯平滑] --> B[计算梯度]
B --> C[非极大值抑制]
C --> D[双阈值 + 边缘连接]
- 高斯平滑:先用高斯滤波去噪,避免噪声被误检为边缘
- 计算梯度:用 Sobel 算子计算每个像素的梯度幅值和方向
- 非极大值抑制(NMS):沿梯度方向只保留局部最大值,使边缘变成 1 像素宽的细线
- 双阈值 + 边缘连接:
- 梯度 > 高阈值 → 确定是边缘(强边缘)
- 低阈值 < 梯度 < 高阈值 → 仅当与强边缘相连时才保留(弱边缘)
- 梯度 < 低阈值 → 丢弃
为什么 Canny 效果好?
它同时满足了三个准则:①检测准确(低错误率)②定位精确(边缘位置准)③单一响应(一条边只检测一次)。
四、经典特征描述子¶
在深度学习之前,人们手工设计了很多特征描述子来表示图像的关键信息。这些方法虽然已被 CNN 超越,但其思想对理解视觉特征仍然很有价值。
SIFT(尺度不变特征变换)¶
Scale-Invariant Feature Transform,David Lowe 于 1999 年提出,是最经典的局部特征描述子。
核心思想:找到图像中的关键点,并在关键点周围提取对旋转、缩放、光照变化都鲁棒的特征向量。
关键步骤¶
- 尺度空间构建:用不同 \(\sigma\) 的高斯滤波构建图像金字塔,在相邻尺度间做差分(DoG),形成尺度空间
- 关键点检测:在 DoG 空间中找到局部极值点,这些点在不同尺度下都是稳定的
- 方向赋值:统计关键点邻域的梯度方向直方图,将主方向赋给关键点,实现旋转不变性
- 特征描述:将关键点周围 \(16 \times 16\) 区域分成 \(4 \times 4\) 的子块,每个子块统计 8 个方向的梯度直方图,得到 \(4 \times 4 \times 8 = 128\) 维特征向量
SIFT 的意义
SIFT 特征具有极强的鲁棒性,在图像拼接、物体识别、3D 重建等任务中被广泛使用。虽然现在 CNN 特征在很多任务上更优,但 SIFT 在几何匹配等场景中仍有应用。
HOG(方向梯度直方图)¶
Histogram of Oriented Gradients,2005 年由 Dalal & Triggs 提出,最初用于行人检测。
核心思想:用局部区域内梯度方向的分布来描述物体的形状信息。
计算流程¶
- 图像分块:将图像划分为若干 Cell(如 \(8 \times 8\) 像素)
- 梯度直方图:在每个 Cell 内统计梯度方向直方图(通常分为 9 个 bin,覆盖 0°~180°)
- 块归一化:将相邻 Cell 组成 Block(如 \(2 \times 2\) 个 Cell),在 Block 内做 L2 归一化,增强对光照变化的鲁棒性
- 拼接特征:将所有 Block 的归一化直方图拼接成最终特征向量
HOG 与 CNN 的关系
HOG 的思想与 CNN 有相似之处:都是通过"局部感受野 → 特征统计 → 分层抽象"的方式提取特征。CNN 的卷积核可以看作自动学习出来的"更优的 HOG"。
传统特征 vs 深度特征对比¶
| 维度 | 传统特征(SIFT/HOG) | 深度特征(CNN) |
|---|---|---|
| 设计方式 | 人工设计 | 数据驱动学习 |
| 泛化能力 | 依赖先验知识,泛化有限 | 大数据下泛化能力强 |
| 计算效率 | 轻量,CPU 可运行 | 需要 GPU 加速 |
| 可解释性 | 较高,每一步有明确含义 | 较低,黑盒特征 |
| 典型应用 | 特征匹配、SLAM | 分类、检测、分割 |
五、卷积神经网络(CNN)基础¶
CNN 是现代计算机视觉的基石。它的核心思想是通过可学习的卷积核自动提取图像特征。
核心组件¶
1. 卷积层(Convolutional Layer)¶
卷积层是 CNN 的核心,用一组可学习的卷积核提取特征:
关键参数:
- 卷积核大小:常见 \(3 \times 3\)、\(5 \times 5\)
- 步长(Stride):卷积核滑动的步幅,stride=2 可使输出尺寸减半
- 填充(Padding):在图像边缘补零,使输出尺寸不变
- 通道数:输入通道数 \(C_{in}\),输出通道数 \(C_{out}\)(即卷积核数量)
输出尺寸计算:
其中 \(K\) 为核大小,\(P\) 为填充,\(S\) 为步长。
2. 池化层(Pooling Layer)¶
对特征图做下采样,减小尺寸、降低计算量、增强平移不变性:
- 最大池化(Max Pooling):取窗口内最大值,保留最显著的特征
- 平均池化(Average Pooling):取窗口内平均值,保留整体信息
3. 激活函数¶
引入非线性,使网络能拟合复杂函数:
- ReLU:\(f(x) = \max(0, x)\),简单高效,解决梯度消失问题
- Leaky ReLU:\(f(x) = \max(0.01x, x)\),避免"死神经元"
- GELU:\(f(x) = x \cdot \Phi(x)\),Transformer 中常用
4. 批归一化(Batch Normalization)¶
对每个 mini-batch 的特征做归一化处理:
作用:加速训练、稳定梯度、允许使用更大的学习率。
经典网络架构演进¶
| 网络 | 年份 | 深度 | 关键创新 |
|---|---|---|---|
| LeNet | 1998 | 5 层 | 卷积 + 池化的基本结构 |
| AlexNet | 2012 | 8 层 | ReLU、Dropout、GPU 训练 |
| VGGNet | 2014 | 16/19 层 | 统一使用 \(3\times3\) 小卷积核 |
| GoogLeNet | 2014 | 22 层 | Inception 模块(多尺度并行卷积) |
| ResNet | 2015 | 152 层 | 残差连接,解决深层网络退化问题 |
| EfficientNet | 2019 | 可变 | 统一缩放深度/宽度/分辨率 |
ResNet 的关键创新:残差连接
残差连接(Residual Connection)让信息可以"跳过"某些层直接传递:
这解决了深层网络的梯度消失/退化问题,使得训练几百层的网络成为可能。ResNet 的思想至今仍广泛应用于几乎所有现代网络中。
六、Vision Transformer(ViT)¶
2020 年,Google 提出 ViT,证明 Transformer 架构在视觉领域同样有效。
核心思想¶
将图像切分成固定大小的 Patch(如 \(16 \times 16\)),将每个 Patch 展平为向量,加上位置编码,输入标准的 Transformer Encoder。
graph LR
A[输入图像] --> B[分割为 Patches]
B --> C[线性嵌入]
C --> D[加位置编码]
D --> E[Transformer Encoder]
E --> F[分类头 / 特征输出]
与 CNN 的对比¶
| 维度 | CNN | ViT |
|---|---|---|
| 感受野 | 局部 → 逐层扩大 | 全局自注意力 |
| 归纳偏置 | 平移等变、局部性 | 几乎无归纳偏置 |
| 数据需求 | 中小数据即可 | 需要大规模数据 |
| 计算复杂度 | \(O(H \times W)\) | \(O(N^2)\),\(N\) 为 patch 数 |
融合趋势
现代视觉模型越来越多地融合 CNN 和 Transformer 的优势,如 Swin Transformer(窗口注意力 + 层级结构)、ConvNeXt(用 CNN 模拟 Transformer 设计)等。