第四节:图像特征提取——角点检测、边缘检测与特征描述子

图像特征提取,说白了就是让机器从像素矩阵里找到“有意义”的东西。我刚开始做视觉伺服时,总觉得这一步很简单——不就是找几个点嘛?后来才发现,特征选不好,后面的控制全是白搭。今天咱们就聊聊几种最常用的特征提取方法。

4.1 角点检测:Harris与Shi-Tomasi

角点,就是图像里那些“拐弯抹角”的地方。你想想看,一个物体的角落在图像里往往对应着两个方向的梯度变化都很大。Harris角点检测就是基于这个直觉设计的。

4.1.1 Harris角点检测原理

Harris的核心思想很简单:用一个窗口在图像上滑动,如果窗口往哪个方向移动,灰度变化都很大,那中心就是角点。数学上,它构造了一个自相关矩阵M:

M = [ ΣIx²   ΣIxIy ]
    [ ΣIxIy   ΣIy²  ]

然后计算角点响应值R:

R = det(M) - k * trace(M)²

这里的k是个经验参数,我一般取0.04到0.06之间。R值大的地方就是角点。

我的经验:Harris对光照变化比较敏感。我在一个工厂项目里遇到过,白天和晚上同样的工件,Harris检测结果差很多。后来我加了自适应阈值才搞定。

4.1.2 Shi-Tomasi角点检测

Shi-Tomasi其实是Harris的改进版。它不计算R值,而是直接取矩阵M的两个特征值λ₁和λ₂中的较小者。如果这个最小值大于阈值,就认为是角点。

R = min(λ₁, λ₂)

我个人更喜欢用Shi-Tomasi。为什么?因为它更稳定。Harris的k值需要调,而Shi-Tomasi不需要这个参数。在视觉伺服里,我通常用Shi-Tomasi提取特征点,然后用光流法跟踪。

实战建议:在OpenCV中,Harris用cv2.cornerHarris(),Shi-Tomasi用cv2.goodFeaturesToTrack()。后者可以直接指定返回角点的最大数量,非常方便。

4.2 边缘检测:Canny算子

边缘检测,就是找图像里亮度变化剧烈的地方。Canny是公认的“黄金标准”。我记得第一次用Canny时,被它的效果惊艳到了——边缘又细又连续,噪声还少。

4.2.1 Canny的四个步骤

  1. 高斯滤波:先平滑图像,去除噪声。我一般用5×5的高斯核。
  2. 计算梯度:用Sobel算子算水平和垂直方向的梯度,得到幅值和方向。
  3. 非极大值抑制:这一步很关键。它把不是局部最大值的像素点去掉,让边缘变细。
  4. 双阈值检测:设定高阈值和低阈值。高于高阈值的肯定是边缘,低于低阈值的肯定不是,介于中间的看是否与强边缘相连。
import cv2
import numpy as np

img = cv2.imread('workpiece.jpg', 0)
edges = cv2.Canny(img, threshold1=50, threshold2=150)
# 低阈值50,高阈值150,这个比例我一般设1:2到1:3
避坑指南:我曾经在一个项目中把低阈值设得太低,结果边缘检测出来一堆噪声,导致后续的位姿估计全错了。后来我总结了一个经验:先看直方图,把高阈值设在直方图峰值附近,低阈值设在高阈值的一半左右。

4.3 特征描述子:SIFT与ORB

找到特征点之后,怎么让机器在不同图像里认出同一个点?这就需要特征描述子了。描述子就像给每个特征点发了一张“身份证”。

4.3.1 SIFT:尺度不变特征变换

SIFT是Lowe在2004年提出的,可以说是特征描述子里的“老大哥”。它的核心优势是尺度不变和旋转不变。说白了,你把图像放大缩小、旋转一下,SIFT还能认出同一个点。

SIFT的步骤大致是:

  • 构建高斯差分金字塔,检测尺度空间中的极值点
  • 精确定位关键点位置和尺度
  • 为每个关键点分配主方向
  • 生成128维的特征向量
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
# descriptors是128维的浮点向量
我的看法:SIFT精度高,但计算量也大。在视觉伺服里,如果帧率要求高(比如30fps以上),我一般不推荐用SIFT。它更适合离线标定或者慢速场景。

4.3.2 ORB:面向快速和旋转的二进制描述子

ORB是2011年提出的,可以看作是SIFT的“轻量版”。它结合了FAST角点检测和BRIEF描述子,并加入了旋转不变性。ORB的输出是二进制字符串,匹配时用汉明距离,速度飞快。

orb = cv2.ORB_create(nfeatures=500)
keypoints, descriptors = orb.detectAndCompute(img, None)
# descriptors是二进制向量,可以用cv2.NORM_HAMMING匹配
实战对比:
方法精度速度尺度不变旋转不变适用场景
SIFT离线标定、高精度定位
ORB实时跟踪、嵌入式系统
Harris简单场景、光流跟踪
Shi-Tomasi中高视觉伺服特征点提取

4.4 本章知识体系

下面这张图是我自己整理的,把本章的核心逻辑串起来了。你看一眼就能明白这些方法之间的关系和适用场景。

图像特征提取知识体系 图像特征提取 角点检测 边缘检测 特征描述子 Harris Shi-Tomasi Canny SIFT ORB 关键特性对比 • Harris:基于自相关矩阵,需要调k值 • Shi-Tomasi:取最小特征值,更稳定 • Canny:四步法,双阈值是关键 • SIFT:128维浮点描述子,精度高但慢 • ORB:二进制描述子,速度快,适合实时

嗯,这张图基本把今天的内容串起来了。你从根节点往下看,左边是角点检测,中间是边缘检测,右边是特征描述子。每个分支下面都有具体的算法,底部是它们的核心特点对比。

我个人建议,刚开始做视觉伺服时,先用Shi-Tomasi提取角点,配合Canny做边缘验证,特征匹配用ORB。这套组合在大多数场景下够用,而且调试起来不费劲。等遇到精度瓶颈了,再考虑上SIFT。


公众号:蓝海资料掘金营,微信deep3321