2009-06-15 89 views

回答

3

散列通常是将大量数据减少到可用于识别该图像的短(ish)数的有用方法。

它们有时候只是为了提供一种方便的方式来识别文件而不需要人的干预,特别是在有几个并行作者的情况下,不能依靠它来增加某些主计数器(JPG001 JPG002)而没有重叠。

有时哈希值是不可伪造的,所以我可以说 - 如果您生成的图像哈希值与我发送图像时所做的哈希值相同,那么您可以确定它是来自我的(而不是由妖孽调整)。然而,并非所有的哈希都可以做出这样的保证,每隔几年这种流行的这种“加密”哈希就显示出有致命的缺陷。

+0

所以你会使用它,如果你想分配一个独特的难以猜测的名称的形象? – seanbrant 2009-06-15 22:24:46

+1

不,不难猜测,它可以直接从图像本身导出(大概可以通过你不想猜对的人来访问)。您可能会首先转换图像或为图像加水印,这将改变图像,使散列不再起作用,但我不确定您是否刚刚销毁了散列值。 – 2009-06-15 22:47:18

-1

嗯....要比较图像(广义上,图片,或任何其他二进制文件)速度快,没​​有比较整个文件?

+0

那么,只要你清楚两幅图像可能基本相同,或完全相同,甚至仅在元数据上有所不同,那么是的。 – 2009-06-15 22:14:46

+0

...不同的元数据,但仍然不符合这个“比较”,那么是的。 – 2009-06-15 22:15:22

1

实际上,图像哈希算法很流行,可以在一系列帧或视频中找到相似的图像,或者像许多电影工作室现在所做的那样在各种图像中嵌入水印(几乎可以让人毛骨悚然地回到搏击俱乐部!)。

26

虽然通常散列文件散列文件的各个位的数据,但图像散列在稍高的层次上工作。不同之处在于,对于图像散列,如果两张图片看起来几乎完全相同,但格式不同或分辨率不同(或者可能由于压缩导致轻微损坏),则应该散列到相同的数字。尽管他们的数据的实际部分完全不同,但如果他们看起来与人类完全相同,他们会对同一事物进行哈希处理。

这是搜索的一个应用。 TinEye.com允许您上传图片并在互联网上查找其中的很多事件。像谷歌,它有一个网络爬虫,爬过网页,寻找图像。然后它将这些图像散列化并将散列和URL存储在数据库中。当你上传图片时,它只是简单地计算哈希值并检索链接到数据库中该哈希值的所有URL。 TinEye的使用范例包括寻找更高分辨率的图片,或找到某人的公开facebook/myspace /等。从他们的图片(假定这些配置文件使用相同的照片轮廓。

图像散列也可以与高速缓存或本地存储用于防止重复的照片或存储的重发,分别。

有很多其他包括图像验证和在视频中查找类似帧的可能性(如其他人所提到的)

19

HashingHashing是一种适用于任意数据并生成固定大小数据(通常为非常小的数据)的函数。有很多不同类型的哈希,但是如果我们谈论图像哈希,它可以用于:

  • 查找重复的速度非常快。几乎所有的散列函数都可以工作。不要搜索整个图像,而是寻找图像的散列。
  • 找到类似的图片,我会解释后

图片看起来相同的我们,可以是非常不同的,如果你只是比较原始字节。这可能是由于:

  • 调整
  • 旋转
  • 略有不同的色彩伽玛
  • 不同格式
  • 一些轻微的噪音,水印和文物

即使你会发现一个图像只会在一个字节中不同,如果你将一个散列函数应用到它上面,结果可能会非常不同(对于散列,如MD5, SHA它最有可能会完全不同)。

所以你需要一个散列函数,它会为类似的图像创建一个类似的(甚至相同的)散列。其中一个通用的是locality sensitive hashing。但是我们知道图像有什么样的问题,所以我们可以想出一个more specialized kind of hash

最公知的算法是:

  • a-hash。平均散列是最简单的算法,它只使用少量转换。对图像进行缩放,转换为灰度,计算平均值并根据平均值对灰度进行二值化。现在将二进制图像转换为整数。该算法非常简单,您可以在一个小时内实现它。
  • p-hash。知觉散列使用类似的方法,但取而代之的是取决于discrete cosine transformation(信号处理中流行的转换)。
  • d-hash。差异散列使用与散列相同的方法,但不使用有关平均值的信息,而是使用渐变(相邻像素之间的差异)。
  • w-hash。非常类似于p-hash,但它使用wavelet transformation而不是DCT。

顺便说一句,如果你使用Python,所有这些哈希值已经在this library实现。