之前介绍了许多图像比对的算法,这里再介绍一个算法,叫感知哈希算法:perceptual hash algorithm, 它的作用是对每张图像生成一个“指纹”字符串,然后比较不同图像的指纹。结构越接近,说明图像越相似。
哈希算法步骤图解
这个算法常用于图像整理,归类上,比如快速整理手机中的照片文件夹子。该算法的优点明显,相对于其它算法实现起来比较简单,且速度快,准确率高。
图像哈希或者叫感知哈希包括以下两个过程:
1)检查图像内容
2)构造基于图像内容唯一标识,即输入图像的哈希值
最典型的应用比如TinEye,就是一种采用反向图像搜索引擎。用户可以:
1)上传图像
2)然后TinEye给出类似图像的网址
接下来我们将讨论:
1)图像散列(为什么传统散列不起作用)
2)实现图像散列,特别是差异散列(dHash)
3)将图像散列应用于实际问题和数据集
为什么我们不能使用md5,sha-1等?
图2:
在此示例中,我获取输入图像并计算md5哈希值。然后我将图像调整为宽度为250像素而不是500像素,然后再次计算md5哈希值。即使图像的内容没有改变,哈希也是如此。
具有密码学或文件验证背景的读者可能想知道为什么不能使用md5或sha-1等。这里的问题在于加密散列算法的本质:更改文件中的单个位将导致不同的散列。这意味着如果我们改变输入图像中单个像素的颜色,最终会得到一个不同的校验和,而事实上对于我们在图像感知层面上根本不觉得有什么不同。也就是说这个微小的改变我们是无法觉察的。
图2中的例子就说明这个问题,只是改变图像的大小,其它不变,计算图像的md5哈希,结构哈希值发生变化。在图像哈希情况下,我们实际上希望类似的图像具有类似的哈希值。
该项目的测试图像哈希数据集
该项目的目标是:
1)两个图像目录,dataset和query
2)确定query目录中的图像哪些已经在dataset中,哪些没有
使用图像哈希,我们可以快速完成这个任务。
了解图像哈希和差异哈希
dHash算法只有四个步骤
步骤一:转换图像为灰度
图3:通过差异散列算法进行图像散列的第一步是将输入图像(左)转换 为灰度(右)。
图像散列算法的第一步把输入图像转换成灰度并丢弃任何颜色信息。这样我们只需要检查一个通道,从而更快地散列图像,另外匹配相同但颜色空间略有变化的图像。无论出于何种原因,如果你对于颜色感兴趣,可以独立在每个通道上应用散列算法,然后在最后进行组合。
步骤二:调整大小
灰度图像后,把图像压缩到9 x 8像素,忽略纵横比。