计算机视觉 - 特征检测与提取
什么是特征检测与提取?
特征检测是识别图像中具有独特特征的特定点或图案的过程。
特征提取涉及以可用于各种计算机视觉任务的方式描述这些检测到的特征。
这些步骤一起使计算机能够更有效地理解和解释视觉数据。
特征类型
我们可以将特征分为三种不同的类型,如下所示 −
- 边缘:这些是图像亮度急剧变化的边界。它们表示图像内对象的轮廓。
- 角:两个或多个边缘相交的点。它们通常出现在不同形状或物体的交叉点。
- 斑点:图像中与周围区域相比在亮度或颜色等属性上不同的区域。
以下是一些常用的特征检测和提取技术 −
- 边缘检测
- 角点检测
- 斑点检测
- 特征描述符
边缘检测
边缘检测可识别图像中亮度急剧变化的点。这有助于突出显示图像内对象的边界。
常见的边缘检测方法如下所示 −
- Sobel 算子:计算每个像素处图像强度的梯度,从而突出显示边缘。
import cv2
import numpy as np
# 以灰度加载图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用 Sobel 算子
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)
sobel_combined = cv2.sqrt(sobel_x**2 + sobel_y**2)
edges = cv2.Canny(image, 100, 200)
角落检测
角点检测可识别图像中两个或多个边缘相交的点。角点可用于跟踪和匹配不同图像之间的对象。
常见的角点检测方法如下所示 −
- Harris 角点检测器:使用角点得分相对于方向的微分来查找角点。
corners = cv2.cornerHarris(image, 2, 3, 0.04)
corners = cv2.goodFeaturesToTrack(image, 100, 0.01, 10) corners = np.int0(corners) for corner in corners: x, y = corner.ravel() cv2.circle(image, (x, y), 3, 255, -1)
斑点检测
斑点检测可识别图像中与周围区域相比属性有显著差异的区域。 Blob 可以表示对象、形状或感兴趣的区域。
常见的 Blob 检测方法如下所示 −
- 高斯拉普拉斯 (LoG):通过查找图像拉普拉斯中的零交叉来检测 Blob。
- 高斯差 (DoG):LoG 的近似值,通过减去两个模糊图像来检测 Blob。
- SimpleBlobDetector:OpenCV 中的内置方法,可根据面积、圆度和凸度等参数检测 Blob。
params = cv2.SimpleBlobDetector_Params() detector = cv2.SimpleBlobDetector_create(params) keypoints = detector.detect(image) im_with_keypoints = cv2.drawKeypoints(image, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
特征描述符
一旦检测到特征,特征描述符就会以可用于匹配或识别的方式描述这些特征。描述符将特征的外观和形状编码为数值向量。
常见的特征描述符如下所示 −
- 尺度不变特征变换 (SIFT):检测并描述图像中的局部特征,不受尺度和旋转的影响。
sift = cv2.SIFT_create() keypoints, descriptors = sift.detectAndCompute(image, None)
surf = cv2.SURF_create() keypoints, descriptors = surf.detectAndCompute(image, None)
orb = cv2.ORB_create() keypoints, descriptors = orb.detectAndCompute(image, None)
特征检测和提取的应用
特征检测和提取用于各种计算机视觉应用程序,例如 −
- 对象识别:识别和分类图像中的对象。
- 图像匹配:查找相似图像或不同图像之间的匹配特征。
- 运动跟踪:在一系列图像中跟踪对象的运动。
- 3D 重建:从多个 2D 图像构建 3D 模型。

