文章

02 边缘检测示例(Edge Detection Example)

02 边缘检测示例(Edge Detection Example)

02 边缘检测示例(Edge Detection Example)

一、核心思想

卷积运算是卷积神经网络(CNN)中最基本的操作。
在 CNN 的早期层中,网络通常执行边缘检测(如垂直/水平边缘),后续层则逐步组合这些低级特征,形成更复杂的语义(如物体部件、完整物体,例如人脸)。

本节以垂直边缘检测为例,讲解卷积如何工作。


二、输入与过滤器(Filter / Kernel)

  • 输入图像:假设为灰度图,尺寸为 $6 \times 6$,即张量维度为 $6 \times 6 \times 1$。
  • 过滤器(Filter) :也称“核(Kernel)”,是一个 $3 \times 3$ 的小矩阵,用于提取特定特征。

    • 垂直边缘检测常用过滤器:

      \[F = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix}\]
    • 此过滤器对左侧亮、右侧暗的区域响应强烈(即存在从左到右的亮度突变 → 垂直边缘)。

注:在数学中,卷积用符号 $\ast$ 表示;但在 Python 中 * 通常表示逐元素乘法,因此实际编程中需调用专用函数(如 tf.nn.conv2d)。


三、卷积运算过程

给定输入图像 $I$($6 \times 6$)和过滤器 $F$($3 \times 3$),卷积输出尺寸为:

\[\text{输出尺寸} = (n - f + 1) \times (n - f + 1) = (6 - 3 + 1) \times (6 - 3 + 1) = 4 \times 4\]

其中:

  • $n = 6$:输入边长
  • $f = 3$:过滤器边长
  • 默认步幅(stride)为 1,无填充(padding = 0)

卷积计算步骤(以输出左上角元素为例):

  1. 将过滤器 $F$ 对齐到输入图像左上角的 $3 \times 3$ 区域。
  2. 执行逐元素相乘(element-wise product)
  3. 将所有乘积结果求和,得到输出的一个元素。

例如,若输入局部区域为:

\[\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}\]

则输出值为:

\[\sum_{i=1}^{3} \sum_{j=1}^{3} I[i,j] \cdot F[i,j]\]

这本质上是两个矩阵的点积(dot product)

滑动窗口遍历整个图像,即可得到完整的 $4 \times 4$ 输出特征图(Feature Map)。


四、为什么该过滤器能检测垂直边缘?

考虑一个理想化的测试图像:

\[I = \begin{bmatrix} 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ \end{bmatrix}\]
  • 左半边像素值为 10(亮),右半边为 0(暗)→ 存在明显的垂直边缘在第 3–4 列之间。

使用上述垂直边缘过滤器 $F$ 卷积后,输出中间列会出现高正值(如 30),表明此处检测到强垂直边缘。

例如,在跨越边缘的位置(如第 2–4 列):

\[\begin{bmatrix} 10 & 10 & 0 \\ 10 & 10 & 0 \\ 10 & 10 & 0 \\ \end{bmatrix} \ast \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \\ \end{bmatrix} = 10 \cdot 1 + 10 \cdot 0 + 0 \cdot (-1) + \cdots = 30\]

而纯亮区或纯暗区的响应为 0(因为左右对称,正负抵消)。

结论:该过滤器对“左亮右暗”的突变敏感 → 检测垂直边缘。


五、输出解释与局限性

  • 输出的 $4 \times 4$ 矩阵可视为一张新图像(特征图),高亮区域对应检测到的边缘位置
  • 在小图像(如 $6 \times 6$)中,边缘看起来“较粗”,这是因为分辨率低。
  • 在真实大图(如 $1000 \times 1000$)中,该方法能精确定位细锐的垂直边缘

六、编程实现提示

在深度学习框架中,不直接使用 $\ast$ 符号,而是调用封装好的卷积函数:

框架函数名
TensorFlowtf.nn.conv2d
KerasConv2D
PyTorchtorch.nn.Conv2d

这些函数自动处理:

  • 多通道输入(如 RGB 图像)
  • 多个过滤器(输出多通道特征图)
  • 步幅(stride)、填充(padding)等超参数

七、关键公式汇总(KaTeX 兼容)

  1. 输出尺寸(无填充,步幅=1)

    \[n_{\text{out}} = n_{\text{in}} - f + 1\]
  2. 卷积运算(单通道)

    \[(I \ast F)[i, j] = \sum_{m=0}^{f-1} \sum_{n=0}^{f-1} I[i+m, j+n] \cdot F[m, n]\]
  3. 垂直边缘检测器

    \[F_{\text{vertical}} = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix}\]
  4. 水平边缘检测器(补充知识)

    \[F_{\text{horizontal}} = \begin{bmatrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1 & -1 \end{bmatrix}\]

八、学习启示

  • 卷积是一种局部特征提取机制
  • 通过设计不同的过滤器,可检测不同方向/类型的边缘。
  • 在 CNN 中,这些过滤器不是人工设定的,而是通过反向传播自动学习得到的,从而适应具体任务(如分类、检测)。
  • 边缘检测是理解 CNN 如何从像素构建高层语义的关键第一步

总结:本节通过垂直边缘检测这一经典例子,直观展示了卷积运算的机制、意义与效果,为理解 CNN 的特征学习能力奠定了坚实基础。

本文由作者按照 CC BY 4.0 进行授权