sift算法是非常经典的特征提取算法,之后可以用于 对应特征匹配,从而进行图像拼接,求图像之间的转换矩阵,三维重建等工作。最近上课学习了这个算法,本打算能手敲源码,后来还是选择了调包,真香~

毕竟前人种树,后人乘凉嘛!利用好下层建筑为上层来进行服务!

目录

(1)sift特征提取步骤

1.   建立高斯差分金字塔

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

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

4.给关键点赋予方向

5.特征描述子 :128维向量 4*4*8=128

(2)VLfeat介绍

(3)利用matlab 结合VLfeat进行代码实现(+代码详细解读)


(1)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. 去除不好的特征点(非极大值抑制)

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

还有就是去掉边缘效应:https://blog.csdn.net/abcjennifer/article/details/7639681

4.给关键点赋予方向

关键点周围图像区域分块,计算块内方向梯度直方图,确定主方向。

5.特征描述子 :128维向量 4*4*8=128

(2)VLfeat介绍

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

有了它,不需要再闭门造轮子了,直接调包!

具体的安装步骤网上很多,下载后 matlab 命令行中run('D:\VLFeat\vlfeat-0.9.18\toolbox\vl_setup')  (这个是我的存放位置)

(3)利用matlab 结合VLfeat进行代码实现(+代码详细解读)

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 image
f2Moved=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')
end
hold off
%倒数第四行的...是因为matlab一行装不下,属于行行连接符

运行结果 :

对于其中一些变量进行展示:

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

SIFT算法用VL_feat库实现(matlab)相关推荐

  1. 尺度不变特征变换(SIFT算法)Matlab程序代码测试例子的说明(Lowe的代码)

    目前网络上可以找到的关于SIFT算法Matlab测试代码的资源就是: 1 加拿大University of British Columbia 大学计算机科学系教授 David G. Lowe发表于20 ...

  2. 【老生谈算法】matlab实现sift算法的图像匹配——sift算法

    基于sift算法的图像匹配matlab实现 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于sift算法的图像匹配matlab实现. ...

  3. 非常详细的sift算法原理解析

    尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun 转自:http://blog.csdn.net/zddblog/ ...

  4. 教你一步一步用C语言实现sift算法、上

    原文:http://blog.csdn.net/v_july_v/article/details/6245939 引言:     在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的 ...

  5. C语言实现寻找极值点,九之再续:教你一步一步用c语言实现sift算法、上

    教你一步一步用c语言实现sift算法.上 作者:July.二零一一年三月十二日 出处:http://blog.csdn.net/v_JULY_v 参考:Rob Hess维护的sift 库 环境:win ...

  6. 利用RobHess源码实现SIFT算法及RANSAC去错的图像特征提取匹配及去除错匹配

    本文是在VS2010+Opencv2.4.9环境下实现! 首先下载RobHess利用opencv实现SIFT算法源码,在配置好opencv环境的vs2010中实现SIFT特征提取.匹配,在利用K-D树 ...

  7. SIFT算法详解(二)

    目录(?)[-] 尺度不变特征变换匹配算法详解 Scale Invariant Feature TransformSIFT Just For Fun zdd  zddmailgmailcom SIFT ...

  8. 图像相似度算法--SIFT算法详解

    尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd  zddmail@gmail.com or (zddhu ...

  9. python+openCV使用SIFT算法实现印章的总相似度检测

    python实现,使用SIFT算法和文字相似度检测算法,并使用了pyqt5做的印章相似度检测工具,还有很大优化空间,对于我这水平费了不少力气,记录一下. 首先整体流程是预建了一个印章库,包含若干张图片 ...

最新文章

  1. 【图像分类】从数据集和经典网络开始
  2. .netcore持续集成测试篇之MVC层单元测试
  3. buffsize 缓冲区的大小多少合适_对于Redis性能指标监控!你了解多少?
  4. Java学习日报—注解、Hash、Lombok—2021/12/02
  5. 从Flutter路由报错引申BuildContext详解
  6. 幻灯片形式设计:从方法到技巧
  7. 携程状告去哪儿一案有猫腻
  8. show processlis
  9. mysql 连接数和内存的关系_php-fpm进程数和mysql连接数之间的关系
  10. 注塑模设计必懂的知识
  11. (窗口隐藏工具 3.40)自动隐藏指定的应用窗口及托盘图标
  12. 继杭州购房宝典后,Github上的这个程序员买房实用指南火了!
  13. 一级计算机页码居中,word中页码为何不能同时居中
  14. [文献阅读]—一篇不错的低资源机器翻译综述(Neural Machine Translation for Low-Resource Languages: A Survey)
  15. MyBatis-plus自动填充功能之自动填充时间
  16. webshell、木马与后门之间的区别
  17. R语言之空间数据操作
  18. matplotlib.pyplot.pie()绘制饼图
  19. 【华为机试真题 Python实现】篮球比赛【2022 Q1 Q2 | 200分】
  20. Zabbix+分布式数据库TiDB实现分布式数据库监控

热门文章

  1. 退换货通道不关闭,买家笑,卖家哭?
  2. IOS客户端app在线安装ipa包,
  3. [作业记录]——CASS实体编码
  4. Altium 学习笔记
  5. 如何避免漏洞?向日葵远程为你讲解不同场景下的安全使用方法
  6. matlab计算空间桁架,基于MATLAB的三维桁架有限元分析_宋志安.pdf
  7. D3D11与D3D9全屏/窗口化切换差异
  8. 万能营销软件8.508版本
  9. 使用yocto搭建 i.MX8QXP Linux 4.14.98_ga 板级开发包编译环境
  10. sklearn和tensorflow