计算机视觉 - 特征检测与提取
什么是特征检测和提取?
特征检测是识别图像中具有独特特征的特定点或模式的过程。
特征提取涉及以可用于各种计算机视觉任务的方式描述这些检测到的特征。
这些步骤共同使计算机能够更有效地理解和解释视觉数据。
特征类型
我们可以将特征分为三种不同的类型,如下所示:
- 边缘:这些是图像亮度急剧变化的边界。它们表示图像中对象的轮廓。
- 角点:两个或多个边缘相遇的点。它们通常出现在不同形状或对象的交汇处。
- 斑点:图像中与周围区域相比,在亮度或颜色等属性上有所不同的区域。
以下是特征检测和提取的一些常用技术:
- 边缘检测
- 角点检测
- 斑点检测
- 特征描述符
边缘检测
边缘检测识别图像中亮度急剧变化的点。这有助于突出图像中对象的边界。
常见的边缘检测方法如下所示:
- Sobel算子:计算每个像素处图像强度的梯度,从而突出边缘。
import cv2
import numpy as np
# Load image in grayscale
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Apply Sobel operator
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)
斑点检测
斑点检测识别图像中与周围区域相比,在属性上存在显着差异的区域。斑点可以表示对象、形状或感兴趣区域。
常见的斑点检测方法如下所示:
- 高斯-拉普拉斯算子 (LoG):通过查找图像拉普拉斯算子的零交叉来检测斑点。
- 高斯差分 (DoG):LoG的近似值,通过减去两幅模糊图像来检测斑点。
- SimpleBlobDetector:OpenCV中内置的方法,根据面积、圆形度和凸度等参数检测斑点。
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模型。
广告