首页 > 编程知识 正文

sift特征128维(opencv 模板匹配)

时间:2023-05-03 16:10:17 阅读:73677 作者:530

SIFT概念:不变尺度特征变换(SIFT )的全称是scaleinvariantfeaturetransformsift提取图像的局部特征,在尺度空间中寻找极值点,提取其位置、尺度、方向信息

Sfit的应用范围包括物体识别、机器人地图识别与导航、图像拼接、3D模型建立、手势识别、图像跟踪等。

Sift特征特点:1.对旋转、尺度尺度、亮度变化保持不变性,对视角变化、噪声等也有一定的稳定性

2 .独特性、信息量丰富,适合在海量特征数据中快速、准确匹配;

3 .多量性,少数物体也能生成大量的Sfit特征向量

4 .可扩展性,便于与其他形式的特征向量合作

Sfit算法的本质: Sfit算法的本质是在不同尺度空间中寻找关键点(特征点),计算关键点的大小、方向、尺度信息,用这些信息构成关键点来描述特征点的问题。 Sift可以找到不受光线、仿射变换和噪声等因素影响的“稳定”特征点,如拐角、边缘、深色高光和浅色暗色。 匹配的过程是比较这些特征点的过程。

SIFT特征提取与匹配的具体步骤:生成gxdmj差分金字塔(DOG金字塔),构建尺度空间

2 .空间极值点检测(关键点初步调查)。

3 .稳定关键点的准确定位

4 .稳定关键点方向信息的分配

5 .关键点说明

6 .特征点匹配

生成gxdmj差分金字塔(DOG金字塔),构建尺度空间:尺度空间:

在尺度空间、照相机中,计算机分辨不出一个场景的尺度信息。 与人眼不同,人脑中已经有关于物体的基本概念。 例如,普通人从十几米外看苹果和从附近看苹果,就可以识别出是苹果。 (人眼接近物体时,可以充分得到物体的特性,远离物体时,可以忽略细节。 例如,从近距离看脸部可以看到毛孔,从远处看不见毛孔等。 在图像信息中分辨率是固定的,为了得到人眼那样的效果,通过使图像成为不同的分辨率来制作金字塔图像,并模拟人眼的功能,在利用其他图像进行特征识别的情况下,即使像人眼那样识别的物体的尺寸变大或变小

尺度空间是指在图像区域模拟用人眼观察物体的概念和方法。 例如,观察一棵树时,关键是想观察是树叶还是整棵树。 如果是一棵树,就需要去掉图像的细节。 如果是树叶,就应该观察局部细节的特征。

图像金字塔

通俗地说,比例空间相当于一个图像需要获得多少分辨率的数量级。 将分辨率从原来的分辨率不断降低的图像堆积起来,看起来像金字塔。 这被称为金字塔图像。

金字塔图像是用多分辨率解释图像的结构,通过对原始图像进行多尺度像素采样,生成n个不同分辨率的图像。 具有最高分辨率的图像向下排列,呈金字塔形状,上面是一系列像素(大小)逐渐降低的图像。到金字塔顶部只有一个像素点的图像构成了传统意义上的图像金字塔。获得图像金字塔一般包括二个步骤:

1 .低通滤波器的图像平滑(gxdmj滤波) ) ) ) ) ) ) ) )。

2 .采样(采样)平滑图像有两种类型: ——上采样(上采样)和下采样(逐级降低分辨率)

gxdmj金字塔

主要思想是通过对原始图像进行尺度变换,得到图像多尺度尺度尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并将该主轮廓作为一个特征向量,实现边缘、角点检测在不同分辨率下的关键点提取等各尺度下图像的模糊度逐渐变大,能够模拟人从接近目标到远离目标的视网膜上的目标物体的形成过程。 尺度空间构建的基础是DOG金字塔,而DOG金字塔构建的基础是gxdmj金字塔。

gxdmj金字塔表达式是Sift运算符中提出的概念,首先gxdmj金字塔不是一个金字塔,而是组成了许多组(Octave )金字塔,每个组包含几个层(Interval )gxdmj金字塔构建过程:

1 .原始图像被首先放大两倍,作为gxdmj金字塔的第一组第一层,第一组第一层图像被gxdmj卷积(实际上,gxdmj平滑或gxdmj滤波),以及第一组金字塔的第二层。

2 .将乘以比例系数k,获得新的平滑系数=k,使用该新的平滑系数=k对第一组第二层图像进行平滑,并且将结果图像设置为第三层。

3 .这样重复,最终得到l层图像。 在同一组中,各层图像的尺寸相同,但平滑系数不同。 与这些对应平滑系数分别为0、、k、k2、k3……k^(L-2 )。

4 .对第一组倒数第三层的图像进行定标因子2的下采样,并且将所获得的图像作为第二组第一层,接着用平滑因子的gxdmj对第二组第一层的图像进行平滑,从而获得第二组第二层。 由此,对于第二组l层的图像,在该组内它们的尺寸相同,对应的平滑系数分别为0、、k,但在尺寸方面,第二组是第一组的图像的一半。

> (gxdmj公式)
反复执行,就可以得到一共O组,每组L层,共计OL个图像,这些图像一起就构成了gxdmj金字塔:
注意:
• 在同一组内,不同层图像的尺寸是一样的,后一层图像的 gxdmj平滑因子σ是前一层图像平滑因子的k倍;
• 在不同组内,后一组第一个图像是前一组倒数第三个图像 的二分之一采样,图像大小是前一组的一半;


从上图的实现结果可以发现:图像越往金字塔上层,越模糊

构建尺度空间
在gxdmj金字塔中一共生成O组L层不同尺度的图像,这两个量合起来(O,L)就构成了gxdmj金字塔的尺 度空间,也就是说以gxdmj金字塔的组O作为二维坐标系的一个坐标,不同层L作为另一个坐标,则给定 的一组坐标(O,L)就可以唯一确定gxdmj金字塔中的一幅图像。 尺度空间的形象表述:
• 图中尺度空间中k前的系数n表示的是第一组 图像尺寸是当前组图像尺寸的n倍。

SIFT算法在构建尺度空间时候采取gxdmj核函数进行滤波,使原始图像保存最多的细节特征,经过gxdmj滤波 后细节特征逐渐减少来模拟大尺度情况下的特征表示。 利用gxdmj核函数进行滤波的主要原因有两个:
(1)gxdmj核函数是唯一的尺度不变核函数。
(2)DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。 其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。 L(x, y, σ) ,定义为原始图像I(x, y)与一个可变尺度的2维gxdmj函数G(x, y, σ) 卷积运算。

尺度空间构建的基础是DOG金字塔,DOG金字塔构建的基础是gxdmj金字塔。

差分金字塔,DOG(Difference of Gaussian)金字塔是在gxdmj金字塔的基础上构建起来的, 其实生成gxdmj金字塔的目的就是为了构建DOG金字塔。 DOG金字塔的第1组第1层是由gxdmj金字塔的第1组第2层减第1组第1层得到的。
以此类推, 逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。概括为DOG金字塔的第o组 第l层图像是由gxdmj金字塔的第o组第l+1层减第o组第l层得到的。

但是实际结果:
原因就是差值很小,肉眼很难看见。
归一化之后:

2.空间极值点检测(关键点的初步查探)

特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的 相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。、 如下图,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保 在尺度空间和二维图像空间都检测到极值点。

注意,局部极值点都是在同一个组当中进行的,所以肯定有这样的问题,某一组当中的第一个图和 最后一个图层没有前一张图和下一张图,那该怎么计算? 解决办法是,在用gxdmj模糊,在gxdmj金字塔多“模糊”出三张来凑数,所以在DOG中多出两张。

gxdmj金字塔的k值计算:

s:每组图像中检测s个尺度的极值点。
(实际计算时,s通常在3到5之间) Sift算法中生成gxdmj金字塔的规则(M,N为原始图像的行数和列数):

+3就是因为在gxdmj金字塔要多“模糊”出三张来凑数

3. 稳定关键点的精确定位

DOG值对噪声和边缘比较敏感,所以在第2步的尺度空间中检测到的局部极值点还要经过进一步的筛选,去除不稳定和错误检测出的极值点。
利用阈值的方法来限制,在opencv中为contrastThreshold。

4. 稳定关键点方向信息分配

稳定的极值点是在不同尺度空间下提取的,这保证了关键点的尺度不变性。 为关键点分配方向信息所要解决的问题是使得关键点对图像角度和旋转具有不变性。
方法:
获取关键点所在尺度空间的邻域,然后计算该区域的梯度和方向,根据计算得到的结果创建 方向直方图,直方图的峰值为主方向的参数,其他高于主方向百分之80的方向被判定为辅助方向, 这样设定对稳定性有很大帮助。

这里讲解一下:每个小方格为一个像素点,通过求其周围一圈8个像素所得的梯度找其最大的梯度,为主方向,达到主方向百分之80的及以上的方向被判定为辅助方向,例如蓝色图片中,←为最大峰值,↗和↘为辅助方向。

对于任一关键点,其梯度幅值表述为:

梯度方向为:

5. 关键点描述

对于每一个关键点,都拥有位置、尺度以及方向三个信息。所以具备平移、缩放、和旋转不变性。 为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比 如光照变化、视角变化等等描述子不但包含关键点,也包括关键点周围对其有贡献的邻域点。
**描述的思路是:**对关键点周围像素区域分块,计算块内梯度直方图,生成具有独特性的向量,这个 向量是该区域图像信息的一种抽象表述。
如下图,对于22块,每块的所有像素点的灰度做gxdmj加权,每块最终取8个方向,即可以生成 228维度的向量,以这22*8维向量作为中心关键点的数学描述。

注意:Lowe实验结果表明:对于每个关键点采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。

6. 特征点匹配

特征点的匹配是通过计算两组特征点的128维的关键点的欧式距离实现的。 欧式距离越小,则相似度越高,当欧式距离小于设定的阈值时,可以判定为匹配成功。

具体步骤:
1、分别对模板图(参考图,reference image)和实时图(观测图,observation image)建立关键点描述 子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度 量采用欧式距离。
2、匹配可采取穷举法完成。

代码实现:

注意:(所以我也没有运行出来=。=)

完成SIFT1-5步的实现代码

import cv2import numpy as npimg = cv2.imread("lenna.png")gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create()keypoints, descriptor = sift.detectAndCompute(gray, None)# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS对图像的每个关键点都绘制了圆圈和方向。img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color=(51, 163, 236)) #img=cv2.drawKeypoints(gray,keypoints,img)cv2.imshow('sift_keypoints', img)cv2.waitKey(0)cv2.destroyAllWindows()

因为我也运行不了,所以就不给结果展示了,理解代码就好。

完成SIFT全部的实现代码

import cv2import numpy as np#画图函数部分def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 = img1_gray.shape[:2] h2, w2 = img2_gray.shape[:2] vis = np.zeros((max(h1, h2), w1 + w2, 3), np.uint8) vis[:h1, :w1] = img1_gray vis[:h2, w1:w1 + w2] = img2_gray p1 = [kpp.queryIdx for kpp in goodMatch] p2 = [kpp.trainIdx for kpp in goodMatch] post1 = np.int32([kp1[pp].pt for pp in p1]) post2 = np.int32([kp2[pp].pt for pp in p2]) + (w1, 0) for (x1, y1), (x2, y2) in zip(post1, post2): cv2.line(vis, (x1, y1), (x2, y2), (0,0,255)) cv2.namedWindow("match",cv2.WINDOW_NORMAL) cv2.imshow("match", vis)#图像输入img1_gray = cv2.imread("iphone1.png")img2_gray = cv2.imread("iphone2.png")#SIFT特征计算sift = cv2.SIFT()#sift = cv2.xfeatures2d.SIFT_create()#sift = cv2.SURF() kp1, des1 = sift.detectAndCompute(img1_gray, None)kp2, des2 = sift.detectAndCompute(img2_gray, None)#BFMatcher解决匹配bf = cv2.BFMatcher(cv2.NORM_L2)matches = bf.knnMatch(des1, des2, k = 2)#阈值对比,小于阈值时才被认为是匹配goodMatch = []for m,n in matches: if m.distance < 0.50*n.distance: goodMatch.append(m) drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch[:20]) cv2.waitKey(0)cv2.destroyAllWindows()

因为我也运行不了,所以就不给结果展示了,理解代码就好。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。