LIRE原理与源码分析(二)——相关接口
1. LIRE原理与源码分析(二)—— 代码结构
2. LIRE原理与源码分析(二)—— 相关接口
上一篇文章介绍了LIRE的基本内容和源码的代码结构。本文针对LIRE中主要的三个接口(LireFeature、DocumentBuilder、ImageSearcher)的相关内容进行分析。
LireFeature
LireFeature是一个图像特征的Interface,其中定义了很多跟图像特征相关的方法,最重要的两个是extract()和getDistance()。extract()方法负责从图像矩阵表示中提取出所需要的特征变量,而getDistance()用于比较两个特征之间的距离,用于排序检索结果。任何具体特征类都需要实现这个接口。在LIRE 0.9.5中实现了约28种特征。
![](/assets/blank.gif)
图1
以同一个包中的SimpleColorHistogram这个具体的特征实现类为例,它实现了LireFeature接口,其extract方法就是从图像文件中提取8bit的RGB表示信息直方统计图,用它做特征来检索图像。它的图像之间的距离定义有多种情况(用户可以自己配置选择),例如dist_1就是,dist_2是平方差,还有jsd和tanmoto等距离衡量方式等。但是有些的特征的计算比较复杂,如SiftFeature,则是通过Extractor类进行特征提取。
DocumentBuilder
提取完特征以后,就可以根据提取的出来的特征来构建索引,并将之存储到索引文件中以待检索。索引创建的主要使用的类和接口如图2所示,构建索引的实现设计采用了工厂模式,程序中通常通过DocumentBuilderFactory来创建索引,Factory通过具体的类来对图像进行操作和构建索引。
![](/assets/blank.gif)
图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即为进行相似查找时使用的方法。
![](/assets/blank.gif)
图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原理与源码分析(二)——相关接口相关推荐
- java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...
##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...
- 【嵌入式】Libmodbus源码分析(二)-常用接口函数分析
00. 目录 文章目录 00. 目录 01. modbus常用接口函数概述 02. modbus辅助接口函数 03. modbus功能接口函数 04. modbus数据处理 05. 附录 01. mo ...
- 深入理解Spark 2.1 Core (十二):TimSort 的原理与源码分析
在博文<深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析 >中我们提到了: 使用Sort等对数据进行排序,其中用到了TimSort 这篇博文我们就来 ...
- SIFT原理与源码分析:DoG尺度空间构造
<SIFT原理与源码分析>系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548 尺度空间理论 自然界中的物体随着观 ...
- 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析
在上一篇<深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析>提到经过迭代计算后, SortShuffleWriter.write中: // 根据排序方 ...
- 【投屏】Scrcpy源码分析二(Client篇-连接阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...
- concurrenthashmap_ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
最新文章
- 【Linux学习九】负载均衡
- .NET常见线程简介
- 利用MOG2背景模型提取运动目标的OpenCV代码
- SQL高级---SQL UNION 和 UNION ALL 操作符
- Redis安装配置(Linux)
- linux 添加samba账户
- 干了这杯可乐!Gulp 上手指南
- 爱思助手短信备份到安卓_爱思助手 Bug 修复,完美降级10.3.3
- CentOS 7 安装 MySQL 5.6
- 研发项目如何配置看板的任务流转
- 用python实现网上书店
- 【毫米波雷达】人体目标探测理论
- 计算机专业英语张强华答案,计算机专业英语答案
- 《山月记》一定有那么一刻,我们曾迷茫怀疑
- 再掀融资潮 团购网仍后劲不足(团购现状分析)
- 干货!详解服务器端和移动端性能测试指标
- FindBugs 汇总(持续修改)
- (转贴)汉字转拼音缩写
- 电子书资源(建议珍藏,不断更新中)
- JavaScript 时间操作
热门文章
- SQL部门工资前三高的所有员工
- NOIP2011计算系数详解
- matlab meshgrid例子,MATLAB简单三维曲线曲面绘制——meshgrid函数 ← MATLAB讨论组 ......
- 为您解惑:jQuery中$.getJSON( )的使用方法简介之获取JSON格式的数据.........
- echarts 折线图 + 柱状图
- java 二叉树实验报告_20172310《程序设计与数据结构》(下)实验二:二叉树实验报告...
- java的setvisible_java swing setVisible放置顺序不同导致显示效果不同
- 高中计算机老师的心酸,“有一种累,叫高中老师”高中老师的一天,看哭无数学生、家长!...
- No.4-Heist-难度简单-HTB-walkthrough
- 生成男女体重的随机二维数据