005 OpenDIR搭建简单的图像检索系统

Post date: 2016/1/5 上午 11:51:50

2012-12-23阅读1143 评论1

使用OpenDIR搭建简单的图像检索系统

作者:小斤(陈忻)

转载自:http://blog.csdn.net/chenxin_130/article/details/6648280

------------------------------------------------------------------------------------------------------------------------------------------

图像检索看似是一门高深的学问,我们在享受谷歌,百度,Tineye等检索服务的同时,有没有想过自己也能搭建一个图像检索系统呢?OpenDIR是一个在google code上简单的开源文档图像检索应用。常见的图像检索基本是以自然图像的精确或相似检索为主,而OpenDIR则实现于以文本为主体的图像相似检索算法,比如生活中各类文书的电子扫描件等等。目前版本的OpenDIR使用了两种特征,projection histogram feature和density distribution feature,计算向量间的Cosine相似度进行相似匹配。

编译:

该项目的主页在http://code.google.com/p/opendir/,在download中下载新版本的源代码解压后,是一个VC 2008的工程。同时,项目也提供了可执行的压缩包。

在编译工程之前,首要要保证的是VC中已经配置了OpenCV。OpenCV作为开源计算机视觉库,应用已经比较广泛了,甚至在著名河蟹软件的“绿爸”中都能找到它的芳影。具体的安装和配置可以在http://www.opencv.org.cn/及其官网http://opencv.willowgarage.com/wiki/ 找到,这里小斤就不再赘述了。VS2010的话,可以直接下载opencv for VS2010,连Build步骤都省了。

对于OpenDIR,VC2008以上版本,直接打开项目或转换一下,build就可以用了。如果是VC2005等版本,可以直接建立一个空项目,把OpenDIR的一家老小都放进去Build,或者直接改vcproject文件中的Version参数。

使用:

OpenDIR执行时可以输入两个指令,-w和-r,-w 后跟输出的特征数据文件名, -r 后跟输入的特征数据文件名。

后台供检索的图片库,需在inputimage.txt这个文件中指定,使用-w指令后,会将所有后台图像的特征计算后,通过增量的方式存入特征数据文件中。

有了特征数据文件,只要调用-r指令就可以载入特征数据文件,而不需要重新计算后台图片的特征,直接开始检索了。

下载的源码包中已经包含了testimg文件夹和inputimage.txt,其中包含了几张文档图像,以及一张test.jpg的模糊图片用作测试。

在VC工程的属性-Debugging-Command Arguments,我们输入"-w feature.txt -r feature.txt"(引号内的内容),让OpenDIR计算特征数据文件后,再直接载入,进行检索。

执行过程中,可以看到feature.txt被生成了,打开窥一窥:

[plain] view plaincopy

  • imagepath=testimg\1.jpg
  • index=0
  • DDFLength=120
  • PHFLength=50
  • FusionFeature=3, 12, 20, 20, 17, 12, 8, 8, 8, 8, 7, 3, 0, 0, 1, 41, 83, 86, 85, 80, 62, 0, 0, 0, 0, 0, 0, 48, 98, 100, 82, 85, 75, 0, 0, 0, 0, 0, 0, 48, 99, 99, 93, 100, 58, 0, 0, 0, 0, 0, 0, 48, 100, 100, 95, 84, 59, 0, 0, 0, 0, 5, 15, 16, 18, 19, 18, 14, 8, 4, 4, 0, 0, 11, 22, 13, 13, 13, 14, 13, 7, 7, 7, 0, 0, 1, 24, 21, 11, 10, 7, 8, 7, 8, 2, 0, 0, 8, 20, 13, 11, 5, 5, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 9, 11, 13, 11, 0, 70, 13, 88, 7, 38, 56, 53, 57, 53, 53, 57, 53, 53, 57, 53, 57, 53, 53, 57, 51, 53, 57, 53, 57, 53, 26, 34, 61, 43, 80, 85, 24, 16, 27, 100, 18, 24, 77, 52, 18, 15, 15, 53, 38, 17, 0, 0, 0, 79, 37
  • imagepath=testimg\2.jpg
  • index=1
  • DDFLength=120
  • PHFLength=50
  • FusionFeature=7, 16, 15, 17, 16, 16, 10, 14, 15, 12, 13, 10, 8, 1, 29, 31, 32, 32, 32, 32, 32, 31, 0, 0, 0, 3, 100, 99, 100, 100, 100, 100, 100, 100, 3, 0, 0, 3, 100, 98, 96, 98, 90, 100, 100, 100, 3, 0, 0, 3, 100, 100, 99, 99, 97, 100, 100, 100, 3, 0, 4, 9, 51, 51, 51, 51, 52, 50, 51, 48, 1, 0, 14, 10, 10, 6, 2, 2, 3, 2, 2, 2, 0, 0, 7, 23, 20, 15, 12, 8, 0, 0, 0, 0, 0, 0, 19, 25, 16, 16, 16, 15, 13, 16, 15, 15, 17, 13, 9, 14, 13, 13, 14, 12, 12, 5, 5, 5, 5, 6, 56, 58, 15, 45, 66, 12, 8, 15, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 12, 33, 80, 12, 7, 13, 30, 20, 26, 39, 42, 36, 4, 16, 53, 99, 100, 16, 0, 0, 0, 91, 48
  • imagepath=testimg\3.jpg
  • index=2
  • DDFLength=120
  • PHFLength=50
  • FusionFeature=73, 85, 63, 53, 28, 21, 21, 20, 20, 20, 20, 17, 18, 99, 98, 100, 64, 24, 21, 21, 22, 24, 23, 21, 40, 78, 50, 53, 53, 46, 51, 45, 44, 23, 27, 22, 43, 71, 52, 54, 27, 23, 24, 31, 20, 22, 24, 19, 17, 73, 61, 75, 69, 72, 57, 56, 45, 28, 26, 17, 18, 65, 64, 66, 45, 61, 46, 51, 41, 19, 24, 22, 43, 36, 24, 25, 24, 12, 9, 6, 0, 0, 0, 0, 63, 59, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 46, 48, 35, 13, 2, 0, 0, 0, 0, 0, 0, 57, 59, 60, 46, 33, 37, 63, 44, 53, 48, 52, 47, 59, 60, 7, 18, 57, 72, 21, 31, 32, 36, 8, 17, 14, 100, 79, 96, 34, 1, 34, 70, 40, 17, 41, 91, 61, 96, 26, 21, 49, 47, 3, 8, 37, 48, 12, 18, 21, 14, 20, 29, 46, 30, 32, 25, 39, 55, 18, 9, 95, 43
  • imagepath=testimg\4.jpg
  • index=3
  • DDFLength=120
  • PHFLength=50
  • FusionFeature=35, 44, 44, 44, 41, 41, 23, 25, 32, 31, 32, 28, 81, 99, 99, 82, 86, 91, 9, 0, 1, 3, 26, 31, 81, 99, 100, 94, 100, 80, 22, 31, 47, 16, 39, 0, 81, 100, 100, 97, 85, 72, 36, 59, 51, 12, 12, 14, 12, 11, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 12, 16, 18, 15, 5, 0, 0, 0, 0, 0, 0, 0, 8, 23, 24, 26, 25, 18, 4, 0, 0, 0, 0, 0, 15, 20, 17, 11, 12, 10, 10, 0, 0, 0, 0, 0, 14, 5, 6, 6, 5, 6, 4, 5, 4, 0, 0, 0, 15, 15, 9, 5, 5, 5, 5, 5, 5, 5, 5, 6, 57, 59, 41, 100, 73, 64, 77, 75, 67, 80, 81, 86, 85, 82, 83, 88, 89, 85, 89, 93, 23, 15, 28, 2, 9, 14, 32, 39, 32, 39, 45, 49, 53, 48, 53, 30, 12, 18, 46, 30, 4, 4, 71, 34, 11, 10, 1, 0, 93, 20
  • imagepath=testimg\5.jpg
  • index=4
  • DDFLength=120
  • PHFLength=50
  • FusionFeature=67, 66, 67, 55, 29, 20, 20, 20, 20, 20, 20, 17, 36, 25, 25, 21, 25, 22, 29, 26, 25, 26, 14, 0, 29, 90, 84, 71, 84, 78, 55, 53, 22, 19, 22, 19, 40, 40, 41, 41, 45, 37, 35, 41, 26, 0, 0, 0, 52, 86, 26, 20, 22, 23, 20, 20, 23, 24, 22, 19, 23, 86, 93, 57, 40, 30, 0, 0, 0, 0, 0, 0, 18, 67, 49, 38, 32, 30, 21, 23, 23, 23, 29, 22, 26, 85, 100, 56, 0, 0, 0, 0, 0, 0, 0, 0, 15, 55, 54, 52, 47, 33, 31, 28, 0, 0, 0, 0, 35, 46, 52, 42, 22, 20, 54, 46, 56, 50, 54, 49, 62, 63, 1, 5, 28, 5, 4, 6, 80, 97, 87, 58, 53, 18, 63, 30, 6, 6, 66, 34, 11, 13, 87, 53, 17, 41, 42, 23, 48, 49, 74, 70, 22, 21, 29, 31, 31, 32, 22, 50, 45, 70, 23, 21, 34, 21, 31, 1, 100, 45
  • imagepath=testimg\6.jpg
  • index=5
  • DDFLength=120
  • PHFLength=50
  • FusionFeature=28, 39, 40, 38, 40, 39, 32, 17, 34, 32, 32, 26, 37, 30, 30, 25, 15, 13, 14, 11, 18, 16, 16, 12, 0, 50, 25, 13, 0, 0, 0, 0, 0, 0, 0, 0, 27, 45, 18, 12, 12, 12, 12, 12, 12, 12, 12, 10, 42, 57, 42, 43, 41, 46, 48, 28, 29, 23, 12, 10, 47, 39, 27, 19, 15, 16, 17, 13, 15, 13, 14, 13, 8, 31, 30, 41, 39, 49, 43, 30, 27, 23, 7, 0, 12, 44, 43, 28, 31, 47, 27, 29, 52, 27, 28, 22, 0, 0, 0, 3, 73, 57, 5, 100, 46, 0, 0, 0, 24, 33, 35, 55, 81, 14, 41, 71, 13, 12, 12, 17, 59, 60, 20, 59, 12, 7, 11, 37, 97, 33, 11, 10, 18, 21, 11, 13, 1, 15, 26, 99, 92, 80, 50, 9, 11, 88, 61, 8, 10, 16, 59, 57, 45, 89, 100, 97, 20, 6, 11, 11, 14, 25, 27, 28, 29, 20, 14, 0, 95, 37<span style="font-family:Comic Sans MS;font-size:16px;">
  • </span>

其中的FusionFeature就是特征向量了,每个图像由一个120维的density distribution feature和一个50维的projection histogram feature组成。

接着,小斤就输入text.jpg来试一把:

项目主页中介绍了这个text.jpg,是手机拍摄一个文档后二值化的结果,有一坨大噪点,中间看起来是一个插图。

输入test.jpg后,查看检索的相似性结果:

testimg的1.jpg的相似度最高,这是1.jpg的原图,从段落开始结束的位置分布来看,应该就是它了:

简单的性能测试:

小斤准备使用1000张后台图像进行测试,看看检索的效率如何。

去网上搜集1000张文档图像显然比较累人,这里使用了一个偷懒的办法,找个1000页左右的pdf,使用pdf2image等工具,生成1000张文档图像的jpg,

最后每张在850*1100左右,分辨率还行。

把这么多图像填到inputimage.txt配置文件中,同样有简单的办法,运行cmd,进入存放图像的目录后,使用dir /b命令,每一行会显示一个图像文件名,右键选中标记,圈住他们复制,粘贴到inputimage.txt中就可以了。当然,这样做也有个弊端,就是这些图像和OpenDIR的可执行文件必须是在同一目录下了。

后台图像库算是轻而易举地构建好了,和之前一样,先使用-w指令生成特征数据文件,1000张图的特征计算了1分多钟,但也只要辛苦一次就够了。

完成后,使用-r指令开始检索:

在1000张图片中找到了一模一样的它,相似度100%,花费4ms。

(测试环境Turion X2 RM-74 2.2G,2G内存)

测试多次后,对于精确检索,比如检索后台图库中存在的同一图像,每次都能以100%找到。

对于相似检索,如一些扫描质量比较差的图片或处理过的图像,(类似于之前的test.jpg),虽然检索速度令人满意,但检索结果也就中规中矩了,有时结果风马牛不相及。也许今后融入更好的特征可以提高准确度吧。