感知哈希算法

感知哈希算法【感知哈希算法】感知哈希算法(以下简称PHA)是哈希算法的一类,主要用来做相似图片的搜寻工作 。
基本介绍中文名:感知哈希算法
外文名:Perceptual hash algorithm
简介PHA是一类比较哈希方法的统称 。图片所包含的特徵被用来生成一组指纹(不过它不是唯一的),而这些指纹是可以进行比较的 。算法流程下面是简单的步骤,来说明对图像进行PHA的运算过程:第一步,缩小尺寸 。最快速的去除高频和细节,只保留结构明暗的方法就是缩小尺寸 。将图片缩小到8x8的尺寸,总共64个像素 。摒弃不同尺寸、比例带来的图片差异 。第二步,简化色彩 。将缩小后的图片,转为64级灰度 。也就是说,所有像素点总共只有64种颜色 。第三步,计算DCT(离散余弦变换) 。DCT是把图片分解频率聚集和梯状形,虽然JPEG使用8*8的DCT变换,在这里使用32*32的DCT变换 。第四步,缩小DCT 。虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这部分呈现了图片中的最低频率 。第五步,计算平均值 。计算所有64个值的平均值 。第六步,进一步减小DCT 。这是最主要的一步,根据8*8的DCT矩阵,设定0或1的64位的hash值,大于等于DCT均值的设为”1”,小于DCT均值的设为“0” 。结果并不能告诉我们真实性的低频率,只能粗略地告诉我们相对于平均值频率的相对比例 。只要图片的整体结构保持不变,hash结果值就不变 。能够避免伽马校正或颜色直方图被调整带来的影响 。第七步,计算哈希值 。将64bit设定成64位的长整型,组合的次序并不重要,只要保证所有图片都採用同样次序就行了 。将32*32的DCT转换成32*32的图像 。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹 。组合的次序并不重要,只要保证所有图片都採用同样次序就行了(例如,自左到右、自顶向下、big-endian) 。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的 。在理论上,这等同于计算“汉明距离”(Hammingdistance) 。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片 。算法评价这个算法非常好,无论你改变图片的高宽、亮度甚至颜色,都不会改变哈希值 。最关键的是速度极快!cool!