发明内容
本发明针对现有技术的不足,提供了一种基于内容的复制图像检测方法。
本发明方法的具体步骤为:
步骤(1)将输入图像进行预处理操作;所述的预处理操作是进行输入图像归一化操作,即将输入图像缩小或放大到设定的尺寸。
步骤(2)对预处理后的图像计算图像中每个像素的哈希值;所述的像素的哈希值是根据图像中像素的颜色值和相邻像素的颜色值来确定的。
步骤(3)根据获得的像素哈希值计算图像的相似哈希值(SimHash)。所述的SimHash计算为成熟的算法,该算法中的每个像素的哈希值权重weight由像素在图像中的位置权重p和该像素与相邻像素的最大颜色差权重c决定,即weight=p+c;如果像素位置(x,y)符合下述条件:
Width/4<x<width×3/4且Height/4<y<height×3/4则p=2;否则p=1;
如果该像素与相邻像素的最大颜色差大于阈值,则c=2,否则c=1。其中width和height为图像的宽和高。
步骤(4)根据获得的图像SimHash检索图像数据表,如果该图像SimHash与数据表中图像A的SimHash的汉明距离小于设定的值,则图像A为该图像的复制图像;如果该图像SimHash与数据表中图像A的SimHash的汉明距离大于等于设定的值,则图像A不是该图像的复制图像,所述的图像A为图像数据表中的任意一个图像。
步骤(5)更新图像数据表,将输入图像的SimHash添加到图像数据表,等待下一个输入图像,重复步骤(1)。
本发明相对于现有技术具有以下有益效果:本发明在大规模图像库中具有实时的处理速度;同时该方法能够适应图像变换(颜色量化、尺度变换、logo添加等)带来的影响。
具体实施方式
下面将结合附图对本发明加以详细说明,应指出的是,所描述的实施例仅便于对本发明的理解,而对其不起任何限定作用。
本发明方法的具体步骤为:
步骤(1)将输入图像进行预处理操作;所述的预处理操作是进行输入图像归一化操作,即将输入图像缩小或放大到设定的尺寸。
步骤(2)对预处理后的图像计算图像中每个像素的哈希值。所述的像素的哈希值是根据图像中像素的颜色值和相邻像素的颜色值来确定的。
步骤(3)根据获得的像素哈希值计算图像的相似哈希值(SimHash)。所述的SimHash计算为成熟的算法,该算法中的每个像素的哈希值权重weight由像素在图像中的位置权重p和该像素与相邻像素的最大颜色差权重c决定。即weight=p+c;
如果像素位置(x,y)符合下述条件:
Width/4<x<width×3/4且Height/4<y<height×3/4则p=2;否则p=1;其中width和height为图像的宽和高。
如果该像素与相邻像素的最大颜色差大于阈值,则c=2,否则c=1。
步骤(4)根据获得的图像SimHash检索图像数据表,如果该图像SimHash与数据表中图像A的SimHash的汉明距离小于设定的值,则图像A为该图像的复制图像;如果该图像SimHash与数据表中图像A的SimHash的汉明距离大于等于设定的值,则图像A不是该图像的复制图像,所述的图像A为图像数据表中的任意一个图像;
步骤(5)更新图像数据表,将输入图像的SimHash添加到图像数据表,等待下一个输入图像,重复步骤(1)。
在本发明中,其输入的图像可以是各种图像获取设备获取的图像,例如:数码相机拍摄得到的图像、带拍摄功能的移动电话、带摄像功能的PDA或者可以是视频图像中的一帧等。如果输入图像是模拟信号,需要一个数模转换工具,把模拟图像转换为数字图像进行处理。本发明方法处理的图像可以针对各种图像编码格式,例如:JPEG、BMP等,只要能将该格式的图像转换为位图图像即可。在此实施例中假定输入的图像已经是位图图像。在以下的叙述中,图像就是指数字图像,不再具体指明。本实施例中主要介绍在大规模图像库中检测复制图像方法。其可用于图像数据的整理、图像检索系统的去重和图像内容拷贝检测系统,但是本发明方法同样可以适用其它需要检测复制图像的应用场合。
下面将参考附图进一步介绍本发明的实施例。
图1是一个流程框图,表示了本发明的流程图。图1中图像预处理单元,主要包括图像的尺度变换。尺度变换将输入图像归一化到设定的尺度,在此实施例中,归一化的图像大小为800×800。图像尺度变换方法采用四近邻双线性内插值法。同时,本实施例中,采用像素的灰度值来计算像素的哈希值,所以本预处理单元中,需要将彩色图像变换为灰度图像。灰度化方法采用BT709算法,即:R、G、B三个通道的权重分别为:0.2125,0.7154,0.0721。
参考图1中计算像素哈希值单元,通过像素和局部相邻像素的颜色值构建像素哈希值;计算像素的哈希值可以在彩色图像上进行,也可以在灰度图像进行,其关键是利用像素的哪些特征。像素哈希值是图像中某个像素点局部特性的一种描述,并采用一个哈希值来表示。哈希值的位数可以根据需要设定不同的大小,主要考虑图像库中图像的数量。在本实施例中,像素哈希值大小为54位的二进制数。对预处理后的图像中的每个像素提取相邻像素的灰度值。相邻像素为八连通的邻接八个像素。相邻八个像素的灰度值和像素本身的灰度值形成了九个灰度值。根据该九个像素的灰度值,计算该像素的哈希值。像素哈希值的计算过程如下:首先,为了消除噪声影响,将九个像素的灰度值均右移2位,这样每个灰度值就可用6位的二进制数表示;然后,将像素及邻接像素的6位二进制值,按照顺时针方向依次排列到54位二进制值中,从而构建了一个54位的哈希值。对预处理后图像的每个像素,计算像素的哈希值,根据这些像素哈希值来计算图像的SimHash值。
参考图1中计算图像SimHash单元,根据计算像素哈希值单元获得的图像像素哈希值集合,通过统计每个位上出现0或1的次数和每个像素哈希值的权重来得到图像的SimHash值。在本实施例中,像素哈希值为54位的值,所以SimHash也为54位的值,其均匀分布可以描述254数量的图像。其计算的伪代码如下:
int[]SumHash;//临时变量
ulong simHash=0;//图像的SimHash值
foreach(像素哈希值hashVal){//计算图像的每个哈希值
for(int i=0;i<54;i++){
if(hashVal[i]==1)
SumHash[i]+=weight;
else
SumHash[i]-=weight;
}
}
for(int j=0;j<54;j++){
if(SumHash[j]>0)
simHash+=pow(2,j);
}
该SimHash计算方法,根据像素哈希值每个位上的0或1值来确定是否在SumHash的对应位上加上还是减去该像素哈希值的权重。然后判断SumHash每个位上是否大于0来确定SimHash对应位上是否为1。
其中weight为该像素哈希值的权重。其是根据该像素在图像中的位置权重p和该像素与相邻像素的最大颜色差权重c来确定。其计算公式为:weight=p+c;
如果像素位置(x,y)符合下述条件:
Width/4<x<width×3/4且Height/4<y<height×3/4
则,p=2;否则p=1;其中width和height为图像的宽和高。
假定该像素与邻接像素的最大灰度差为g,如果g大于阈值(th),则c=2,否则c=1。根据所得p和c就可以得到像素的权重weight,从而实现最终的SimHash计算。
参考图1中检索SimHash单元,是从SimHash列表中查找汉明距离小于设定值的SimHash值。判断两幅图像是否是复制图像是基于两幅图像对应的SimHash值汉明距离的大小,汉明距离越小两幅图像越相似。在本实施例中,两个SimHash值的汉明距离小于4即判断该Simhash值对应的两幅图像是复制的。为了判断一幅图像是否是图像库中的其它图像的复制,需要计算该图像的SimHash与图像库中所有图像的汉明距离。当图像库中的图像数量急剧增大时,该查找方法需要极大的计算量。
本发明采用不断消减的策略检索汉明距离小于设定值的SimHash。该检索SimHash策略采用两种具体的方法。方法一,采用分组有序方法确定可能的汉明距离小于设定值的SimHash;方法二,对候选SimHash,根据汉明距离必需小于设定值这一个条件,排除不满足条件的SimHash。本实施例采用两者的融合的方法。先采用分组有序方法确定可能的汉明距离小于设定值的SimHash,然后采用某个组中汉明距离必须小于设定条件排除不满足条件的SimHash来加快查找的速度。
方法一分组有序方法是将SimHash值分为多个组。根据其中一组的值实现SimHash列表的有序化。这样构建了不同的有序表。依据汉明距离小于4的变化位最多只能在多组中的3组出现,那么其它组的值应该与查找的SimHash值一致,也就可以通过有序查找的方法实现。在确定了其它组之后再对匹配的SimHash值进行汉明距离的计算。在本实施例中,对54位的SimHash值分为:11、11、11、11、10五组,见附图2。然后对图像库的SimHash列表构建5份拷贝的列表。每个SimHash列表按每组的值排序。其中第1组拷贝(G1组)数据结构见附图4,其它的组结构类似。比如:图像库中有两幅图像(a和b),其SimHash值二进制表示分别为:a、10010011001001011000101110101101101001110010101010,b、01010101011011001010100100111001010011010101100110。按第1组排序结果为:b、a;按第2、3、4、5的排序结果为:a、b,b、a,b、a,a、b。在检索SimHash值时,首先查找每个拷贝的SimHash列表中与待查SimHash某个组中的值一致的SimHash值候选集合,然后从候选SimHash值集合中计算SimHash的汉明距离,获取汉明距离小于设定值的SimHash值。举例来说,假定待查的SimHash值(e)为:1001001100 10110110001011001011 0110100101 0010101010,从第1组有序列表中,用二分法快速地查找G1组值:1001001100,查找到列表中,a为候选;然后计算a与e的汉明距离为3。从第二组有序列表中,同样用二分法快速查找G2组值:1011011000,没有查找到匹配的SimHash值。同样从第3、4组中也没有发现匹配的SimHash值。在第5组中,查找到a匹配,计算a与e的汉明距离为3。由于通过分组有序,有序的SimHash列表可以快速地通过二分法进行查找,所以其效率非常高。通过二分法查找,可以去除大量的不可能的SimHash值。如果SimHash均匀分布,对于210数量的图像,其每组可能的候选的SimHash值均值为1,也就是通过5次二分法查找和汉明距离计算就可以查找到汉明距离小于4的汉明距离。如果不采用有序分组方法,则需要对每个SimHash计算汉明距离,其计算量为210次。
方法二的排除不满足汉明距离必需小于设定值条件的方法,首先将SimHash分组,存储两个组的汉明距离,可以通过两个组的值构建索引访问汉明距离的大小。在进行查找时,对输入的SimHash首先进行分组,然后按汉明距离必须小于设定的约束,不断的删减可能的候选SimHash,未被删除的即为查找到的SimHash。举例来说,图像库中有两幅图像(a和b),其SimHash值二进制表示分别为:a、10010011001001011000101110101101101001110010101010,b、01010101011011001010100100111001010011010101100110。待查的SimHash值(e)为:10010011001011011000101100101101101001010010101010,首先根据方法一有序分组方法,在G1有序SimHash列表中获取对应的候选SimHash索引集合,其结果集合中仅包括:a;然后对a获取G2组的值(1001011000),并与e的G2组的值(1011011000)连接成一个值(10010110001011011000)作为索引从汉明距离索引表(见附图5)中获取汉明距离,从而可以快速地得到汉明距离为1。由于汉明距离为1没有大于给定的3,所以a仍旧是一个可能的候选值,然后对不同列表中的值根据上述相同的方式,计算G3组中的汉明距离,其保证已计算的汉明距离必须小于4,对大于等于4的SimHash,则进行丢弃;计算到G5组后得到候选列表即为汉明距离与待测图像汉明距离小于4的SimHash。同样的方式,我们计算G2、G3、G4、G5有序列表得到可能的SimHash值,从而可以得到对应图像的复制图像。方法二的消减策略是通过预先存储汉明距离结果,并用索引快速进行访问来提高计算汉明距离的效率。同时,该方法每计算一组值就可以排除不能的SimHash值,从而提高了查找的速度。
参考图1中图像索引表单元,构建用于SimHash查找和更新的数据表。数据表的设计对SimHash的查找和更新具有极大的影响。为了快速查找相似的图像,本方法构建的图像索引表结构,有三部分组成分别为:SimHash列表和对应的图像名(附图3)、汉明距离表(附图5)、SimHash列表的分组表(附图4)。SimHash列表用于存储获得的图像的SimHash值,并且对应其图像的文件名。汉明距离表用于存储两个数之间按位不同构建的汉明距离,此表用于通过索引来获取两个数之间的汉明距离。其本质是一个数组,索引位置index=num1*Count(B1)+num2;num1和num2分别为需要计算汉明距离的两个数;Count(B1)为num2的位数。分组有序列表是一个锯齿形二维数组。根据分组的值作为索引把数据放置到对应索引位所在的可变长度数组中。
参考图1中更新索引表单元,增加新的SimHash到数据表中。首先,通过将输入图像的SimHash值添加到SimHash列表的末尾;然后,根据输入图像的SimHash在SimHash列表中的位置(idx)将idx添加到所有分组有序SimHash表中。由于采用有序数组的结构,在更新时,只需0(1)的复杂度。
前面已经具体描述了本发明的实施方案,应当理解,对于一个具有本技术领域的普通技能的人,在不背离本发明的范围的情况下,在上述的和在权利要求中特别提出的本发明的范围内进行变化和调整能同样达到本发明的目的。