sift+bag_of_words+LDA实现图片搜索(二)

8、直方图的匹配

通过kmeas得到聚类中心后,每张图片会得到一个直方图,最简单的比较方法如下:
图片a直方图:(a1,a2,a3,a4,a5..............)
图片b直方图:(b1,b2,b3,b4,b5..............)
直方图是向量,评价两个向量是否相似,最简单的办法就是求这两个向量的距离(夹角),距离(夹角)越小,说明两个向量越相似,从而也就代表两幅图像相似。
因而可以得出匹配的一般方法:将目标图片的直方图与图库里面所有图片的直方图全部计算距离,然后将距离按从小到大排序,排名越靠前说明该图与目标图片越相似。
但是这样也会产生问题,如果我的图片库很大,那么与图片库中每个直方图计算一次距离也是很费时间的,所以我们必须想办法减少匹配样本的数量。这里介绍一种办法:哈希表

如果中心有10W个,那么我们的直方图就是1*10w的向量,我们首先遍历图库里面所有直方图,再遍历直方图的每一维,如果该维不为0,我们就挂到列表的后面,列表的长度也是10W,比如图像1的直方图的第0维不为0,我们就把该图片挂到0的后面,图像10的第4维不为0,我们就把图片10挂到4的后面,这样我们就会得到一个统计表,第一维不为0的有*******图片,第二维不为0的有*******图片。这里推荐用C++ vector实现。
得到这样一个统计哈希表后,这个时候如果有图片需要匹配的,得到目标图片的直方图后,我们也遍历该直方图,如果第一维不为0,我们就比较哈希表第一维后面挂的图片的直方图,如果第一维为0,我们就跳过去。
这样做的道理在于,如果两幅图片相似,那么他们两个肯定有相同是视觉词汇,我们只需要比较含有相同词汇的直方图,这样就会过滤掉很多没有视觉词汇的图像,如果速度还是不符合要求,我们可以继续设定阈值,要含有相同视觉词汇>A个我们才比较。
通过上面的方法,我们已经可以轻松完成图像搜索的功能了。

9继续优化——LDA

通过撒谎女光面哈希表的方式,我们已经过滤掉了很多图像,提高匹配速度,我们可以从另一个角度来思考:我们可以预先将图片库中相似的图片分类,这时如果需要匹配,我们首先可以判断出该图属于某类,然后在已经分类的图库中查询,又会减少很多匹配的样本了,LDA介绍参考博客: http://blog.csdn.net/kamo54/article/details/7721679
LDA网上我找到的有两个版本,使用过程中,会有些小错,代码存在数组访问越界的问题,稍微把数组申请的改大就了,我使用的代码是GibbsLDA++,大家可以直接google可以下载到,接下来我说明下怎么将本系统使用到LDA代码中,LDA是无监督的学习算法,不用预先提供标签。输入文件如下:

第一行的200代表你的输入图片有200张,下面有200行数据,每行代表一张图片,每一行的数据就是该图像直方图不为0的项。
LDA的输出有4个文件:

这里我们分类只需要.theta文件:

该输出文件也有200行,我设置的将图片分为10类,所以文件每行有10列,10个数据中最大的那个数就是图像的归类,比如第一张图片第二列数据0.254961最大,所以第一张图片就属于第二类,我们自己可以写一个简单的程序将所有图片归类。
下面是我的其中4类分类效果:




看以看出每个分类的效果是非常好的。
经过LDA预先将图像库里面的图片分好类,然后再匹配的时候判断该图片的类别,只需要和对应类别里面的图像进行比较,效果会快很多。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值