如何识别略有修改的图像?

时间:2010-01-30 18:03:36

标签: image-processing hash fuzzy-comparison

我有一个非常大的jpeg图像数据库,大约200万。我想模糊搜索这些图像中的重复项。重复图像是两个图像,其具有相同值的许多(大约一半)像素,其余图像的R / G / B值偏差约+/- 3。图像与肉眼相同。这是你从重新压缩jpeg中获得的那种差异。

我已经有了一种万无一失的方法来检测两个图像是否相同:我将所有像素的增量亮度相加并与阈值进行比较。这种方法已经证明100%准确,但是对照200万张照片非常慢(每张照片的小时数)。

我想以一种可以比较哈希表中的指纹的方式对图像进行指纹处理。即使我能够可靠地将我需要比较的图像数量减少到100,我也会很好地比较1到100.对于这个算法会有什么好处呢?

5 个答案:

答案 0 :(得分:18)

请参阅2008年英国机器视觉会议论文集中的O. Chum,J。Philbin和A. Zisserman,Near duplicate image detection: min-hash and tf-idf weighting。他们解决了您所遇到的问题,并展示了146k图像的结果。但是,我对他们的方法没有第一手经验。

答案 1 :(得分:3)

天真的想法:创建一个小缩略图(50x50像素)来查找“可能相同”的图像,然后增加缩略图大小以丢弃更多图像。

答案 2 :(得分:2)

以minHash的想法为基础......

我的想法是使用当前数据库中的所有图像制作100个查找表。查找表从特定像素的亮度映射到在该相同像素中具有相同亮度的图像列表。要搜索图像,只需将其输入哈希表,获取100个列表,并在每个图像显示在列表中时为每个图像计分。每张图片的得分均为0到100.点数最多的图像获胜。

在合理的内存限制内如何执行此操作以及如何快速执行此操作存在许多问题。磁盘上的存储需要适当的数据结构。也可以调整散列值,表格数等。如果需要更多信息,我可以对此进行扩展。

我的成绩非常好。我能够在一台计算机上大约24小时内索引一百万张图像,我可以每秒查找20张图像。据我所知,准确性令人震惊。

答案 3 :(得分:1)

我不认为哈希可以解决这个问题。这就是困难:假设你有一个红色像素,你希望3和5散列到相同的值。好吧,那么你也希望5和7散列到相同的值,7和9,依此类推......你可以构造一个链,表明你希望所有像素都散列到相同的值。

以下是我要尝试的内容:

  1. 构建一个巨大的B树,每个节点有32路扇出,包含所有图像。
  2. 树中的所有图像大小相同,或者它们不重复。
  3. 为每个彩色像素指定一个从零开始的唯一编号。对于R,G,B组件,左上角可能编号为0,1,2,或者随机排列可能会更好,因为您将按照该编号的顺序比较图像。
  4. 深度为n的内部节点区分像素n的值除以8的32路(这样可以得到附近像素中的一些噪声。
  5. 一个叶子节点包含一些少量的图像,比方说10到100.或者图像的数量是一个增加的深度函数,所以如果你有一个图像的500个重复,在一定深度后你就会停止尝试区分它们。
  6. 在树中插入了一百万个节点,只有两个节点位于同一节点时才会重复。对?错误!如果两个图像中的像素值分别为127和128,则一个进入outedge 15,另一个进入outedge 16.所以实际上当您区分像素时,可以将该图像插入一个或两个小孩:

    • 对于亮度B,请插入B/8(B-3)/8(B+3)/8。有时候所有3个都是相等的,并且3个中的2个总是相等的。但是在概率为3/8的情况下,图像显示的outedges数量会翻倍。根据事情的深度,您可以拥有大量额外节点。

    其他人将不得不进行数学计算,看看是否必须除以大于8的值,以防止图像被重复过多。好消息是,即使真正的扇出只有4而不是32,你只需要一棵深度为10的树.10个中的四个重复会让你在树叶上拍摄多达3200万张图像。我希望你有足够的内存供你使用!如果没有,您可以将树放在文件系统中。

    让我知道这是怎么回事!

答案 4 :(得分:1)

同样适用于缩略图的哈希:缩放重复项被识别(几乎没有修改)