生手从零开始学,相似图像匹配SIFT算法(一)

新手从零开始学,相似图像匹配SIFT算法(一)


开始学习SIFT算法已经有半个月了,总算弄懂它是怎么回事了!


1、这次项目是做相似图片搜索,项目需求大致确定后;就在百度里乱搜一通,搜图像匹配或图像识别之类的关键词,可以搜出一大堆东西,什么google图像匹配原理啊,什么颜色直方图啊,什么数学形态学,数字图像处理等等,当时一下子觉得很欣慰——毕竟有copy或者imitate的例子了!但是,直到写了什么感知哈希算法和一些颜色直方图之后,发现其实这些方法几乎只能用来匹配相同的图片!注意,是相同,不是相似!效果完全不是我想要的那种。后来问几个前辈和图像处理方面的算专家吧,连带百度,折腾了好几天,终于敲定选择SIFT算法来实现。


2、SIFT算法的讲解,网上一大堆,一搜又是一大堆!点开什么sift详解一看,天呐!这哪是我辈技术渣渣看的:各种复杂数学公式,各种新概念不懂。于是马上关掉,又去搜索一些图像匹配和识别原理,又看了一些数字图像处理方面的电子书,比如这个形态学图像处理:
http://max.book118.com/html/2013/0323/3481960.shtm
okay!再来,硬着头皮吧!有什么不懂的概念就马上搜。当时主要研究这篇博文:
http://blog.csdn.net/zddblog/article/details/7521424
写得还是很不错的,大概花了一个星期才完全搞定是怎么回事,虽然在精确求特征点坐标那一方面现在还不会求解,但是sift的原理,多少步,每一步干什么,大致都清楚了!在这里感谢华科的“敏姐”给我讲了高斯金字塔的思路。


3、好吧,原理懂了,开始摸索着写个小例子吧!(已近过了12天了) 写代码的时候也是边写边看博文里的公式,到今天一步一步下来,写完了特征点的检测。


然后,完了!问题出现了!检测出的特征点为什么和我想象的不一样?而且把图像旋转一下还会有少数点也不一样!不敢继续写了,因为sift描述子很麻烦,应该会大大增加程序的时间复杂度!而且这么多尺度的特征点到底应该怎么进行匹配?(逐点匹配吗?但是不同尺寸的图像产生的金字塔层数不一样,肯定不是逐一匹配的)开始不理解为什么网上的图像都只是在原图上标示出一些特征点了,现在看来,似乎有点故弄玄虚!(等我做出来,肯定会详细到每一层图像的= =)


虽然有点卡住了,但是至少对sift已经算熟悉了吧,对一个刚开始一无所知的我来说,也算有点小满足感。当然,我觉得一开始先学的数字图像处理知识,以及写的感知哈希算法和灰度直方图判断相似的小demo对后来的学习和理解帮助还是很大的!再接再厉,接下来好更深层次的自己去探究一下sift的原理,毕竟lowe的很多数据都是经过测试出来的,就连差分金字塔也是!继续加油!
    

1楼lgpjxjjxmumail昨天 22:08
请问下lz,最近要用到SIFT,但我不是研究这个方向的,找了代码提取出来的图像的SIFT特征是很多128维的向量,都是浮点数,确切的说是double,能不能同时乘以一个大整数取整,比如同时乘以1000取整,这样得到的特征向量就是整数了,以便于后面的处理和查看,我想向量同时乘以一个整数应该不会影响它表示图像特征的能力吧,楼主怎么看?
Re: abcd_d_25分钟前
回复lgpjxjjxmumailn一般不能乘以一个数来取整, 因为在计算向量的最后一步,我们是要把它归一化处理的,这样就去除了光照强度的影响。如果你要乘,必须每个向量都乘以这个数(如果你愿意)。我觉得你还是需要用的时候再扩大成整数为好
Re: lgpjxjjxmumail20分钟前
回复abcd_d_n嗯 多谢lz