我有时会听到这个词,我想知道它的用途是什么?
散列是一种适用于任意数据并生成固定大小(通常是非常小的大小)的数据的函数.有许多不同类型的哈希,但如果我们谈论图像哈希,它可用于:
很快找到重复.几乎任何哈希函数都可以工作.您将寻找图像的散列,而不是搜索整个图像.
找到类似的图像,我稍后会解释
如果您只是比较原始字节,那么看起来与我们完全相同的图像会有很大差异.这可能是由于:
调整
回转
略有不同的颜色伽玛
格式不同
一些轻微的噪音,水印和文物
即使你会在一个字节中找到一个不同的图像,如果要对它应用哈希函数,结果可能会非常不同(对于像MD5这样的哈希,SHA很可能会完全不同).
因此,您需要一个哈希函数,它将为类似图像创建类似(或甚至相同)的哈希.其中一个通用的是局部敏感散列.但是我们知道图像会出现什么样的问题,所以我们可以提出一种更专业的哈希.
最着名的算法是:
一个哈希.平均散列是最简单的算法,只使用少量转换.缩放图像,转换为灰度,计算平均值并根据平均值对灰度进行二值化.现在将二进制图像转换为整数.算法非常简单,您可以在一小时内实现它.
p-hash.感知散列使用类似的方法,但不是平均依赖于离散余弦变换(信号处理中的流行变换).
d-hash.差异散列使用与a-hash相同的方法,但不使用有关平均值的信息,而是使用渐变(相邻像素之间的差异).
w-hash.与p-hash非常相似,但它使用小波变换而不是DCT .
顺便说一句,如果你使用python,所有这些哈希都已在这个库中实现.
虽然通常散列文件会散列文件的各个数据位,但图像散列的工作水平略高.不同之处在于,对于图像散列,如果两张图片看起来几乎完全相同但是格式或分辨率不同(或者可能由于压缩而导致轻微损坏),则它们应该散列到相同的数字.尽管他们的数据的实际位数完全不同,但如果他们看起来与人类完全相同,那么他们就会发现同样的事情.
其中一个应用是搜索.TinEye.com允许您上传图像并在互联网上查找其中的许多内容.像谷歌一样,它有一个网页抓取工具,可以抓取网页并查找图片.然后它散列这些图像并将散列和URL存储在数据库中.上传图像时,它只是计算哈希值并检索链接到数据库中该哈希值的所有URL.TinEye的示例用途包括查找更高分辨率版本的图片,或查找某人的公共facebook/myspace /等.他们照片中的个人资料(假设这些个人资料使用相同的照片
图像散列还可以与高速缓存或本地存储一起使用,以分别防止重传照片或存储重复.
还有很多其他可能性,包括图像验证和在视频中找到类似的帧(正如其他人所提到的).