发明内容
本发明针对现有技术存在的问题,提出了一种相同或相似图像搜索方法,能显著提高相同或相似图像检索效率,应用于检索引擎。
本发明是通过以下技术方案得以实现的:
本发明提供一种相同或相似图像搜索方法,一种相同或相似图像搜索方法,包括:
步骤S01,提取查询图像的图像描述符向量Vs和图像描述符量化向量Qs,其中Vs =<vs1, vs2,..vsi …vsN>,Qs = <qs1, qs2, …qsi…qsN>;
步骤S02,选取图像描述符向量的顶部最大值T,并确定顶部T分量值qmax , qmax-1 , qmax-2 ,… qmax-T+1和第一关键字<i, l>max , <i, l>max-1 , <i, l>max-2 ,… <i, l>max-T+1,其中 i是N维空间指数, i∈ (0, 1, …N-1), l是其中一量化级, l ∈ (0, 1, …L-1);
步骤S03,利用第一关键字查询量化值文档对应查询表,获得相似或相同图像的文档ID docidj;
步骤S04,利用文档ID docidj作为第二关键字查询文档图像向量对应查询表,获得每个文档对应的候选图像描述符向量Vj,其中Vj = <vj1, vj2, …vji…vjN>;
步骤S05,比较查询图像的图像描述符向量Vs和候选图像描述符向量Vj两者的相似匹配度;
步骤S06,对相似匹配度结果排序,对照文档图像向量对应查询表获取相同或相似图像名称。
该方法是基于相似图像的观察,由于图像描述符向量的顶部分量值通常彼此接近。基于此点,仅需要对图像集的预选子集计算相似度,这样不需要多所有数据进行相似度计算,查询速度显著提高。
作为优选,方法还包括:在步骤S01前,构建文档图像向量对应查询表和量化值文档对应查询表。
作为优选,所述文档图像向量对应查询表构建过程如下:
计算每个图像Ij的N维图像描述符向量Vj = <vj1, vj2,..vji …vjN>,Vj具有文档IDdocidj。docidj是一个从0至最大数docidmax的顺序增量的整数;
计算图像描述符量化向量Qj = <qj1, qj2, …qji…qjN>,其中qji ∈ (0, 1, 2…L-1), vji被映射到L级量化值qji中的一个;
将每个图像docidj作为关键字,将图像描述符向量Vj、图像描述符量化向量Qj和图像名称作为内容,构建文档图像向量对应查询表。
作为优选,所述计算图像描述符量化向量的具体步骤为:
确定图像描述符向量Vj的最高限值vmax和最低限值vmin;
利用线性化量化计算公式计算图像描述符量化向量:qji = integer( L • (vji -vmin)/( vmax - vmin)),其中公式integer()表示将浮点结果转化为有效量化值最接近的整数。
作为优选,所述量化值文档对应查询表构建过程如下:
计算第一关键字key = <i, l>;
计算每个图像文档docid的位图数组,位图数组具有M字节或M/8+1字节,M是图像文档的总量,位图数组设置位置n的位表示具有docidj为n的图像文档,并且图像文档中相应图像具有相应的图像描述符量化值;
将第一关键字作为关键字,将位图数组作为内容,构建量化值文档对应查询表。
作为优选,所述步骤S03具体包括:
步骤S31,选择最大量化值的所有图像文档docid,并形成相关的第一位图数组,并将第一位图数组中所有位置位按位OR逻辑运算后转移到最终位图数组;
步骤S32,选择最大量化值小于1的所有图像文档docid,使用第一关键字查询量化值文档对应查询表,获得第二位图数组,并将第二位图数组中所有位置位按位OR逻辑运算后转移到最终位图数组;
步骤S33,选择最大量化值大于1的所有图像文档docid,使用第一关键字查询量化值文档对应查询表,获得第三位图数组,并将第三位图数组中所有位置位按位OR逻辑运算后转移到最终位图数组;
步骤S34,通过最终位图数组的每个位获取相似或相同图像的文档ID docidj;
其中,步骤S32中第一关键字<i, l>max的l为l-1,步骤S33中第一关键字的l为l+1。
作为优选,所述步骤S31在选择最大量化值的所有图像文档docid并形成相关第一位图数组前,还包括设置docidBitMapArraymax , docidBitMapArraymax-1 , docidBitMapArraymax-2 ,… docidBitMapArraymax-i… docidBitMapArray max-(T-1)为与顶部T分量值qmax , qmax-1 , qmax-2 ,… qmax-T+1相关的docid位图数组。
作为优选,所述步骤S05具体包括:计算查询图像的图像描述符向量Vs和候选图像描述符向量Vj之间的向量距离:distance(Vs, Vj) = [(vs1 – vj1)2 + (vs2 – vj2)2 + …+(vsN – vjN)2]1/2,其中,N为向量维度;当距离为0时,则查询图像与图像集匹配,当距离小于0时,距离代表图像之间不同程度的相似性。
作为优选,所述步骤S06具体为:对距离结果进行降序排序,对照文档图像向量对应查询表获取相同或相似图像名称。
本发明具有以下有益效果:
本发明一种相同或相似图像搜索方法,利用图像描述符向量的顶部分量值彼此接近的原则选取图像预选子集,经针对图像预选子集进行相似度对比,简化了比对数据数量,大大提高了运算速率,进而提高了相同或相似图像搜索效率。
具体实施方式
以下是本发明的具体实施例并结合附图,对本发明的技术方案作进一步的描述,但本发明并不限于这些实施例。
如图1,本发明一种相同或相似图像搜索方法包括:
步骤S01,提取查询图像的图像描述符向量Vs和图像描述符量化向量Qs,其中Vs =<vs1, vs2,..vsi …vsN>,Qs = <qs1, qs2, …qsi…qsN>;
步骤S02,选取图像描述符向量的顶部最大值T,并确定顶部T分量值qmax , qmax-1 , qmax-2 ,… qmax-T+1和第一关键字<i, l>max , <i, l>max-1 , <i, l>max-2 ,… <i, l>max-T+1,其中 i是N维空间指数, i∈ (0, 1, …N-1), l是其中一量化级, l ∈ (0, 1, …L-1);
步骤S03,利用第一关键字查询量化值文档对应查询表,获得相似或相同图像的文档ID docidj;
步骤S04,利用文档ID docidj作为第二关键字查询文档图像向量对应查询表,获得每个文档对应的候选图像描述符向量Vj,其中Vj = <vj1, vj2, …vji…vjN>;
步骤S05,比较查询图像的图像描述符向量Vs和候选图像描述符向量Vj两者的相似匹配度;
步骤S06,对相似匹配度结果排序,对照文档图像向量对应查询表获取相同或相似图像名称。
在步骤S01中,当该方法应用于搜索引擎时,搜索引擎中键入查询图像,此时针对查询图像提取图像描述符向量Vs和图像描述符量化向量Qs。图像描述符向量是将图像的特征转化为特征向量。所述图像描述符量化向量Qs基于图像描述符向量Vs获得,如采用线性量化计算方法计算图像描述符量化向量Qs:确定图像描述符向量Vj的最高限值vmax和最低限值vmin;Qj = <qj1, qj2, …qji…qjN>,其中qji ∈ (0, 1, 2…L-1), vji被映射到L级量化值qji中的一个。例如,如果L为8,之后qji将为0-7之间的某个整数。这里有不同用于量化的映射方法。线性量化是简单、有效量化方法中的一个。下述公式用于利用线性量化计算的量化向量计算图像描述符量化向量:qji = integer( L • (vji - vmin)/( vmax - vmin)),其中公式integer()表示将浮点结果转化为有效量化值最接近的整数。
在步骤S02中,将N个向量分量值qs1, qs2, …qsi…qsN降序排列,以获得顶部T的最大值。例如,一种可能选择是将T选择为3。令顶部T分量值为qmax , qmax-1 , qmax-2 ,… qmax-T+1,并令量化值文档对应查询表quantizationValueToDocidTable的相关关键字为keymax , keymax -1 , keymax-2 ,… keymax-T+1 或者<i, l>max , <i, l>max-1 , <i, l>max-2 ,… <i, l>max-T+1。
如图2,所述步骤S03具体包括:
步骤S31,选择最大量化值的所有图像文档docid,并形成相关的第一位图数组,并将第一位图数组中所有位置位按位OR逻辑运算后转移到最终位图数组;
步骤S32,选择最大量化值小于1的所有图像文档docid,使用第一关键字查询量化值文档对应查询表,获得第二位图数组,并将第二位图数组中所有位置位按位OR逻辑运算后转移到最终位图数组;
步骤S33,选择最大量化值大于1的所有图像文档docid,使用第一关键字查询量化值文档对应查询表,获得第三位图数组,并将第三位图数组中所有位置位按位OR逻辑运算后转移到最终位图数组;
步骤S34,通过最终位图数组的每个位获取相似或相同图像的文档ID docidj。
所述步骤S31在选择最大量化值的所有图像文档docid并形成相关第一位图数组前,还包括设置docidBitMapArraymax , docidBitMapArraymax-1 , docidBitMapArraymax-2 ,…docidBitMapArraymax-i… docidBitMapArray max-(T-1)为与顶部T分量值qmax , qmax-1 , qmax-2 ,…qmax-T+1相关的docid位图数组。另外,还设置docidBitMapArrayFinal为最终docid位图数组,其中包括输入查询图像的所有图像docid相关相似图像的候选图像。在步骤S31中,docidBitMapArraymax包含每个图像docid所有相应位置位,这样图像描述符量化向量在相同指数和量化级或<i, l>max下具有相同的最大量化值。这可通过收集第一位图数组docidBitMapArraymax中的所有位置位并通过按位OR逻辑运算转移到最终位图数组docidBitMapArrayFinal。
在步骤S32中,如果存在最大量化值小于1,则选择最大量化值小于1的所有图像文档docid,则使用第一关键字key=<i, l-1>max查询量化值文档对应查询表quantizationValueToDocidTable,获得第二位图数组docidBitMapArraymax。这个docidBitMapArraymax包含每个docid所有相应位置位,这样图像量化向量在相同指数和量化级或<i, l-1>max .下,具有小于1的相同最大量化值。这可通过收集第二位图数组docidBitMapArraymax中的所有位置位并通过按位OR逻辑运算转移到最终位图数组docidBitMapArrayFinal。
在步骤S33中,如果存在最大量化值大于1,则选择最大量化值大于1的所有图像文档docid,使用关键数组key=<i, l+1>max获得第三位图数组docidBitMapArraymax,来查询量化值文档对应查询表quantizationValueToDocidTable。这个第三位图数组docidBitMapArraymax包含每个docid所有相应位置位,这样图像量化向量在相同指数和量化级或<i, l+1>max下,具有大于1的相同最大量化值。这可通过收集第三位图数组docidBitMapArraymax中的所有位置位并通过按位OR逻辑运算转移到最终位图数组docidBitMapArrayFinal。
上述步骤S31-步骤S33,针对docidBitMapArraymax , docidBitMapArraymax-1 , docidBitMapArraymax-2 ,… docidBitMapArraymax-i… docidBitMapArray max-(T-1)都执行一遍。也就是说,前述以docidBitMapArraymax为例,依次执行步骤S31-步骤S33,,之后对docidBitMapArraymax-1 , docidBitMapArraymax-2 ,… docidBitMapArraymax-i…docidBitMapArray max-(T-1)重复上述步骤S31-步骤S33。按照惯例,T可以选择为3或4。当docidBitMapArraymax , docidBitMapArraymax-1 , docidBitMapArraymax-2 ,…docidBitMapArraymax-i… docidBitMapArray max-(T-1)所有执行完上述步骤S31-步骤S33后,方根据最终位图数组获取相似或相同图像的文档ID docidj。
在步骤S04中,利用步骤S03获得的候选图像的docid,对照文档图像向量对应查询表,获得每个文档对应的候选图像描述符向量Vj,这样可利用候选图像描述符向量与查询图像的图像描述符向量进行比较,进入步骤S05进行图像相似度匹配比对,进而搜索出相同或相似图像。
所述步骤S05具体包括:计算查询图像的图像描述符向量Vs和候选图像描述符向量Vj之间的向量距离:distance(Vs, Vj) = [(vs1 – vj1)2 + (vs2 – vj2)2 + …+ (vsN-1 –vjN)2]1/2,其中,N为向量维度;当距离为0时,则查询图像与图像集匹配,当距离小于0时,距离代表图像之间不同程度的相似性。
所述步骤S06具体为:对步骤S05的距离结果进行降序排序,对照文档图像向量对应查询表获取相同或相似图像名称。
其中,文档图像向量对应查询表为以图像docidj作为关键字,图像描述符向量Vj、图像描述符量化向量Qj和图像名称作为内容的查询表。量化值文档对应查询表为第一关键字作为关键字,位图数组作为内容的查询表。
本发明还包括在步骤S01前的索引建立步骤,具体包括构建文档图像向量对应查询表和量化值文档对应查询表。
所述文档图像向量对应查询表构建过程如下:
步骤1,计算每个图像Ij的N维图像描述符向量Vj = <vj1, vj2,..vji …vjN>,Vj具有文档ID docidj。docidj是一个从0至最大数docidmax的顺序增量的整数;
在图像索引建立步骤期间,每个图像文档被分配一个文档ID docid (>= 0 整数)。
步骤2,计算图像描述符量化向量Qj = <qj1, qj2, …qji…qjN>,其中qji ∈ (0, 1,2…L-1), vji被映射到L级量化值qji中的一个;
所述计算图像描述符量化向量的具体步骤为:确定图像描述符向量Vj的最高限值vmax和最低限值vmin;利用线性化量化计算公式计算图像描述符量化向量:qji = integer( L• (vji - vmin)/( vmax - vmin)),其中公式integer()表示将浮点结果转化为有效量化值最接近的整数。
步骤3,将每个图像docidj作为关键字,将图像描述符向量Vj、图像描述符量化向量Qj和图像名称作为内容,构建文档图像向量对应查询表。在此查询表下,给定一图像docidj,就能快速简单的获取图像描述符向量、量化向量以及其他图像信息,如图像名称。
下述是关于映射查找表docidToImageVectorTable的部分数据结构:
class ImageVectorInfo{
String imageName;
int docid;
float[N] vector;
int[N] quantizedVector; };
HashMap<Integer docid, ImageVectorInfo imageInfo>
所述量化值文档对应查询表构建过程如下:
步骤1,计算第一关键字key = <i, l>;
给定docidmax-1图像的一图像集,假定图像描述符的维度为N,以及量化级为L,对于0-N-1索引的每个向量分量,存在N个量化值。我们将维持文档映射查找表的量化值,以追踪所有图像,使得这些图像具有相应的量化值。所述文档映射查找表的第一关键字key是如下两个参数的结合:key = <i, l> , 其中 i是N维空间指数, i∈ (0, 1, …N-1), l是其中一量化级, l ∈ (0, 1, …L-1)。
下述是映射查找表quantizationValueToDocidTable的部分数据结构:classBitmapForDocid{ byte[NumOfImages/8] bitmapArray; };
HashMap<String key, BitmapForDocid bitmap>
下述是所有可能的关键数组,假定有8个量化级(L=8)和图像描述维度为N。
映射查找表quantizationValueToDocidTable的内容是一个有每个图像docid的位图数组(如图3),使得这些图像具有相应的量化值。
步骤2,计算每个图像文档docid的位图数组,位图数组具有M字节或M/8+1字节,M是图像文档的总量,位图数组设置位置n的位表示具有docidj为n的图像文档,并且图像文档中相应图像具有相应的图像描述符量化值;
图4图标示出了i的索引和相关的docid位图数组的所有量化值0…6,7 。例如,对于索引i的量化值7,相应的位图数组包含所有图像docid,使得这些图像在索引位置i处具有7的量化向量值。
步骤3,将第一关键字作为关键字,将位图数组作为内容,构建量化值文档对应查询表。
下述是部分软件代码,示出相关数据结构和功能。
/**
* Define number of images 定义图像数量
*/
public static final int NumOfImages = 1000000;
/**
* A map to get byte by which bit is on
*/
byte[] bitOnByteMapLittleEndian = {0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, (byte) 0x80};
class BitmapForDocid{
public byte[] bitmapArray;
}
/**
* Function to generate an initial bitmap 建立一个初始位图数组
* @param numberOfImages - total number of images
* @param initAsOne - if true, will init as all ones
* @return BitmapForDocid
*/
BitmapForDocid createNewBitmapForDocid(int numberOfImages, booleaninitAsOne){
BitmapForDocid bitmap = new BitmapForDocid();
bitmap.bitmapArray = new byte[numberOfImages/8];
for(int i = 0; i < bitmap.bitmapArray.length ; i++){
if(initAsOne == true){
bitmap.bitmapArray[i] = 1;
}else{
bitmap.bitmapArray[i] = 0;
}
}
return bitmap;
}
/**
* Function to generate key = <i, l> , where i is the index of N-dimension space, i∈ (0, 1, …N-1), 建立第一关键字
* l is the one of the quantization level, l ∈ (0, 1, …L-1)
* @param index - index position of the vector
* @param value - value of the vector
* @return key
*/
String buildQuantizationMapTableKey(int i, int l){
String key = null;
key = new String(i+"-"+l);
return key;
}
/**
* Function to create initial quantization values to docid mappinglookup table 建立初始量化值文档对应查询表
* @param vectorDimension - dimension of the image descriptorvector
* @param numberOfQuantizationLevel - number of quantization levels
* @param numberOfImages - total number of images
* @return mapTable
*/
HashMap<String, BitmapForDocid> initQuantizationValueToDocidMapTable(int vectorDimension,
int numberOfQuantizationLevel, int numberOfImages){
HashMap<String, BitmapForDocid> mapTable = new HashMap<String,BitmapForDocid>();
for(int i = 0; i < vectorDimension; i++){
for(int l = 0; l < numberOfQuantizationLevel; l++){
String key = i + "-" + l;
BitmapForDocid bitmap = createNewBitmapForDocid(numberOfImages, false);
mapTable.put(key, bitmap);
}
}
return mapTable;
}
/**
* A function to update Quantization Value To Docid Map Table,given docid, vector index, and 更新量化值文档对应查询表
* quantization value
*
* @param docid
* @param index
* @param value
* @param mapTable
* @return mapTable
*/
HashMap<String, BitmapForDocid> addDocidToQuantizationValueToDocidMapTable(int docid, int index, int value,
HashMap<String, BitmapForDocid> mapTable){
String key = index + "-" + value;
BitmapForDocid bitmap = mapTable.get(key);
if(bitmap != null){
int bitIndex = docid%8;
byte bit = bitOnByteMapLittleEndian[bitIndex];
bitmap.bitmapArray[byteIndex] = (byte) (bitmap.bitmapArray[byteIndex] | bit);
}
return mapTable;
}
本领域的技术人员应理解,上述描述及附图中所示的本发明的实施例只作为举例而并不限制本发明。本发明的目的已经完整有效地实现。本发明的功能及结构原理已在实施例中展示和说明,在没有背离所述原理下,本发明的实施方式可以有任何变形或修改。