SIFT、SURF等关键点特征提取算法代码

文章目录

  • 1.关键点特征提取算法
  • 2.SIFT代码(python+opencv)
  • 2.SURF代码(python+opencv)
  • 3.SIFT和SURF的比较

1.关键点特征提取算法

特征提取是提取出物体(如图片)的特征,用数学的向量、矩阵等对物体的特征做描述,做刻画。然后描述或刻画物体特征的这些信息就可以用来代表这类物体,之后应用到物体识别、分类等任务中。

所谓“特征”是物体具备的基本属性,我们通过某类物体的特征可以使得其区别于其它种类的物体。更进一步,如果我们获取到物体更细节的特征,就可以使得该物体区别于同类的其它物体。基于对“特征”基本概念的理解,我们结合图像处理,引入图像特征。图像特征被广泛应用于图像分类、人脸识别、目标跟踪等多种领域。

图像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征。
图像特征的分类形式是多样的,如分类成全局特征和局部特征。
颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。
纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。

图像的特征主要可以分为点、线(边缘)、区域(面)等特征,也可以分为局部特征和全局特征。
区域(面)特征提取比较麻烦,耗时,因此主要用点特征和边缘特征。
点特征提取方法包括:SIFT、SURF 、BRIEF、 FREAK 、 ORB 、 FAST 等。
边缘特征方法包括:LoG算子、Robert算子、Sobel算子、Prewitt算子、Canny算子等。

所谓关键点特征提取方法,是找到图像中具有旋转、平移、缩放等不变形特征的像素点,这些点被成为关键点。

根据图像中的具有不变性特征的关键点,就可以对图像做识别,匹配,分类等任务了。

2.SIFT代码(python+opencv)

代码中,有不懂的地方参考opencv官方文档,官方文档是最好的老师。
https://docs.opencv.org/4.5.2/

在这里插入图片描述
1处,选择opencv版本号;2处,检索



import numpy as np
import cv2
from matplotlib import pyplot as plt

#读入lena图形
imgname1 = './lena.png'
img1 = cv2.imread(imgname1)
#gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像

#使用opencv中封装的sift方法
sift = cv2.xfeatures2d.SIFT_create()

keyPoint, des = sift.detectAndCompute(img1,None)  #keyPoint是关键点的信息,des是关键点对应的描述信息

#把提取到的关键点,在原图中标出
img3 = cv2.drawKeypoints(img1,keyPoint,img1,color=(255,0,255)) #画出特征点,并显示为红色圆圈

#显示
cv2.imshow("SIFT", img3) 
cv2.waitKey(0)

原图
SIFT、SURF等关键点特征提取算法代码_第1张图片
结果图
SIFT、SURF等关键点特征提取算法代码_第2张图片

代码中:keyPoint是关键点的信息,des是关键点对应的描述信息

debug中,看到关键点 keyPoint 如下图,从0开始排序
SIFT、SURF等关键点特征提取算法代码_第3张图片
描述符 descriptor 就是如下所示的向量(每个sift关键点是一个128维的行向量),当然也可以说矩阵(多个关键点就构成矩阵)
下图没有显示全。
SIFT、SURF等关键点特征提取算法代码_第4张图片
SIFT、SURF等关键点特征提取算法代码_第5张图片
keyPoint所包含的信息有:
angle:角度,表示关键点的方向,通过Lowe大神的论文可以知道,为了保证方向不变形,SIFT算法通过对关键点周围邻域进行梯度运算,求得该点方向。-1为初值。
class_id:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要靠自己设定
octave:代表是从金字塔哪一层提取的得到的数据。
pt:关键点点的坐标
response:响应程度,代表该点强壮大小,更确切的说,是该点角点的程度。
size:该点直径的大小,特征点领域直径
SIFT、SURF等关键点特征提取算法代码_第6张图片

2.SURF代码(python+opencv)

import numpy as np
import cv2
from matplotlib import pyplot as plt

imgname = './lena.png'
src = cv2.imread(imgname)

surf = cv2.xfeatures2d.SURF_create() 

kp, des = surf.detectAndCompute(src, None)  # des是描述子

img = cv2.drawKeypoints(src, kp, src, color=(0, 0, 255))

#显示
cv2.imshow("SURF", img) #拼接显示为gray
cv2.waitKey(0)

#保存图像
save_path = 'F:\\xiangmu\\a.jpg'
cv2.imwrite(save_path, img)

3.SIFT和SURF的比较

Levels : common , good , best
SIFT、SURF等关键点特征提取算法代码_第7张图片
在这里插入图片描述

你可能感兴趣的:(python,特征提取,SIFT,SURF,OpenCV)