感知哈希算法浅析
Posted 三国测
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了感知哈希算法浅析相关的知识,希望对你有一定的参考价值。
(2011-08-16 17:26:13)
TinEye是如何工作的呢?这里面也许有十分复杂的原理。不过从结果看来,它使用了一种叫做“感知哈希算法(以下简称PHA)”的东西。
PHA是一类比较哈希方法的统称。图片所包含的特征被用来生成一组指纹(不过它不是唯一的),而这些指纹是可以进行比较的。
PHA与加密哈希方法(以下简称CHA),如MD5、SHA1等,是不同的概念。CHA的哈希值是随机的。用来生成哈希的数据的行为就像随机种子,所以相同的数据产生相同的结果,反之亦然。读者可以如下做ruby测试:
require 'digest/sha2'
......
#生成加密后的散列值
def self.encrypt(string)
return Digest::SHA256.hexdigest(string)
end
我对这方面未做深层研究,如有错误,不吝赐教。此文的重点不是CHA,恕草草带过。
如果想要深入理解下文内容的话,不妨读读我在ftp里的fourier相关文档,会有所收获。当然,不读也不会造成大的影响。(ftp具体在文末有提及)
下面来看它的过程。
第一步,缩小尺寸。
与平均值方法类似,不过要比8X8大些,32X32是个好尺寸,这样做是为了简化DCT的计算,而不是降频。
改成灰度图,也是为了减少DCT计算量。
DCT将图片分成了频度和纯量的集合。当JPEG使用8X8的DCT时,算法就使用32X32的DCT。
当DCT是32X32时,只保留顶左的8X8,这部分代表了图片的最低频。这是神奇的一步。
第五步,计算平均值。
只用8X8的DCT低频值,因为DC系数和其他值相差很大,会破坏平均值。
第六步,进一步缩小DCT
将每个像素的灰度(64比特),与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。图片结构不变,结果就不会变。这完成了关键的一步。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
= 8a0303f6df3ec8cd
看上去很随机的blob,其实仔细看容易发现,黑点是头部轮廓和原图右边背景的垂直线。
用户名:yuanxiaodan
密码:public
在此再次感谢阮一峰先生的博文,并对前一篇文章末的承诺表示抱歉。
由于马尔可夫过程的研
究难度,博文计划延后,请期待。
转载列表:
转载
转载是分享博文的一种常用方式...
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
以上是关于感知哈希算法浅析的主要内容,如果未能解决你的问题,请参考以下文章