SIFT+BOW 实现图像检索

本文概述

图像检索是图像研究领域中一个重要的话题,广泛应用于医学,电子商务,搜索,皮革等。本文主要是探讨学习基于局部特征和词袋模型的图像检索设计。

图像检索概述

图像检索按照描述图像不同方式可以分为两类,一类是基于文本的图像检索(Text Based Image Retrieval),另一类是基于内容的图像检索(Content Based Image Retrieval)

基于文本的图像检索

基于文本的图像检索主要是利用文本标注的方式为图像添加关键词,比如图像的物体,场景等。在检索图像时候直接根据所要搜索的关键词就可以检索到想要的图像。这种方式实现起来简单,但是非常耗费人工(需要人为给每一张图像标注),对于大型数据库检索不太现实。此外,人工标注存在人为认知误差,对相同图像,人理解不一样,也到导致标注不一致,这使得基于文本的图像检索逐渐失去光彩。

基于内容图像检索

基于内容的图像检索技术是基于图像自身的内容特征来检索图像,这免去人为标注图像的过程。基于内容的图像检索技术是采用某种算法来提取图像中的特征,并将特征存储起来,组成图像特征数据库。当需要检索图像时,采用相同的特征提取技术提取出待检索图像的特征,并根据某种相似性准则计算得到特征数据库中图像与待检索图像的相关度,最后通过由大到小排序,得到与待检索图像最相关的图像,实现图像检索。这种方式使得检索过程自动化,图像检索的结果优劣取决于图像特征提取的好坏,在面对海量数据检索环境中,我们还需要考虑到图像比对(图像相似性考量)的过程,采用高效的算法快速找到相似图像也至关重要。

图像检索主要流程

1、设计预处理流程,对图像数据进行预处理(增强,旋转,滤波,切分等)
2、设计特征提取模块,对图像数据进行高效稳定可重复的特征提取(比如SIFT,SURF,CNN等)
3、对图像数据库建立图像特征数据库
4、抽取检索图像特征,构建特征向量
5、设计检索模块,包含相似性度量准则,排序,搜索
6、返回相似性较高的结果

图像检索所面临的挑战

  1. 图像光照变化
  2. 尺度变化
  3. 视角变化
  4. 遮挡
  5. 背景混乱
  6. 仿射变换

本文实现流程

图像数据集的读取

自己从网上下了十来张图片,有几个美女,有几条狗,有几只猫,还有一本自己拍的书(三个角度拍的)
这里写图片描述

SIFT提取图像局部特征

SIFT算法是提取特征的一个重要算法,该算法对图像的扭曲,光照变化,视角变化,尺度旋转都具有不变性。SIFT算法提取的图像特征点数不是固定值,维度是统一的128维。SIFT算法我之前也总结过(SIFT算法学习总结)。

KMeans聚类获得视觉单词,构建视觉单词词典

现在得到的是所有图像的128维特征,每个图像的特征点数目还不一定相同(大多有差异)。现在要做的是构建一个描述图像的特征向量,也就是将每一张图像的特征点转换为特征向量。这儿用到了词袋模型,词袋模型源自文本处理,在这儿用在图像上,本质上是一样的。词袋的本质就是用一个袋子将所有维度的特征装起来,在这儿,词袋模型的维度需要我们手动指定,这个维度也就确定了视觉单词的聚类中心数。

这儿可以这么理解
这里写图片描述
SIFT提取的特征点代表图中的一个小圆圈,很多图像中提取出的特征点代表的属性是类似的,比如某些特征表征脸(这么说很不严谨,但是可以粗浅的这么理解),那么那些表征脸的特征点就会聚集在一起,形成一个簇。那么词袋就是将face,leg,mouth那些特征簇框起来的袋子,一个簇其实也就代表了一个维度的特征,那么怎么让计算机自动形成簇呢?继续往下看。

构造图像特征

熟悉聚类算法的同学已经明白了,上面讲的簇就是通过聚类算法得到的,聚类算法将类别相近,属性相似的样本框起来,是一种无监督学习算法。在本文中,我使用了Kmeans算法来聚类得到视觉单词(也就是face,leg等),通过聚类得到了聚类中心,通过聚类得到了表征词袋的特征点。

ok,到现在,我们得到k个聚类中心(一个聚类中心表征了一个维度特征,k由自己手动设置)和先前SIFT得到的所有图片的特征点,现在就是要通过这两项来构造每一张图像的特征向量。
在本文中,构造的思路跟简单,就是比对特征点与所有聚类中心的距离,将特征点分配到距离最近的特征项,比如经计算某特征点距离leg这个聚类中心最近,那么这个图像中leg这个特征项+1。以此类推,每一张图像特征向量也就构造完毕。

搜索目标图像相似图像

搜索相似图片其实就是在高维特征空间中,寻找靠近的小伙伴的过程。这儿我使用的暴力法,也就是一个个比对检索图片与数据库中所有图片的距离(距离就用的欧式距离计算的),然后排序,得到最接近的图片。在大型数据库中肯定不能这么做,简单的优化思路是可以先将要搜寻的数据集做划分,这儿划分可以理解为特征空间的划分。比如可以用哈希编码来,也可以用神经网络(挺fashion!)。这样在子空间里寻找相似图像就快得多。还有思路就是对数据库做索引,空间换时间。

最后得到的结果
这里写图片描述
这里写图片描述
这里写图片描述

总结

由上面检索不同图片的结果,可以发现,对于简单的物体(在我如数据集中猫,狗,书)检索的结果差强人意,对于大美女的检索结果简直不能看(可能背景比较复杂,还有美女姿势啊,身材啊。。。产生了比较大的影响),最后发现对于书的检索结果是最棒的。

不足之处

  1. Kmeans聚类时间长
  2. 词袋表征特征的过程其实牵涉到量化的过程,这其实损失了特征的精度。
  3. 检索模块设计的太粗糙,速度太慢
  4. 没有设计反馈系统,系统无法自动升级
  5. 主要还是慢和精度不高(这么点图片,聚类就花了很久)

github地址

https://github.com/zhaoxin111/imageRetrieval

参考文献

http://yongyuan.name/blog/cbir-technique-summary.html
http://yongyuan.name/blog/CBIR-BoW-for-image-retrieval-and-practice.html
Csurka G, Dance C, Fan L, et al. Visual categorization with bags of keypoints[C]//Workshop on statistical learning in computer vision, ECCV. 2004, 1(1-22): 1-2.

  • 15
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: SIFT算法是一种常用的图像特征提取算法,可以在多张图像中提取出共同的特征点,通过这些特征点可以实现图片的拼接和融合。而RANSAC算法则可以有效地去除噪声和误匹配点,提高图片拼接的准确性和效果。 在Matlab中实现SIFT和RANSAC算法的关键是调用相应的函数包。其中,VLFeat是一个常用的图像特征库,可以实现SIFT特征的提取和描述,也提供了RANSAC算法的支持。同时,还需要使用Matlab中的图像处理工具箱。假设我们有两张需要拼接的图片,可以先将其读入Matlab中,并提取出SIFT特征点和特征描述符。然后,对于两张图片中的特征点进行匹配,可以使用VLFeat提供的函数vl_ubcmatch,得到特征点的匹配对。 接着,应用RANSAC算法去除误匹配的点,可以使用VLFeat中的函数vl_ubcmatch。RANSAC算法的本质是随机抽样点,并根据这些点得到一个拟合模型,然后计算内点数量。重复进行多次,最终得到最优的模型和内点集合。这些内点就是真正对应的点,可以用于后续的图像拼接和融合。 最后,进行图像拼接和融合操作,可以使用Matlab中的函数imwarp和imfuse。根据内点的对应关系,可以对其中一个图像进行仿射变换,然后将两张图片拼接在一起。最后,应用图像融合算法(如线性混合)将两张图片融合,得到最终的结果。 总之,通过Matlab的SIFT和RANSAC算法的支持,可以实现图像拼接和融合,得到一个更加全面和高清晰度的图片。 ### 回答2: SIFT(Scale-invariant feature transform)是一种计算机视觉算法,常用于图像匹配和图像拼接的应用。而RANSAC(Random Sample Consensus)是一种随机取样一致性算法,常用于找出拟合模型中的正确数据点。本文将介绍如何使用MATLAB实现SIFT RANSAC图像拼接与融合。 一、SIFT特征提取 使用MATLAB提供的vlfeat工具箱中的函数可以很容易地实现SIFT特征提取。下面是一个简单的SIFT图像拼接程序: ``` img1 = imread('image1.jpg'); img2 = imread('image2.jpg'); [f1, d1] = vl_sift(single(rgb2gray(img1))); [f2, d2] = vl_sift(single(rgb2gray(img2))); [matches, scores] = vl_ubcmatch(d1, d2); ``` 在上述代码中,我们首先读入了两张需要拼接的图片。接着,使用vl_sift()函数分别提取两张图像的SIFT特征点。vl_ubcmatch()函数可以通过匹配两组SIFT特征点来找出它们之间的最佳对应关系。 二、RANSAC算法 在得到了匹配的SIFT特征点后,我们需要使用RANSAC算法来处理这些点。该算法可以通过随机取样一致性来找出那些不属于离群点的正确匹配点。以下是一个简单的RANSAC算法实现: ``` bestF = []; bestscore = 0; for i =1:1000 subset = vl_colsubset(1:size(matches,2), 8); A = []; B = []; for j = subset A = [A; f1(1:2, matches(1,j))']; B = [B; f2(1:2, matches(2,j))']; end F = fit_8_point_algorithm(A, B); [inliers, score] = compute_inliers(F, matches); if score > bestscore bestscore = score; bestF = F; end end ``` 上述代码中,我们使用vl_colsubset()函数从匹配对中随机抽取了八对特征点,并使用fit_8_point_algorithm()函数估计出一个Fundamental Matrix。接着,我们使用compute_inliers()函数计算出符合要求的内点,并将其与之前的最佳结果进行比较。 三、图像拼接与融合 最后一步是将两张图片进行拼接,并使用MATLAB提供的image blending技术进行融合。以下是一个简单的图像拼接与融合代码: ``` [tform, inlierPtsDistorted, inlierPtsOriginal] = estimateGeometricTransform(... f1(1:2, matches(1,:))', f2(1:2, matches(2,:))', 'projective'); outputView = imref2d(size(img1) + [1500 1500]); panorama = imwarp(img1, tform, 'OutputView', outputView); panorama(1:size(img2, 1), 1:size(img2, 2), :) = img2; mask = imwarp(ones(size(img1(:,:,1))), tform, 'OutputView', outputView); mask(1:size(img2, 1), 1:size(img2, 2)) = 1; panoramaBlended = imblend(panorama, mask, img2, mask, 'blend'); figure; imshow(panoramaBlended); ``` 上述代码中,我们首先使用estimateGeometricTransform()函数计算出图像之间的几何变换关系。接着,我们将拼接后的图像放在一个合适的画布上,并使用imblend()函数进行图像融合。 四、总结 以上就是使用MATLAB实现SIFT RANSAC图像拼接与融合的基本流程。由于本文仅是一个简单的示例程序,实际应用中可能需要更多的调试和细化。 ### 回答3: MATLAB是一种流行的科学计算软件,其中包括很多图像处理工具箱,其中就包括了SIFT和RANSAC算法SIFT算法是一种常用的图像特征提取方法,而RANSAC则是一种常用的图像配准算法。 图像拼接和融合是常见的图像处理任务之一,它可以将多幅图像拼接成一张大图或者将多幅图像融合成一幅更好的图像。在MATLAB中实现图像拼接和融合可以使用以下步骤: 1. 使用SIFT算法提取每幅图像的特征点。 2. 使用RANSAC算法计算图像之间的对应点,并过滤掉误匹配的点。 3. 使用变换矩阵将图像对齐,其中变换矩阵可以使用RANSAC算法得到。 4. 将图像拼接在一起,或者将多幅图像融合成一幅更好的图像。 在实现过程中,需要考虑到RANSAC算法需要调整其参数,以提高配准的精度和鲁棒性。同时,还需要注意对齐后的图像可能会出现边缘裁剪或者黑色填充的问题,需要进行一些处理以优化最终结果。 总之,使用MATLAB实现SIFT和RANSAC算法结合图像拼接和融合是一项复杂的任务,需要深入了解这些算法的原理,并实践调整其参数和优化结果。但是一旦掌握了这些技术,就可以实现很多有用的图像处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值