失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SIFT介绍与matlab+VL_feat实现

SIFT介绍与matlab+VL_feat实现

时间:2021-08-17 04:16:16

相关推荐

SIFT介绍与matlab+VL_feat实现

目录

sift特征提取步骤

1. 建立高斯差分金字塔

2.关键点(keypoint)位置的确定

3. 去除不好的特征点(非极大值抑制)

一、下载VLFeat的binary包:

二、解压vlfeat-0.9.20-bin.tar文件,得到vlfeat-0.9.20-bin文件,接着再解压vlfeat-0.9.20-bin文件得到一个文件夹(vlfeat-0.9.20)和一个文件(pax_global_header)。

三、在matlab中安装配置

1、一次安装配置方式

4、检查是否安装成功

5 但这样安装并不能保证关闭matlab以后重新使用。所以在matlab的默认路径的情况下,在命令窗口输入:

6、 关闭后重新运行matlab

四、SIFT代码运行

sift特征提取步骤

1. 建立高斯差分金字塔

O组(octave 默认大小为 )照片,每组L层(L=n+3,L一般为3~5) ;一共 O*L张照片。

每一组中每层采用不同的高斯模糊核,下一组由 上一组进行下采样得到。

图片说明了每一组每一层中的照片采用的模糊核是多少。

(第1组的第1层为,第2组第1层为2.... 数学技巧呀)

此例中s=3,也就是 每一组照片的层数=s+3 为6层。

2.关键点(keypoint)位置的确定

看高斯差分金字塔为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,但现在由上面的图片可以看 出,有三个方向(x,y,尺度空间(一组内不同的高斯核,)),所以一个点应该与26个点进行比较。

3. 去除不好的特征点(非极大值抑制)

在实际中这个点有可能只是真正极值点附近的点,即找到的点为“亚极值点”,要进行处理一波,实际用的泰勒展开,进 行求导来做的,这里忽略了。

还有就是去掉边缘效应:/abcjennifer/article/details/7639681

(2)VLfeat介绍

VLFeat是一个跨平台的开源机器视觉库,它囊括了当前流行的机器视觉算法,如SIFT, MSER, HOG, 同时还包含了诸如K-MEANS, Hierarchical K-means的聚类算法。它由C语言编写,并提供了Matlab接口及详细的文档。当前最新的版本是VLFeat 0.9.21 。(.4.11)

一、下载VLFeat的binary包:

VLFeat 0.9.20 binary package(点击下载)下载得到vlfeat-0.9.20-bin.tar文件

二、解压vlfeat-0.9.20-bin.tar文件,得到vlfeat-0.9.20-bin文件,接着再解压vlfeat-0.9.20-bin文件得到一个文件夹(vlfeat-0.9.20)和一个文件(pax_global_header)。

三、在matlab中安装配置

1、一次安装配置方式

view plaincopy

其中VLFEATROOT为VLFeat的安装目录,本文中为:

run("D:\Matlab\vlfeat-0.9.21\toolbox/vl_setup")

4、检查是否安装成功

vl_version verbose

则安装成功

5 但这样安装并不能保证关闭matlab以后重新使用。所以在matlab的默认路径的情况下,在命令窗口输入:

edit startup.m

保存并关闭。

6、 关闭后重新运行matlab

输入vl_version

测试是否安装成功,如果成功,则会出现版本号

四、SIFT代码运行

代码

img1ori = imread('Snowball.jpg');img1 = single(rgb2gray(img1ori)); %single就是转换成单精度的,之前肯定对double更熟悉一点吧%因为后面的vl_sift的输入须要用到单精度灰度图像%图片2要识别对于的物体 img2ori = imread('Snowball.jpg');img2 = single(rgb2gray(img2ori));%% 提取SIFT特征,匹配特征点[f1, d1] = vl_sift(img1,'Levels',5,'PeakThresh', 4); [f2, d2] = vl_sift(img2,'Levels',5,'PeakThresh', 5); %f1为生成的四元组[x,y,s,th],分别是特征点的x,y坐标,s为长度空间大小,th指的是主方向%d1是特征描述子,也就是那个128维的向量[matches, scores] = vl_ubcmatch(d1, d2);[dump,scoreind]=sort(scores,'ascend');%% 绘制组合图片newfig=zeros(size(img1,1), size(img1,2)+size(img2,2),3); %新构建一个3维数组,行为图片1的%行数,列为图片1和图片2的列数和newfig(:,1:size(img1,2),:) = img1ori;newfig(1:size(img2,1) ,(size(img1,2)+1):end,:)=img2ori;newfig=uint8(newfig);figure;image(newfig); % 绘制组合图片axis image% colormap(gray)%% 绘制匹配特征点figure;image(newfig); % 绘制组合图片+匹配对于的特征点axis imagef2Moved=f2; %因为此时图像在x方向发生了平移的,需要平移的大小为图1的列数m=size(img1,2)f2Moved(1,:) = f2Moved(1,:)+size(img1,2);h1 = vl_plotframe(f1); %对之前的四元组在组合照片上进行绘画h2 = vl_plotframe(f2Moved);set(h1,'color','g','linewidth',2) ;set(h2,'color','r','linewidth',2);hold on% 绘制scores前10%plotRatio=0.1;for i= 1:fix(plotRatio*size(matches,2)) %fix是取整函数,这里仅画出找到的匹配的前10%idx = scoreind(i);line([f1(1,matches(1,idx)) f2Moved(1,matches(2,idx))],...[f1(2,matches(1,idx)) f2Moved(2,matches(2,idx))], 'linewidth',1, 'color','b')endhold off%倒数第四行的...是因为matlab一行装不下,属于行行连接符

运行结果

scores是上面matches到的对应点的欧式距离,后面的scoreind是对欧式距离按由小到大进行排序,储存的是距离对于的序号

原文链接:/zyr_freedom/article/details/89205651

如果觉得《SIFT介绍与matlab+VL_feat实现》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。