第四节:图像特征提取——角点检测、边缘检测与特征描述子
图像特征提取,说白了就是让机器从像素矩阵里找到“有意义”的东西。我刚开始做视觉伺服时,总觉得这一步很简单——不就是找几个点嘛?后来才发现,特征选不好,后面的控制全是白搭。今天咱们就聊聊几种最常用的特征提取方法。
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值大的地方就是角点。
4.1.2 Shi-Tomasi角点检测
Shi-Tomasi其实是Harris的改进版。它不计算R值,而是直接取矩阵M的两个特征值λ₁和λ₂中的较小者。如果这个最小值大于阈值,就认为是角点。
R = min(λ₁, λ₂)
我个人更喜欢用Shi-Tomasi。为什么?因为它更稳定。Harris的k值需要调,而Shi-Tomasi不需要这个参数。在视觉伺服里,我通常用Shi-Tomasi提取特征点,然后用光流法跟踪。
4.2 边缘检测:Canny算子
边缘检测,就是找图像里亮度变化剧烈的地方。Canny是公认的“黄金标准”。我记得第一次用Canny时,被它的效果惊艳到了——边缘又细又连续,噪声还少。
4.2.1 Canny的四个步骤
- 高斯滤波:先平滑图像,去除噪声。我一般用5×5的高斯核。
- 计算梯度:用Sobel算子算水平和垂直方向的梯度,得到幅值和方向。
- 非极大值抑制:这一步很关键。它把不是局部最大值的像素点去掉,让边缘变细。
- 双阈值检测:设定高阈值和低阈值。高于高阈值的肯定是边缘,低于低阈值的肯定不是,介于中间的看是否与强边缘相连。
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维的浮点向量
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 本章知识体系
下面这张图是我自己整理的,把本章的核心逻辑串起来了。你看一眼就能明白这些方法之间的关系和适用场景。
嗯,这张图基本把今天的内容串起来了。你从根节点往下看,左边是角点检测,中间是边缘检测,右边是特征描述子。每个分支下面都有具体的算法,底部是它们的核心特点对比。
我个人建议,刚开始做视觉伺服时,先用Shi-Tomasi提取角点,配合Canny做边缘验证,特征匹配用ORB。这套组合在大多数场景下够用,而且调试起来不费劲。等遇到精度瓶颈了,再考虑上SIFT。
公众号:蓝海资料掘金营,微信deep3321