计算机视觉 - 特征检测与提取

什么是特征检测与提取?

特征检测是识别图像中具有独特特征的特定点或图案的过程。

特征提取涉及以可用于各种计算机视觉任务的方式描述这些检测到的特征。

这些步骤一起使计算机能够更有效地理解和解释视觉数据。

特征类型

我们可以将特征分为三种不同的类型,如下所示 −

  • 边缘:这些是图像亮度急剧变化的边界。它们表示图像内对象的轮廓。
  • 角:两个或多个边缘相交的点。它们通常出现在不同形状或物体的交叉点。
  • 斑点:图像中与周围区域相比在亮度或颜色等属性上不同的区域。

以下是一些常用的特征检测和提取技术 −

  • 边缘检测
  • 角点检测
  • 斑点检测
  • 特征描述符

边缘检测

边缘检测可识别图像中亮度急剧变化的点。这有助于突出显示图像内对象的边界。

常见的边缘检测方法如下所示 −

  • 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)
    
  • Canny 边缘检测器:一种多阶段算法,可检测图像中的各种边缘。
  • edges = cv2.Canny(image, 100, 200)
    

角落检测

角点检测可识别图像中两个或多个边缘相交的点。角点可用于跟踪和匹配不同图像之间的对象。

常见的角点检测方法如下所示 −

  • Harris 角点检测器:使用角点得分相对于方向的微分来查找角点。
  • corners = cv2.cornerHarris(image, 2, 3, 0.04)
    
  • Shi-Tomasi 角点检测器:Harris 角点检测器的改进版本,可选择最强的角点。
  • 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):与 SIFT 类似,但速度更快,准确度更低。
  • surf = cv2.SURF_create()
    keypoints, descriptors = surf.detectAndCompute(image, None)
    
  • 定向 FAST 和旋转 BRIEF (ORB):SIFT 和 SURF 的快速替代方案,结合了 FAST 关键点检测器和 BRIEF 描述符。
  • orb = cv2.ORB_create()
    keypoints, descriptors = orb.detectAndCompute(image, None)
    

特征检测和提取的应用

特征检测和提取用于各种计算机视觉应用程序,例如 −

  • 对象识别:识别和分类图像中的对象。
  • 图像匹配:查找相似图像或不同图像之间的匹配特征。
  • 运动跟踪:在一系列图像中跟踪对象的运动。
  • 3D 重建:从多个 2D 图像构建 3D 模型。