`

LIRe 源代码分析 5:提取特征向量[以颜色布局为例]

 
阅读更多

 

注:此前写了一系列的文章,分析LIRe的源代码,在此列一个列表:

LIRe 源代码分析 1:整体结构
LIRe 源代码分析 2:基本接口(DocumentBuilder)
LIRe 源代码分析 3:基本接口(ImageSearcher)
LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]
LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]
LIRe 源代码分析 7:算法类[以颜色布局为例]

 

在上一篇文章中,讲述了建立索引的过程:

LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]

这里继续上一篇文章的分析。在ColorLayoutDocumentBuilder中,使用了一个类型为ColorLayout的对象vd,并且调用了vd的extract()方法:

 

ColorLayout vd = new ColorLayout();
vd.extract(bimg);

 

此外调用了vd的getByteArrayRepresentation()方法:

 

newField(DocumentBuilder.FIELD_NAME_COLORLAYOUT_FAST,vd.getByteArrayRepresentation())

 

 

在这里我们看一看ColorLayout是个什么类。ColorLayout位于“net.semanticmetadata.lire.imageanalysis”包中,如下图所示:

 


由图可见,这个包中有很多的类。这些类都是以检索方法的名字命名的。我们要找的ColorLayout类也在其中。看看它的代码吧:

 

/*
 * This file is part of the LIRe project: http://www.semanticmetadata.net/lire
 * LIRe is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * LIRe is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with LIRe; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * We kindly ask you to refer the following paper in any publication mentioning Lire:
 *
 * Lux Mathias, Savvas A. Chatzichristofis. Lire: Lucene Image Retrieval 鈥�
 * An Extensible Java CBIR Library. In proceedings of the 16th ACM International
 * Conference on Multimedia, pp. 1085-1088, Vancouver, Canada, 2008
 *
 * http://doi.acm.org/10.1145/1459359.1459577
 *
 * Copyright statement:
 * --------------------
 * (c) 2002-2011 by Mathias Lux (mathias@juggle.at)
 *     http://www.semanticmetadata.net/lire
 */
package net.semanticmetadata.lire.imageanalysis;

import net.semanticmetadata.lire.imageanalysis.mpeg7.ColorLayoutImpl;
import net.semanticmetadata.lire.utils.SerializationUtils;

/**
 * Just a wrapper for the use of LireFeature.
 * Date: 27.08.2008
 * Time: 12:07:38
 *
 * @author Mathias Lux, mathias@juggle.at
 */
public class ColorLayout extends ColorLayoutImpl implements LireFeature {

    /*
        public String getStringRepresentation() {
        StringBuilder sb = new StringBuilder(256);
        StringBuilder sbtmp = new StringBuilder(256);
        for (int i = 0; i < numYCoeff; i++) {
            sb.append(YCoeff[i]);
            if (i + 1 < numYCoeff) sb.append(' ');
        }
        sb.append("z");
        for (int i = 0; i < numCCoeff; i++) {
            sb.append(CbCoeff[i]);
            if (i + 1 < numCCoeff) sb.append(' ');
            sbtmp.append(CrCoeff[i]);
            if (i + 1 < numCCoeff) sbtmp.append(' ');
        }
        sb.append("z");
        sb.append(sbtmp);
        return sb.toString();
    }

    public void setStringRepresentation(String descriptor) {
        String[] coeffs = descriptor.split("z");
        String[] y = coeffs[0].split(" ");
        String[] cb = coeffs[1].split(" ");
        String[] cr = coeffs[2].split(" ");

        numYCoeff = y.length;
        numCCoeff = Math.min(cb.length, cr.length);

        YCoeff = new int[numYCoeff];
        CbCoeff = new int[numCCoeff];
        CrCoeff = new int[numCCoeff];

        for (int i = 0; i < numYCoeff; i++) {
            YCoeff[i] = Integer.parseInt(y[i]);
        }
        for (int i = 0; i < numCCoeff; i++) {
            CbCoeff[i] = Integer.parseInt(cb[i]);
            CrCoeff[i] = Integer.parseInt(cr[i]);

        }
    }
     */

    /**
     * Provides a much faster way of serialization.
     *
     * @return a byte array that can be read with the corresponding method.
     * @see net.semanticmetadata.lire.imageanalysis.CEDD#setByteArrayRepresentation(byte[])
     */
    public byte[] getByteArrayRepresentation() {
        byte[] result = new byte[2 * 4 + numYCoeff * 4 + 2 * numCCoeff * 4];
        System.arraycopy(SerializationUtils.toBytes(numYCoeff), 0, result, 0, 4);
        System.arraycopy(SerializationUtils.toBytes(numCCoeff), 0, result, 4, 4);
        System.arraycopy(SerializationUtils.toByteArray(YCoeff), 0, result, 8, numYCoeff * 4);
        System.arraycopy(SerializationUtils.toByteArray(CbCoeff), 0, result, numYCoeff * 4 + 8, numCCoeff * 4);
        System.arraycopy(SerializationUtils.toByteArray(CrCoeff), 0, result, numYCoeff * 4 + numCCoeff * 4 + 8, numCCoeff * 4);
        return result;
    }

    /**
     * Reads descriptor from a byte array. Much faster than the String based method.
     *
     * @param in byte array from corresponding method
     * @see net.semanticmetadata.lire.imageanalysis.CEDD#getByteArrayRepresentation
     */
    public void setByteArrayRepresentation(byte[] in) {
        int[] data = SerializationUtils.toIntArray(in);
        numYCoeff = data[0];
        numCCoeff = data[1];
        YCoeff = new int[numYCoeff];
        CbCoeff = new int[numCCoeff];
        CrCoeff = new int[numCCoeff];
        System.arraycopy(data, 2, YCoeff, 0, numYCoeff);
        System.arraycopy(data, 2 + numYCoeff, CbCoeff, 0, numCCoeff);
        System.arraycopy(data, 2 + numYCoeff + numCCoeff, CrCoeff, 0, numCCoeff);
    }

    public double[] getDoubleHistogram() {
        double[] result = new double[numYCoeff + numCCoeff * 2];
        for (int i = 0; i < numYCoeff; i++) {
            result[i] = YCoeff[i];
        }
        for (int i = 0; i < numCCoeff; i++) {
            result[i + numYCoeff] = CbCoeff[i];
            result[i + numCCoeff + numYCoeff] = CrCoeff[i];
        }
        return result;
    }

    /**
     * Compares one descriptor to another.
     *
     * @param descriptor
     * @return the distance from [0,infinite) or -1 if descriptor type does not match
     */

    public float getDistance(LireFeature descriptor) {
        if (!(descriptor instanceof ColorLayoutImpl)) return -1f;
        ColorLayoutImpl cl = (ColorLayoutImpl) descriptor;
        return (float) ColorLayoutImpl.getSimilarity(YCoeff, CbCoeff, CrCoeff, cl.YCoeff, cl.CbCoeff, cl.CrCoeff);
    }
}


ColorLayout类继承了ColorLayoutImpl类,同时实现了LireFeature接口。其中的方法大部分都是实现了LireFeature接口的方法。先来看看LireFeature接口是什么样子的:

 

注:这里没有注释了,仅能靠自己的理解了。

 

/**
 * This is the basic interface for all content based features. It is needed for GenericDocumentBuilder etc.
 * Date: 28.05.2008
 * Time: 14:44:16
 *
 * @author Mathias Lux, mathias@juggle.at
 */
public interface LireFeature {
    public void extract(BufferedImage bimg);

    public byte[] getByteArrayRepresentation();

    public void setByteArrayRepresentation(byte[] in);

    public double[] getDoubleHistogram();

    float getDistance(LireFeature feature);

    java.lang.String getStringRepresentation();

    void setStringRepresentation(java.lang.String s);
}

 

我简要概括一下自己对这些接口函数的理解:

1.extract(BufferedImage bimg):提取特征向量

2.getByteArrayRepresentation():获取特征向量(返回byte[]类型)

3.setByteArrayRepresentation(byte[] in):设置特征向量(byte[]类型)

4.getDoubleHistogram():

5.getDistance(LireFeature feature):

6.getStringRepresentation():获取特征向量(返回String类型)

7.setStringRepresentation(java.lang.String s):设置特征向量(String类型)

其中咖啡色的是建立索引的过程中会用到的。

看代码的过程中发现,所有的算法都实现了LireFeature接口,如下图所示:

 

 

 

不再研究LireFeature接口,回过头来本来想看看ColorLayoutImpl类,但是没想到代码其长无比,都是些算法,暂时没有这个耐心了,以后有机会再看吧。以下贴出个简略版的。注意:该类中实现了extract(BufferedImage bimg)方法。其他方法例如getByteArrayRepresentation()则在ColorLayout中实现。

 

package net.semanticmetadata.lire.imageanalysis.mpeg7;

import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;


/**
 * Class for extrcating & comparing MPEG-7 based CBIR descriptor ColorLayout
 *
 * @author Mathias Lux, mathias@juggle.at
 */
public class ColorLayoutImpl {
    // static final boolean debug = true;
    protected int[][] shape;
    protected int imgYSize, imgXSize;
    protected BufferedImage img;

    protected static int[] availableCoeffNumbers = {1, 3, 6, 10, 15, 21, 28, 64};

    public int[] YCoeff;
    public int[] CbCoeff;
    public int[] CrCoeff;

    protected int numCCoeff = 28, numYCoeff = 64;

    protected static int[] arrayZigZag = {
            0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
            12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
            35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
            58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
    };

	...
	public void extract(BufferedImage bimg) {
        this.img = bimg;
        imgYSize = img.getHeight();
        imgXSize = img.getWidth();
        init();
    }
	...
}



 

 

 

 

 

 

 

 



 

 

 

 

分享到:
评论

相关推荐

    Lire图片搜索示例

    Lire的核心是计算图像的特征向量,并且能够将这些特征有效地索引和搜索,使得在大量图像中找到相似图片变得可能。下面将详细介绍Lire的工作原理、主要功能以及如何使用它进行图片检索。 1. **工作原理** Lire利用...

    LIRE 源代码

    LIRE(Lucene Image REtrieval)提供一种的简单方式来创建基于图像特性的Lucene索引。利用该索引就能够构建一个基于内容的图像检索(content- based image retrieval,CBIR)系统,来...这是LIRE的源代码以及相关文档。

    lire 图片索引工具

    它支持多种特征提取算法,如颜色直方图、色彩布局、SIFT(尺度不变特征变换)和SURF(加速稳健特征)等。这些特征都是计算机视觉领域的经典方法,它们能够捕获图像的关键信息,即使在图像大小、角度、光照变化等情况...

    Java《基于LIRE搭建的图像检索,实现以图搜图》+源代码+设计资料

    基于LIRE搭建的图像检索,实现以图搜图 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内...

    Lire图片检索

    Lire允许开发者自定义特征提取器或优化现有的索引策略以适应特定需求。例如,你可以使用分布式Lucene(如Solr)来处理大规模的图像数据集,或者结合其他机器学习技术提高检索精度。 总之,Lire是一个强大的图片检索...

    mpeg 7 demo(LIRE)

    1. **特征提取**:LIRE支持多种特征提取算法,如颜色直方图、色彩布局、Gabor纹理、边缘方向直方图等。这些特征能够捕捉到图像的基本属性,便于后续的相似性比较。 2. **索引与搜索**:LIRE提供了一种高效的索引...

    lire图片搜索图片样例

    Lire会遍历这些图像,应用选定的特征提取算法,然后将得到的特征向量存储到一个可搜索的索引中。这个过程是关键,因为它允许我们快速地定位到与查询图像相似的图像。 **3. 特征提取** Lire支持多种特征提取算法,如...

    最新LIRE以图找图 java实例

    通过理解和实践这个Java实例,你可以深入学习LIRE库的用法,并掌握以图找图的基本技术,这对于图像处理、计算机视觉以及大数据分析等领域都有极大的帮助。同时,这个实例也可以作为进一步研究图像检索算法和优化索引...

    基于lire的图片搜索功能demo.zip

    通过计算这些特征,LIRE可以为每张图像生成一个独特的“指纹”,也就是所谓的图像特征向量。 **LIRE的工作流程:** 1. **特征提取**:LIRE首先从输入图像中提取局部特征,这些特征通常是关键点和它们的描述符。...

    lire图形检索

    在图像检索的上下文中,`Document`通常会包含图像的特定特征向量(如颜色直方图、纹理描述符等)和图像的唯一标识。使用`DocumentBuilder`的`createDocument`方法,可以将图像的特征和标识转换为`Document`实例,...

    LireDemo (2).zip

    在实际应用中,你可以根据需求调整Lire提供的各种参数,例如特征提取器类型、特征向量的维度等,以优化搜索性能。同时,LireDemo也可以作为一个学习平台,帮助开发者理解图像检索的基本原理和技术。 总之,LireDemo...

    基于Lire库搜索相似图片源码

    这个代码片段定义了一个`AverageColor`特征,用于计算图像的平均颜色,然后遍历指定目录下的所有图像,为每张图像构建一个索引。 **3. 搜索相似图片** 有了索引后,我们可以搜索与查询图片相似的图像。以下是一个...

    image-similarity-with-lire:图像相似度

    在“image-similarity-with-lire-master”这个项目中,包含了使用LIRE库进行图像相似度比较的源代码。开发者可以通过阅读和运行这些代码来理解和学习如何在实际应用中实现图像相似度的计算。这将涵盖从安装库、理解...

    LIRE-CIBR:测试使用 LIRE 库为基于内容的图像检索创建基于 Lucene 的检索索引

    LIRE提供了多种图像特征提取算法,包括色彩直方图、色彩布局、纹理结构和形状描述符等。这些特征能够帮助系统理解图像内容,并用于相似图像的匹配。例如,色彩直方图可以捕获图像的整体色彩分布,而纹理结构描述符则...

    LIRE示例应用:LireDemo

    mysqlLIRE(Lucene Image REtrieval)是一个强大的工具,它简化了基于图像特征的Lucene索引的创建过程。该程序利用MPEG-7标准中的ScalableColor、ColorLayout和EdgeHistogram等特性,为图像内容的检索提供了高效而...

    LIRE-0.9.5

    LIRE(Lucene Image REtrieval)提供一种的简单方式来创建基于图像特性的Lucene索引。利用该索引就能够构建一个基于内容的图像检索(content- based image retrieval,CBIR)系统,来...这是LIRE的源代码以及相关文档。

    ImageIndexingAndQueryByExampleUsingLIREAndLucene:使用 LIRE 和 Lucene 通过示例进行图像特征提取、索引和查询。 可以选择几种方法。 多媒体检索课程的编程作业提交

    首先,LIRE(Lucene for Images)是一个用Java开发的开源库,它允许开发者对图像进行特征提取,并将其转换为适合于Lucene搜索的索引。LIRE支持多种图像特征,如色彩直方图、色彩共生矩阵、局部二进制模式(LBP)等,...

    ParllImgProc:使用 LIRE 的图像数据库特征提取管道

    使用 LIRE 和 Hadoop 实现 SIFTFeature Extraction Pipeline 该项目提供并行处理图像的接口。 由于没有好的库能够并行应用视觉算法,该项目旨在为科学家提供一个方便、用户友好的界面来处理图像。 组件LIRE:luecene...

    颜色分类leetcode-ImageFilter:使用LIRE提取图像特征的WEKA过滤器

    颜色分类leetcode #WEKA 的图像分类过滤器 在 WEKA 中执行图像分类所需的步骤: ###1。 安装图像过滤器包 运行 WEKA,然后从 GUI 菜单中选择 Tools—&gt;Package Manager。 当包管理器出现时,在列表中找到包“image...

    LireDemo (LIRE的例子)

    LIRE(Lucene Image REtrieval)提供一种的简单方式来创建基于图像特性的Lucene索引。LIRE使用的特性都取自MPEG-7标准: ScalableColor、ColorLayout、EdgeHistogram。 这是一个完整的例子程序。

Global site tag (gtag.js) - Google Analytics