4.3 经典计算机视觉

为什么这很重要

在学习现代计算机视觉算法之前,先了解传统计算机视觉方法所做的工作会很有帮助。这能为我们打下坚实的基础,并使后续理解更高级的算法变得更容易。

image-20260331140710679

传统计算机视觉专注于教计算机如何在图像中找到有用的信息,例如边缘、形状、角点和运动。这些方法依赖于人工设计的规则,而不是像现代深度学习模型那样从大量数据中自动学习。尽管它们更简单,但它们帮助解决了许多基础视觉任务,并为今天更强大的计算机视觉技术奠定了基础。

经典方法

滤波

image-20260331141309862

滤波会改变图像的局部结构。一些滤波器降低噪声,而另一些则增强细节。

滤波的工作方式是让每个像素根据其附近的像素被更新。换句话说,算法会在图像上滑动一个称为**核(kernel)**的小窗口,并为每个位置计算一个新值。

image-20260331152645839

示例:

  • 均值模糊:用邻居的平均值替换一个像素,使图像变得更平滑
  • 高斯模糊:给附近的像素更大的权重,通常会使模糊效果看起来更自然
  • 中值模糊:用邻域中的中值替换像素
  • 锐化:增强局部差异,使边缘和细节更清晰可见

这些滤波器很有用,因为真实相机图像通常包含噪声、微小的亮度波动或不稳定的细节,需要在后续视觉步骤之前进行平滑或增强。

试一试:

bash
cd 4.3-Classical-Computer-Vision/code
python filtering.py

🚀 你可以尝试拖动滑块查看不同的滤波模式,并修改不同的核参数以观察图像的变化。

image-20260331153010183

阈值化

阈值化是一种将灰度图像转换为黑白结果的简单方法。基本思想是:选择一个阈值,然后将每个像素与之比较。如果像素亮于阈值,它就变成白色;否则变成黑色。这将连续的像素值转换为更简单的是或否决策,从而更容易将物体从背景中分离。

image-20260331142045879

这在以下场景中很有用:

  • 文档处理
  • 简单的工业检测
  • 受控场景中的前景提取

试一试:

bash
cd 4.3-Classical-Computer-Vision/code
python thresholding.py

🚀 试着拖动滑块以修改不同的阈值,并观察图像的变化。

image-20260331162811153

边缘检测

边缘通常对应于强度急剧变化的边界。

image-20260331142022364

边缘检测是一种在图像中找到重要边界的方法。基本思路很简单:算法观察像素亮度从一个位置到下一个位置的变化幅度。如果变化非常小,那很可能是同一区域的一部分。如果变化突然且较大,那个位置很可能是边缘。在实践中,许多方法首先对图像进行轻微平滑以减少噪声,然后计算水平方向和垂直方向上的强度变化,最后保留最强的变化作为边缘。这有助于计算机更清晰地突出物体的轮廓、形状结构和场景布局。

边缘检测有助于揭示:

  • 形状结构
  • 物体边界
  • 场景几何

试一试:

bash
cd 4.3-Classical-Computer-Vision/code
python edge_detection.py

🚀 拖动滑块查看不同的模式并修改不同的参数,以观察图像的变化。

image-20260331163055712

轮廓

轮廓描述了二值图像中物体的外形。

image-20260331142747289

轮廓是计算机在二值图像追踪物体外形的一种方式。通常的过程是:先将图像转换为黑白,将一部分视为物体,另一部分视为背景。然后,算法跟随它们相遇的边界,并将其外形记录为一组相连的点。这样,轮廓基本上就是一个物体的形状边界。一旦找到外形,计算机就可以利用它更轻松地测量大小、计数物体或分析形状。

它们对于以下任务很有用:

  • 形状分析
  • 计数物体
  • 测量面积和周长

试一试:

bash
cd 4.3-Classical-Computer-Vision/code
python contours.py

🚀 试着拖动滑块以修改不同的阈值,并观察图像的变化。

image-20260331163359282

形态学操作

形态学操作是一类简单的图像处理方法,能改变二值图像中白色区域的形状。它们的工作方式是把一个称为结构元素的小图案在图像上移动,并检查它如何与前景相符。腐蚀通过移除边界像素来缩小物体,因此小噪声会消失。膨胀通过在边界周围增加像素来扩大物体,可以填补小缝隙。开运算是先腐蚀再膨胀,因此能去除小噪点同时保留主要形状。闭运算是先膨胀再腐蚀,因此能填补小孔并连接断开的部分。简而言之,形态学有助于清理嘈杂的掩膜并使物体形状更易于分析。

image-20260331142417743

常见操作:

  • 腐蚀
  • 膨胀
  • 开运算
  • 闭运算

当掩膜嘈杂或破碎时,这些方法尤其有用。

试一试:

bash
cd 4.3-Classical-Computer-Vision/code
python morphological_operate.py

🚀 试着拖动滑块以修改不同的阈值,并观察图像的变化。

image-20260331163707790

特征检测与匹配

特征是视觉上具有独特性的点或图案。特征匹配用于比较图像、对齐视图或估计几何关系。

image-20260331142714201

特征检测意味着在图像中找到容易再次识别的特殊点或图案,例如角点、斑点或带纹理的区域。特征匹配则是在两幅图像之间比较这些点,找出哪些对应于现实世界中的同一位置。常见的工作流程是:首先检测关键点,然后为每个关键点计算一个描述符(局部外观的紧凑数值摘要),最后比较描述符以找到最佳匹配。OpenCV 描述了诸如 Brute-Force(将一个描述符与所有其他描述符进行比较)和 FLANN(在大集合中加速搜索)这样的匹配器。这很有用,因为一旦找到良好的匹配,计算机就可以对齐图像、拼接全景、估计运动或从另一视角定位物体。

这一思想对于以下应用很重要:

  • 全景拼接
  • 图像对齐
  • 定位
  • 视觉里程计

试一试:

bash
cd 4.3-Classical-Computer-Vision/code
python feature_detection_matching.py

🚀 试着拖动滑块以修改不同的匹配模式,并观察图像的变化。

image-20260331173910126

常见误解

  • "经典视觉已经过时。"
    • 它较旧,但并未过时。它在预处理、测量和基于规则的逻辑中仍然很有用。
  • "深度学习已经取代了所有传统图像处理。"
    • 实际上,许多现代系统仍然包含经典操作。
  • "如果阈值化对一张图像有效,就会对所有图像有效。"
    • 经典方法可能对光照和上下文敏感。

练习 / 反思

  1. 对一张包含简单前景的图像应用阈值化,并计算连通物体的数量。
  2. 比较高斯模糊前后的边缘图。有什么变化?
  3. 在同一二值掩膜上尝试腐蚀和膨胀。小区域会发生什么?
  4. 反思一种简单的经典方法可能比深度模型更好的情况。

总结

经典计算机视觉为学习者提供了一种透明的方式来理解图像变换。它在实际系统中也仍然适用于预处理、滤波、形状推理和轻量级视觉逻辑。

建议下一步

继续学习 4.4 神经网络与 CNN

参考资料