9 特征提取与描述之传统特征提取方法
系列进度
计算机视觉网络教程 · 第 9 / 31 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
传统特征方法在很多小任务里仍然有用,尤其是图像拼接、特征匹配和低算力场景。它们的优势是可解释、依赖少。
我会检查关键点数量、分布和匹配质量。关键点都挤在一小块区域,后面的匹配通常不稳。
在上篇文章中,我们讨论了特征的定义与重要性,强调了特征在计算机视觉任务中的核心作用。这一篇,我们将深入探讨一些传统的特征提取方法,这些方法在计算机视觉的早期广泛应用,并且为后续的深度学习方法奠定了基础。
传统特征提取方法概述
特征提取是从原始图像数据中提取出有用的信息以用于后续分析的过程。传统的方法通常涉及使用一些数学和图像处理算法来识别和描述图像的局部特征。以下是一些常见的传统特征提取方法。
学习传统特征提取时,先比较 SIFT、HOG、ORB 等方法关注的图像线索和鲁棒性。
1. 边缘检测
边缘是图像中灰度变化较大的地方,常常对应于物体的轮廓和边界。常用的边缘检测算法包括:
-
Canny 边缘检测:是一种多阶段算法,通过应用高斯滤波、计算梯度、非极大值抑制和双阈值检测来精确定位边缘。
import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 应用Canny边缘检测 edges = cv2.Canny(image, 100, 200) # 显示结果 cv2.imshow("Edges", edges) cv2.waitKey(0) cv2.destroyAllWindows()
2. 角点检测
角点是图像中明显的特征点,通常包含丰富的局部信息。常用的角点检测算法包括:
-
Harris 角点检测:通过计算图像的梯度信息,寻找变化显著的点,Harris 角点检测是一种经典的角点检测方法。
# Harris角点检测示例 dst = cv2.cornerHarris(image, 2, 3, 0.04) # 扩大角点并进行阈值判断 dst = cv2.dilate(dst, None) image[dst > 0.01 * dst.max()] = [0, 0, 255]
3. SIFT 与 SURF
虽然在某种程度上可以被认为是传统方法,但**尺度不变特征变换(SIFT)和加速稳健特征(SURF)**也逐步成为计算机视觉领域的基石。
-
SIFT: 提取图像中不变于尺度和旋转的特征点。SIFT算法利用高斯差分金字塔生成特征点,并为每个检测到的特征点计算描述子。
-
SURF: SURF方法是SIFT的快速版本,借助Hessian矩阵的特征表示来寻找关键点,也适用于实时应用。
# 使用OpenCV中的SIFT来提取特征 sift = cv2.SIFT_create() keypoints, descriptors = sift.detectAndCompute(image, None)
4. ORB(Oriented FAST and Rotated BRIEF)
ORB是一种快速且具有旋转不变性的特征提取算法,它结合了FAST角点检测和BRIEF描述子。由于它具有较高的速度和较少的资源消耗,ORB在实际应用中得到了广泛应用。
# 使用ORB提取特征
orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(image, None)
小案例分析:特征提取与匹配
为了更好地理解如何应用这些传统特征提取方法,我们可以考虑一个简单的特征匹配的案例。
开始读《特征提取与描述之传统特征提取方法》前,可以先看图中从问题到结果的路径。读完后再对照正文,确认自己能不能照着复现。
步骤 1:特征提取
# 读取两张待匹配的图像
img1 = cv2.imread('image1.jpg', 0) # 查询图像
img2 = cv2.imread('image2.jpg', 0) # 训练图像
# 使用SIFT提取特征
sift = cv2.SIFT_create()
keypoints1, descriptors1 = sift.detectAndCompute(img1, None)
keypoints2, descriptors2 = sift.detectAndCompute(img2, None)
步骤 2:特征匹配
使用BFMatcher或FLANN进行特征匹配:
# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
# 匹配特征
matches = bf.match(descriptors1, descriptors2)
# 按照距离排序
matches = sorted(matches, key=lambda x: x.distance)
# 画出匹配的结果
img_matches = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches[:10], None, flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)
cv2.imshow("Matches", img_matches)
cv2.waitKey(0)
在这个案例中,我们通过SIFT方法提取了两个图像的特征,并通过暴力匹配方法找到了它们之间的匹配点。
复习《特征提取与描述之传统特征提取方法》时,建议把关键概念、操作步骤和可见结果放在同一页里回看。
练习《特征提取与描述之传统特征提取方法》时,建议把输入条件、处理动作和可见结果写在一起,方便下次复查。
结论
传统特征提取方法在计算机视觉领域发挥了巨大的作用,并且为后来的先进技术打下了基础。在这篇文章中,我们探讨了多种经典的特征提取方法,包括边缘检测、角点检测、SIFT、SURF和ORB。通过实际代码示例,我们展示了如何提取和匹配特征,为后续深入讨论“特征描述子与匹配”打下了基础。
在下一篇文章中,我们将继续讨论特征描述子以及如何利用这些描述子进行高效的特征匹配。
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
特征提取与描述之传统特征提取方法适合谁读?
这是 计算机视觉网络教程 系列第 9 / 31 篇,适合正在学习计算机视觉网络教程,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇计算机视觉网络教程要多久?
按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读