Lucene是一个开源的强大的索引工具,但是它仅限于文本索引。基于内容的图像检索(content- based image retrieval,CBIR)要求我们利用图像的一些基本特征(如颜色纹理形状以及sift,surf等等)搜索相似的图片,LIRE(Lucene Image Retrieval)是一款基于lucene的图像特征索引工具,它能帮助我们方便的对图像特征建立索引和搜索,从而实现搜索相似的图像。
LIRE开发相关的资源准备:由于需要做一款Android端的图片检索系统,在此对LIRE的整体结构和基本接口的源码进行研究。这里我们需要加入LIRE的源码,参考:http://jingyan.baidu.com/article/454316ab596470f7a7c03aab.html 新建一个java工程将lire.jar、其他jar包以及jire.jar的源文件导入工程。
我使用的IDE是MyEclipse 10
从项目的目录结构可以看出所有的包的前缀都是“net.semanticmetadata.lire”,net.semanticmetadata.lire这个目录下主要是接口的定义可以分为2类,
DocumentBuilder:用于生成索引
ImageSearcher:用于检索
其实lire的基本接口主要完成两项工作,生成索引和进行检索。生成索引就是根据图片提取特征向量,然后存储特征向量到索引的过程。检索就是根据输入图片的特征向量到索引中查找相似图片的过程。
先来看看DocumentBuilder的相关类定义
DocumentBuilder:接口,定义了基本的方法。
AbstractDocumentBuilder:抽象类,实现了DocumentBuilder接口。
DocumentBuilderFactory:用于创建DocumentBuilder的工厂类。
DocumentBuilder相关的类的继承关系如下图所示。可见,各种算法类都继承了AbstractDocumentBuilder,而AbstractDocumentBuilder实现了DocumentBuilder。
再来看看与ImageSearcher相关的类的定义:
ImageSearcher:接口,定义了基本的方法。
AbstractImageSearcher:抽象类,实现了ImageSearcher接口。
ImageSearcherFactory:用于创建ImageSearcher的工厂类。
ImageSearcher相关的类的继承关系如下图所示。可见,各种算法类都继承了AbstractImageSearcher,而AbstractImageSearcher实现了ImageSearcher接口。此外还有一个结构体:
ImageSearchHits:用于存储搜索的结果。“lire.imageanalysis”里面存储的是lire支持的方法的实现类。每个类以其实现的方法命名。
这些方法的算法有的位于“lire.imageanalysis”的子包中。
比如CEDD算法的实现类位于“lire.imageanalysis.cedd”中;
ColorLayout算法的实现类位于“lire.imageanalysis.mpeg7”中。“lire.impl”里面存储的是lire支持的方法的DocumentBuilder和ImageSearcher。命名规则是***DocumentBuilder或者***ImageSearcher(***代表方法名称)