机器学习图像特征提取—SIFT特征提取原理及代码实现

目录

1 SIFT简介

2 SIFT原理及特点

2.1 SIFT算法特点

2.2 SIFT特征检测

3 SIFT代码实现


1 SIFT简介

       SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。

      SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

2 SIFT原理及特点

2.1 SIFT算法特点

   SIFT算法具有如下一些特点:

(1)SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

(2) 区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

(3) 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

(4)高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

(5)可扩展性,可以很方便的与其他形式的特征向量进行联合。

2.2 SIFT特征检测

  SIFT特征匹配主要包括2个阶段:

  第一阶段:SIFT特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量。

  第二阶段:SIFT特征向量的匹配。

  SIFT特征的生成一般包括以下几个步骤:

(1) 构建尺度空间,检测极值点,获得尺度不变性。

(2) 特征点过滤并进行精确定位。

(3)为特征点分配方向值。

(4)生成特征描述子。

      具体可以参考博客SIFT特征提取分析_Rachel-Zhang的博客-CSDN博客_sift特征提取 ,他这里写的非常的详细。

3 SIFT代码实现

(1)这部分主要是提取图像中的SIFT特征点,并在原图中绘制出来。

import cv2
img_path = r'./img1.jpg'
img = cv2.imread(img_path)
# print(img.shape)
# img = cv2.resize(img,(136 * 3,512 * 3))
cv2.imshow("original",img)

gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

#使用SIFT
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray,None)

cv2.drawKeypoints(image = img,
                  outImage = img,
                  keypoints = keypoints,
                  flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
                  color = (51,163,236))
cv2.imshow("SIFT",img)

img = cv2.imread(img_path)
# img = cv2.resize(img,(136 * 3,76 * 3))

cv2.waitKey(0)
cv2.destroyAllWindows()

(2)这部分代码是提取图像中的SIFT特征点,并利用PCA(主成分分析)进行降维,并提取特征值。注:SIFT提取出来的特征是一个128维的矩阵,我在这里利用PCA将其降成100维。

import cv2
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

img_path = r'./photo/2-5-1250-1.bmp'
img = cv2.imread(img_path)
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
#使用SIFT
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray,None)
# print(descriptor.shape)
# m,n=descriptor.shape
# print(m,n)
descriptor = StandardScaler().fit_transform(descriptor)
pca = PCA(n_components = 100)
pca.fit(descriptor)
print(pca.singular_values_)#查看特征值
print(pca.components_)#打印查看特征值对应的特征向量
# print(pca.components_.shape)

cv2.drawKeypoints(image = img,
                  outImage = img,
                  keypoints = keypoints,
                  flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
                  color = (255,0,255))
cv2.imshow("SIFT",img)

cv2.waitKey(0)
cv2.destroyAllWindows()

参考来源:SIFT特征提取分析_Rachel-Zhang的博客-CSDN博客_sift特征提取

Python计算机视觉——SIFT特征提取与检索_-pufferflip的博客-CSDN博客_sift特征提取python

物联沃分享整理
物联沃-IOTWORD物联网 » 机器学习图像特征提取—SIFT特征提取原理及代码实现

发表评论