上一篇文章介绍了LIRE的基本内容和源码的代码结构。本文针对LIRE中主要的三个接口(LireFeature、DocumentBuilder、ImageSearcher)的相关内容进行分析。
LireFeature
LireFeature是一个图像特征的Interface,其中定义了很多跟图像特征相关的方法,最重要的两个是extract()和getDistance()。extract()方法负责从图像矩阵表示中提取出所需要的特征变量,而getDistance()用于比较两个特征之间的距离,用于排序检索结果。任何具体特征类都需要实现这个接口。在LIRE 0.9.5中实现了约28种特征。
图1
以同一个包中的SimpleColorHistogram这个具体的特征实现类为例,它实现了LireFeature接口,其extract方法就是从图像文件中提取8bit的RGB表示信息直方统计图,用它做特征来检索图像。它的图像之间的距离定义有多种情况(用户可以自己配置选择),例如dist_1就是,dist_2是平方差,还有jsd和tanmoto等距离衡量方式等。但是有些的特征的计算比较复杂,如SiftFeature,则是通过Extractor类进行特征提取。
DocumentBuilder
提取完特征以后,就可以根据提取的出来的特征来构建索引,并将之存储到索引文件中以待检索。索引创建的主要使用的类和接口如图2所示,构建索引的实现设计采用了工厂模式,程序中通常通过DocumentBuilderFactory来创建索引,Factory通过具体的类来对图像进行操作和构建索引。
图2
DocumentBuilder接口中定义了三个方法:
createDescriptorFields(BufferedImage image)用来填充Document对象的feature fields字段。
createDocument(BufferedImage image, String identifier)和createDocument(InputStream image, String identifier)则总来创建Document对象。
AbstractDocumentBuilder是一个实现了DocumentBuilder接口的抽象类,其中给出了两个createDocument方法的实现,其中createDocument(InputStream image, String identifier)是通过调用createDocument(BufferedImage image, String identifier)实现的。
... ... ...
public static DocumentBuilder getColorLayoutBuilder() {
return new GenericDocumentBuilder(ColorLayout.class, DocumentBuilder.FIELD_NAME_COLORLAYOUT);
}
public static DocumentBuilder getEdgeHistogramBuilder() {
return new GenericDocumentBuilder(EdgeHistogram.class, DocumentBuilder.FIELD_NAME_EDGEHISTOGRAM);
}
public static DocumentBuilder getScalableColorBuilder() {
return new GenericDocumentBuilder(ScalableColor.class, DocumentBuilder.FIELD_NAME_SCALABLECOLOR);
}
public static DocumentBuilder getAutoColorCorrelogramDocumentBuilder() {
return new GenericDocumentBuilder(AutoColorCorrelogram.class, DocumentBuilder.FIELD_NAME_AUTOCOLORCORRELOGRAM, GenericDocumentBuilder.Mode.Fast);
}
public static DocumentBuilder getCEDDDocumentBuilder() {
return new GenericDocumentBuilder(CEDD.class, DocumentBuilder.FIELD_NAME_CEDD);
}
public static DocumentBuilder getHashingCEDDDocumentBuilder() {
return new GenericDocumentBuilder(CEDD.class, DocumentBuilder.FIELD_NAME_CEDD, true);
}
public static DocumentBuilder getFCTHDocumentBuilder() {
return new GenericDocumentBuilder(FCTH.class, DocumentBuilder.FIELD_NAME_FCTH, GenericDocumentBuilder.Mode.Fast);
}
public static DocumentBuilder getJCDDocumentBuilder() {
return new GenericDocumentBuilder(JCD.class, DocumentBuilder.FIELD_NAME_JCD);
}
... ... ...
上面是DocumentFactory类的部分代码,从中可以看出,对应到具体特征的DocumentBuilder,大部分特征对应的DocumentBuilder都通过向GenericDocumentBuilder传入具体的特征类实现,该类中定义了通用的createDescriptorFields方法和createDocument的实现,根据传入的特征类的不同,能够创建出不同的Document对象。具体的创建过程则是通过调用工厂类DocumentBuilderFactory中的getXXXDocumentBuilder来实现,该方法返回一个传入了XXX.class参数的GenericDocumentBuilder对象。对于另外一些比较复杂的特征算法,如sift,MSER等,则有专门的类SiftDocumentBuilder,MSERDocumentBuilder等与之对应。
ImageSearcher
ImageSearcher的设计与DocumentBuilder的类似,类关系图如图3所示。ImageSearcher接口中定义了三个方法:search、findDuplicates和relevanceFeedback,抽象类AbstractImageSearcher实现了其中的两个,search即为进行相似查找时使用的方法。图3
下面的代码段是ImageSearcherFactory类的部分代码。对于具体特征的ImageSearcher,通过调用工厂类ImageSearcherFactory的createXXXImageSearcher方法,并传入具体的特征类XXX.class来创建,该方法返回一个GenericFastImageSearcher对象,该对象根据传入的不同特征类,调用本类的search、getDistance等方法进行相关操作。
... ... ...
public static ImageSearcher createAutoColorCorrelogramImageSearcher(int maximumHits) {
return new GenericFastImageSearcher(maximumHits, AutoColorCorrelogram.class, DocumentBuilder.FIELD_NAME_AUTOCOLORCORRELOGRAM);
}
public static ImageSearcher createCEDDImageSearcher(int maximumHits) {
return new GenericFastImageSearcher(maximumHits, CEDD.class, DocumentBuilder.FIELD_NAME_CEDD);
}
public static ImageSearcher createHashingCEDDImageSearcher(int maximumHits) {
return new BitSamplingImageSearcher(maximumHits, DocumentBuilder.FIELD_NAME_CEDD,
DocumentBuilder.FIELD_NAME_CEDD+"_hash", new CEDD());
}
public static ImageSearcher createFCTHImageSearcher(int maximumHits) {
return new GenericFastImageSearcher(maximumHits, FCTH.class, DocumentBuilder.FIELD_NAME_FCTH);
}
public static ImageSearcher createJCDImageSearcher(int maximumHits) {
return new GenericFastImageSearcher(maximumHits, JCD.class, DocumentBuilder.FIELD_NAME_JCD);
}
public static ImageSearcher createJpegCoefficientHistogramImageSearcher(int maximumHits) {
return new GenericFastImageSearcher(maximumHits, JpegCoefficientHistogram.class, DocumentBuilder.FIELD_NAME_JPEGCOEFFS);
}
... ... ...