【opencv学习】SIFT算法的原理和基本使用

一:SIFT算法的原理

我们之前说过了特征的定义:
1)我们将图像中的某个特别的区域作为一个特征。特征是图像中有意义的图像区域,该区域具有独特特性或易于识别性。
2)角点和高密度区域是很好的特征,而大量重复的区域或低密度区域则不是很好的特征。边缘可将图像分为两个区域,因此也可作为好的特征。
3)斑点也是有意义的特征。

今天我们来看看SIFT(Scale Invatiant Feature Transform)算法的计算过程
我们先来介绍下这个SIFT的思想哈,这个算法是为了检测一张图像的特征,这个特征有啥用呢?我们识别一张图像的信息就是从关键的特征点来识别的,比如我们看一个人的图片,不管这个人有多远(近大远小),或者哪怕距离一定而清晰程度不一样,我们几乎都能辨别出来,或者这张照片中人的身体是倾斜的也能认出来哈,都是基于特征辨识的。

属于一张原始图像I(x, y),我们将按照下面步骤进行特征点检测。
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
测试代码如下:

import cv2
import numpy as np


# 展示图像,封装成函数
def cv_show_image(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止
    cv2.destroyAllWindows()


# 第一步:读取图像,咋换成灰度图
img = cv2.imread('images/build.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用cv2.xfeatures2d.SIFT_create() 实例化sift函数
sift = cv2.xfeatures2d.SIFT_create()

# 得到所有的关键点
keypoints = sift.detect(gray, None)  # 计算关键点
print(np.array(keypoints).shape)
keypoints, descriptor = sift.compute(gray, keypoints)  # 根据关键点计算周围区域的特征向量描述
print(np.array(keypoints).shape)
print(descriptor.shape)

# 或者一次性计算出关键点和特征向量,如下:
keypoints, descriptor = sift.detectAndCompute(gray, None)

# 打印特征点的信息,其中最关键的 kpoint.pt 就是包含了位置信息
for index, kpoint in enumerate(keypoints):
    print("关键点的位置是: pt[0]:{}\tpt[1]:{}".format(kpoint.pt[0], kpoint.pt[1]))

# 将关键点标记的图片上
img2 = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints,
                         flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
                         color=(255, 0, 0))

cv_show_image('SIFT', img2)

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/123365144