跳转至

图像基础与特征提取

图像是计算机视觉的输入,理解图像的数学表示、基本处理操作和特征提取方法,是掌握所有视觉算法的基础。


一、数字图像的表示

像素与图像矩阵

一张数字图像可以看作一个二维函数 \(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) 在图像上滑动,对覆盖区域的像素做加权求和,生成新的像素值。

卷积运算

二维离散卷积的数学定义:

\[ (I * K)(x, y) = \sum_{i=-k}^{k} \sum_{j=-k}^{k} I(x+i, y+j) \cdot K(i, j) \]

其中 \(K\) 是大小为 \((2k+1) \times (2k+1)\) 的卷积核。

卷积 vs 相关

严格来说,上面的操作是相关(Correlation),真正的卷积需要先将核翻转 180°。在深度学习中,大家说的"卷积"其实都是相关运算,因为核的参数是学习出来的,翻不翻转无所谓。

常用滤波器

每个像素替换为邻域像素的平均值,用于去除噪声:

\[ K_{\text{mean}} = \frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} \]

效果:图像变模糊,噪声减少,但边缘也会被模糊掉。

用高斯函数作为权重,离中心近的像素权重大:

\[ G(x, y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} \]

优点:比均值滤波更自然,不会产生方块效应。\(\sigma\) 越大,模糊程度越高。

取邻域像素的中值(排序后取中间值),而非加权求和。

特点:对椒盐噪声(random black/white pixels)效果极好,且能较好保留边缘。

同时考虑空间距离像素值差异

\[ I'(x) = \frac{1}{W} \sum_{y \in \Omega} I(y) \cdot \underbrace{e^{-\frac{\|x-y\|^2}{2\sigma_s^2}}}_{\text{空间权重}} \cdot \underbrace{e^{-\frac{(I(x)-I(y))^2}{2\sigma_r^2}}}_{\text{值域权重}} \]

效果:平滑噪声的同时能保留边缘,常用于美颜、HDR 处理。


三、边缘检测

边缘是图像中像素值剧烈变化的位置,对应物体的轮廓、遮挡边界等,是最重要的底层特征之一。

原理:梯度

图像的边缘 = 像素值变化最剧烈的地方 = 梯度幅值最大的位置。

图像在 \((x, y)\) 处的梯度:

\[ \nabla I = \begin{pmatrix} \frac{\partial I}{\partial x} \\ \frac{\partial I}{\partial y} \end{pmatrix} \]
  • 梯度幅值\(|\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[双阈值 + 边缘连接]
  1. 高斯平滑:先用高斯滤波去噪,避免噪声被误检为边缘
  2. 计算梯度:用 Sobel 算子计算每个像素的梯度幅值和方向
  3. 非极大值抑制(NMS):沿梯度方向只保留局部最大值,使边缘变成 1 像素宽的细线
  4. 双阈值 + 边缘连接
    • 梯度 > 高阈值 → 确定是边缘(强边缘
    • 低阈值 < 梯度 < 高阈值 → 仅当与强边缘相连时才保留(弱边缘
    • 梯度 < 低阈值 → 丢弃

为什么 Canny 效果好?

它同时满足了三个准则:①检测准确(低错误率)②定位精确(边缘位置准)③单一响应(一条边只检测一次)。


四、经典特征描述子

在深度学习之前,人们手工设计了很多特征描述子来表示图像的关键信息。这些方法虽然已被 CNN 超越,但其思想对理解视觉特征仍然很有价值。

SIFT(尺度不变特征变换)

Scale-Invariant Feature Transform,David Lowe 于 1999 年提出,是最经典的局部特征描述子。

核心思想:找到图像中的关键点,并在关键点周围提取对旋转、缩放、光照变化都鲁棒的特征向量。

关键步骤

  1. 尺度空间构建:用不同 \(\sigma\) 的高斯滤波构建图像金字塔,在相邻尺度间做差分(DoG),形成尺度空间
  2. 关键点检测:在 DoG 空间中找到局部极值点,这些点在不同尺度下都是稳定的
  3. 方向赋值:统计关键点邻域的梯度方向直方图,将主方向赋给关键点,实现旋转不变性
  4. 特征描述:将关键点周围 \(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 提出,最初用于行人检测。

核心思想:用局部区域内梯度方向的分布来描述物体的形状信息。

计算流程

  1. 图像分块:将图像划分为若干 Cell(如 \(8 \times 8\) 像素)
  2. 梯度直方图:在每个 Cell 内统计梯度方向直方图(通常分为 9 个 bin,覆盖 0°~180°)
  3. 块归一化:将相邻 Cell 组成 Block(如 \(2 \times 2\) 个 Cell),在 Block 内做 L2 归一化,增强对光照变化的鲁棒性
  4. 拼接特征:将所有 Block 的归一化直方图拼接成最终特征向量

HOG 与 CNN 的关系

HOG 的思想与 CNN 有相似之处:都是通过"局部感受野 → 特征统计 → 分层抽象"的方式提取特征。CNN 的卷积核可以看作自动学习出来的"更优的 HOG"。

传统特征 vs 深度特征对比

维度 传统特征(SIFT/HOG) 深度特征(CNN)
设计方式 人工设计 数据驱动学习
泛化能力 依赖先验知识,泛化有限 大数据下泛化能力强
计算效率 轻量,CPU 可运行 需要 GPU 加速
可解释性 较高,每一步有明确含义 较低,黑盒特征
典型应用 特征匹配、SLAM 分类、检测、分割

五、卷积神经网络(CNN)基础

CNN 是现代计算机视觉的基石。它的核心思想是通过可学习的卷积核自动提取图像特征。

核心组件

1. 卷积层(Convolutional Layer)

卷积层是 CNN 的核心,用一组可学习的卷积核提取特征:

\[ \text{output}(i, j) = \sum_{m} \sum_{n} \text{input}(i+m, j+n) \cdot \text{kernel}(m, n) + \text{bias} \]

关键参数:

  • 卷积核大小:常见 \(3 \times 3\)\(5 \times 5\)
  • 步长(Stride):卷积核滑动的步幅,stride=2 可使输出尺寸减半
  • 填充(Padding):在图像边缘补零,使输出尺寸不变
  • 通道数:输入通道数 \(C_{in}\),输出通道数 \(C_{out}\)(即卷积核数量)

输出尺寸计算:

\[ H_{out} = \frac{H_{in} - K + 2P}{S} + 1 \]

其中 \(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 的特征做归一化处理:

\[ \hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}, \quad y = \gamma \hat{x} + \beta \]

作用:加速训练、稳定梯度、允许使用更大的学习率。

经典网络架构演进

网络 年份 深度 关键创新
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)让信息可以"跳过"某些层直接传递:

\[ \mathbf{y} = F(\mathbf{x}) + \mathbf{x} \]

这解决了深层网络的梯度消失/退化问题,使得训练几百层的网络成为可能。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 设计)等。