图像哈希用于什么?

56

我有时听到这个术语,想知道它是用于什么?

5个回答

73

哈希是一种应用于任意数据并生成固定大小数据(通常非常小)的函数。有许多不同类型的哈希,但如果我们谈论图像哈希,则主要用于:

  • 快速查找重复项。几乎任何哈希函数都可以使用。您将搜索图像的哈希值而非整个图像。
  • 查找相似的图像,稍后将进行解释

对于我们看来完全相同的图像,如果只比较原始的字节,它们可能会非常不同。这可能是由于以下原因:

  • 调整大小
  • 旋转
  • 略有不同的色彩伽玛
  • 不同的格式
  • 一些轻微的噪声,水印和伪像

即使您找到的图像只在一个字节上不同,如果对其应用哈希函数,则结果可能会非常不同(对于像MD5、SHA这样的哈希来说,它很可能完全不同)。

因此,您需要一种哈希函数,它将为相似的图像创建相似的(甚至是相同的)哈希。其中一种通用算法是局部敏感哈希。但是,我们知道图像可能存在哪些问题,因此我们可以想出一种更专业的哈希

最著名的算法包括:

  • a-hash。平均哈希是最简单的算法,仅使用少量转换。将图像缩放,转换为灰度,计算平均值,并根据平均值对灰度进行二值化处理。现在将二进制图像转换为整数。该算法非常简单,您可以在一个小时内实现它。
  • p-hash。感知哈希使用类似的方法,但不是取平均值,而是依赖于离散余弦变换(信号处理中的流行变换)。
  • d-hash。差异哈希使用与a-hash相同的方法,但不是使用平均值的信息,而是使用梯度(相邻像素之间的差异)。
  • w-hash。与p-hash非常相似,但它使用小波变换,而不是DCT。

顺便说一句,如果您使用Python,所有这些哈希已经在这个库中实现了。


这里我对d-hash进行了一些改进:https://github.com/Nakilon/dhash-vips#idhash-the-important-difference-hash - Nakilon

41

通常情况下,对文件进行哈希会对文件的每个数据位进行哈希,而图像哈希则在稍微高一级的层面上工作。区别在于,对于图像哈希而言,如果两张图片看起来几乎相同但格式、分辨率不同(或者存在轻微损坏,可能是由于压缩引起),它们应该哈希到同一个数字。尽管它们实际的数据位完全不同,如果它们对人类来说几乎相同,那么它们哈希得到相同的结果。

这种技术有一个应用就是搜索。TinEye.com允许你上传一张图片,并在互联网上查找其许多出现的位置。与谷歌一样,它有一个网络爬虫,遍历网页并寻找图片。然后对这些图片进行哈希并将哈希和URL存储在数据库中。当你上传一张图片时,它只需计算哈希并检索数据库中链接到该哈希的所有URL。TinEye的示例用途包括查找更高分辨率版本的图片,或者通过照片找到某人的公开Facebook / Myspace /等社交媒体个人资料(假设这些资料使用了相同的照片)。

图像哈希还可以与缓存或本地存储一起使用,以防止重复传输或存储重复照片。

还有许多其他可能性,包括图像认证和查找视频中类似的帧(正如其他人所提到的)。


4

哈希在一般情况下是一种有用的方式,可以将大量数据缩减为一个相对短的数字,以用于标识该图像。

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

有时候哈希也被用作不可伪造的方式,这样我就可以说 - 如果您生成的图像哈希与我发送给您时所做的哈希相同,那么您可以确定它是我的(而不是被恶意调整过)。然而,并非所有哈希都能做到这一点,每隔几年就会发现一种流行的“加密”哈希具有致命缺陷。


如果您想为图像分配一个难以猜测的唯一名称,那么您会使用它吗? - seanbrant
1
不,这并不难猜测,它可以直接从图像本身推导出来(这个图像可能被你不想猜测的人访问)。你可以尝试先转换或加水印到图像上,这样会改变图像,使哈希值不再起作用,但我不确定你是否已经破坏了哈希值的价值。 - Alex Brown

1
实际上,图像哈希在查找序列帧或视频中的相似图像方面非常流行,或者用于将水印嵌入到各种图像中,正如现在许多电影制片厂所做的那样(几乎回到了《搏击俱乐部》中令人毛骨悚然的感觉!)。

-1

嗯...如何快速比较图像(广义上的图片或任何其他二进制文件),而不必比较整个文件?


只要你清楚地知道两幅看起来基本相同、完全相同或仅在元数据上有所不同的图像,那么就可以了。 - Alex Brown
如果它们在元数据上不同,但根据此“比较”仍然不匹配,则是的。 - Alex Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接