图像相似性搜索的原理
副标题[/!--empirenews.page--]
本文转自: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html http://www.voidcn.com/article/p-nvcdxgfv-bnx.html http://blog.sina.com.cn/s/blog_b27f71160101gp9c.html http://www.voidcn.com/article/p-ojqegjmq-wy.html http://www.voidcn.com/article/p-cttqtaiy-g.html http://blog.sina.com.cn/s/blog_b27f71160101gpep.html 计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。我们可以用一个快速算法,就达到基本的效果。 这里的关键技术叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。 下面是一个最简单的实现: 一、平均哈希算法(aHash) 此算法是基于比较灰度图每个像素与平均值来实现的。 第一步,缩小尺寸。 将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。 ? 第二步,简化色彩。 将8*8的小图片转换成灰度图像,将64个像素的颜色(red,green,blue)转换成一种颜色(黑白灰度)。 第三步,计算平均值。 计算所有64个像素的灰度平均值。 第四步,比较像素的灰度。 将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。 第五步,计算哈希值。 将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。 ?=? ?= 8f373714acfcf4d0得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hamming distance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。 步骤说明:
1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片。 2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。 附上灰度图相关算法(R = red, G = green, B = blue) ? 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 2.整数方法:Gray=(R*30+G*59+B*11)/100 3.移位方法:Gray =(R*76+G*151+B*28)>>8; 4.平均值法:Gray=(R+G+B)/3; 5.仅取绿色:Gray=G; ? ? ? 3.计算平均值: 计算进行灰度处理后图片的所有像素点的平均值。? 4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0. 5.得到信息指纹:组合64个bit位,顺序随意保持一致性即可。 6.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)
算法实现(编辑:湘西站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |