9 特征提取与描述之传统特征提取方法

在上篇文章中,我们讨论了特征的定义与重要性,强调了特征在计算机视觉任务中的核心作用。这一篇,我们将深入探讨一些传统的特征提取方法,这些方法在计算机视觉的早期广泛应用,并且为后续的深度学习方法奠定了基础。

传统特征提取方法概述

特征提取是从原始图像数据中提取出有用的信息以用于后续分析的过程。传统的方法通常涉及使用一些数学和图像处理算法来识别和描述图像的局部特征。以下是一些常见的传统特征提取方法。

1. 边缘检测

边缘是图像中灰度变化较大的地方,常常对应于物体的轮廓和边界。常用的边缘检测算法包括:

  • Canny 边缘检测:是一种多阶段算法,通过应用高斯滤波、计算梯度、非极大值抑制和双阈值检测来精确定位边缘。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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 角点检测是一种经典的角点检测方法。

    1
    2
    3
    4
    5
    # 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矩阵的特征表示来寻找关键点,也适用于实时应用。

    1
    2
    3
    # 使用OpenCV中的SIFT来提取特征
    sift = cv2.SIFT_create()
    keypoints, descriptors = sift.detectAndCompute(image, None)

4. ORB(Oriented FAST and Rotated BRIEF)

ORB是一种快速且具有旋转不变性的特征提取算法,它结合了FAST角点检测和BRIEF描述子。由于它具有较高的速度和较少的资源消耗,ORB在实际应用中得到了广泛应用。

1
2
3
# 使用ORB提取特征
orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(image, None)

小案例分析:特征提取与匹配

为了更好地理解如何应用这些传统特征提取方法,我们可以考虑一个简单的特征匹配的案例。

步骤 1:特征提取

1
2
3
4
5
6
7
8
# 读取两张待匹配的图像
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进行特征匹配:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建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 特征提取与描述之传统特征提取方法

https://zglg.work/cv-network-tutorial/9/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论