Image processing 如何识别轻微修改的图像?

Image processing 如何识别轻微修改的图像?,image-processing,hash,fuzzy-comparison,Image Processing,Hash,Fuzzy Comparison,我有一个非常大的jpeg图像数据库,大约200万。我想在这些图像中做一个模糊的重复搜索。重复图像是两个图像,其中许多(大约一半)像素具有相同的值,其余像素的R/G/B值约为+/-3。这些图像与肉眼完全相同。这就是重新压缩jpeg图像所带来的区别 我已经有了一种简单的方法来检测两幅图像是否相同:我将所有像素的亮度增量相加,然后与阈值进行比较。这种方法已经被证明是100%准确的,但是在200万张照片中拍摄一张照片的速度非常慢(每张照片需要几个小时) 我想以一种我可以在哈希表中比较指纹的方式对图像进行

我有一个非常大的jpeg图像数据库,大约200万。我想在这些图像中做一个模糊的重复搜索。重复图像是两个图像,其中许多(大约一半)像素具有相同的值,其余像素的R/G/B值约为+/-3。这些图像与肉眼完全相同。这就是重新压缩jpeg图像所带来的区别

我已经有了一种简单的方法来检测两幅图像是否相同:我将所有像素的亮度增量相加,然后与阈值进行比较。这种方法已经被证明是100%准确的,但是在200万张照片中拍摄一张照片的速度非常慢(每张照片需要几个小时)


我想以一种我可以在哈希表中比较指纹的方式对图像进行指纹识别。即使我可以可靠地将需要比较的图像数量减少到100个,我也可以将1个图像与100个图像进行比较。什么是一个好的算法?

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

我认为这个问题不能通过哈希来解决。困难在于:假设您有一个红色像素,并且希望3和5散列到相同的值。那么,你还需要5和7散列到相同的值,7和9,依此类推。。。可以构造一个链,表示希望所有像素散列为相同的值

以下是我将尝试的:

  • 构建一个巨大的B树,每个节点有32路扇出,包含所有图像
  • 树中的所有图像大小相同,或者它们不是重复的
  • 给每个彩色像素一个从零开始的唯一数字。对于R、G、B分量,左上角的编号可能为0、1、2,或者最好使用随机排列,因为您将按照编号顺序比较图像
  • 深度n处的内部节点根据像素n除以8的值来区分32种方式(这将获得附近像素中的一些噪声)
  • 一个叶节点包含一些少量的图像,比如说10到100个。或者图像的数量是深度的一个递增函数,因此,如果一个图像有500个副本,在某个深度之后,您将停止尝试区分它们
  • 所有200万个节点都插入到树中,只有在同一个节点上,两个图像才是重复的。对吗?错!如果两个图像中的像素值为127和128,一个进入outedge 15,另一个进入outedge 16。因此,实际上,当你区分一个像素时,你可以将该图像插入一个或两个子图像:

    • 对于亮度
      B
      ,在
      B/8
      (B-3)/8
      (B+3)/8
      处插入。有时所有3个都是相等的,并且3个中的2个总是相等的。但如果概率为3/8,则图像显示的路径数会增加一倍。根据路径的深度,可能会有很多额外的节点
    其他人将不得不做数学运算,看看你是否必须除以大于8的值,以避免图像被复制过多。好消息是,即使真正的扇出值仅为4而不是32,你只需要一棵深度为10的树。10中的4次复制会在叶子上产生多达3200万个图像。我希望你有有足够的RAM供您使用!如果没有,您可以将树放在文件系统中


    让我知道这是怎么回事!

    缩略图中的哈希也很好:可以识别缩放的重复项(只需很少修改)

    看看O.Chum、J.Philbin和a.Zisserman在《2008年英国机器视觉会议论文集》上发表的文章。他们解决了你的问题,并展示了146k图像的结果。但是,我对他们的方法没有第一手经验。

    基于minHash的思想

    我的想法是使用数据库中当前的所有图像创建100个查找表。查找表从特定像素的亮度映射到同一像素中具有相同亮度的图像列表。要搜索图像,只需将其输入哈希表,获得100个列表,并在每个图像出现时为其打分显示在列表中。每张图像的得分范围为0到100。得分最多的图像获胜

    如何在合理的内存限制内完成此操作以及如何快速完成此操作存在许多问题。磁盘上的存储需要正确的数据结构。也可以调整哈希值、表数等。如果需要更多信息,我可以对此进行扩展


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

    我不这么认为。我尝试比较了25x25的小图像,它们也有肉眼看不见的差异。@Eyal-如果在25x25,两张图像看起来是同一个方向的ntical,它们可能仍然不同,但如果它们看起来不同,它们就不同了。您已经有了检测相同图像的算法,但速度很慢。因此,我的建议是首先创建一个在25x25处看起来相同的图像子集,然后丢弃其余图像。然后创建该子集的50x50图像,然后再次比较,更多图像将被丢弃。然后再次使用100x100等。我们的想法是,在每次迭代中,每个图像都会有一个cpu/磁盘密集型的处理过程,但图像数量较少(如果我不理解您的问题,请原谅),您需要限制颜色空间。RGB图像有2^(3*8)==16777216颜色。缩小后的图像在颜色上肯定会有细微的差异,并产生不同的散列。尝试将颜色空间限制为2^(3*2)==64颜色。但是,这也不理想,因为图片中的一个小变化可能会将一个像素推入不同的缩小后的颜色。也许可以将平均颜色变化加权为