1. LIRE原理与源码分析(二)—— 代码结构

2. LIRE原理与源码分析(二)—— 相关接口

上一篇文章介绍了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);}... ... ...

LIRE原理与源码分析(二)——相关接口相关推荐

  1. java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...

    ##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...

  2. 【嵌入式】Libmodbus源码分析(二)-常用接口函数分析

    00. 目录 文章目录 00. 目录 01. modbus常用接口函数概述 02. modbus辅助接口函数 03. modbus功能接口函数 04. modbus数据处理 05. 附录 01. mo ...

  3. 深入理解Spark 2.1 Core (十二):TimSort 的原理与源码分析

    在博文<深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析 >中我们提到了: 使用Sort等对数据进行排序,其中用到了TimSort 这篇博文我们就来 ...

  4. SIFT原理与源码分析:DoG尺度空间构造

    <SIFT原理与源码分析>系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548 尺度空间理论 自然界中的物体随着观 ...

  5. 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析

    在上一篇<深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析>提到经过迭代计算后, SortShuffleWriter.write中: // 根据排序方 ...

  6. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  7. ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...

  8. concurrenthashmap_ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...

  9. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

最新文章

  1. 【Linux学习九】负载均衡
  2. .NET常见线程简介
  3. 利用MOG2背景模型提取运动目标的OpenCV代码
  4. SQL高级---SQL UNION 和 UNION ALL 操作符
  5. Redis安装配置(Linux)
  6. linux 添加samba账户
  7. 干了这杯可乐!Gulp 上手指南
  8. 爱思助手短信备份到安卓_爱思助手 Bug 修复,完美降级10.3.3
  9. CentOS 7 安装 MySQL 5.6
  10. 研发项目如何配置看板的任务流转
  11. 用python实现网上书店
  12. 【毫米波雷达】人体目标探测理论
  13. 计算机专业英语张强华答案,计算机专业英语答案
  14. 《山月记》一定有那么一刻,我们曾迷茫怀疑
  15. 再掀融资潮 团购网仍后劲不足(团购现状分析)
  16. 干货!详解服务器端和移动端性能测试指标
  17. FindBugs 汇总(持续修改)
  18. (转贴)汉字转拼音缩写
  19. 电子书资源(建议珍藏,不断更新中)
  20. JavaScript 时间操作

热门文章

  1. SQL部门工资前三高的所有员工
  2. NOIP2011计算系数详解
  3. matlab meshgrid例子,MATLAB简单三维曲线曲面绘制——meshgrid函数 ← MATLAB讨论组 ......
  4. 为您解惑:jQuery中$.getJSON( )的使用方法简介之获取JSON格式的数据.........
  5. echarts 折线图 + 柱状图
  6. java 二叉树实验报告_20172310《程序设计与数据结构》(下)实验二:二叉树实验报告...
  7. java的setvisible_java swing setVisible放置顺序不同导致显示效果不同
  8. 高中计算机老师的心酸,“有一种累,叫高中老师”高中老师的一天,看哭无数学生、家长!...
  9. No.4-Heist-难度简单-HTB-walkthrough
  10. 生成男女体重的随机二维数据