相似图片搜索的三种算法
想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下:
一、平均哈希算法(aHash)
此算法是基于比较灰度图每个像素与平均值来实现的。
步骤:
1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片。
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。
附上灰度图相关算法(R = red, G = green, B = blue)
4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.
5.得到信息指纹:组合64个bit位,顺序随意保持一致性即可。
6.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)
下面是我用java写的此算法的程序,eclipse可直接运行。
下载地址:見附件
待比较的原图:
图片库中的四张图:
输出结果:
similar_pic.jpg与原图很少相似
google.gif与原图完全不同
origin.jpg与原图是同一张图
ohter_word.jpg与原图极其相似
二、感知哈希算法(pHash)
平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法
步骤:
1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
3.计算DCT:DCT把图片分离成分率的集合
4.缩小DCT:DCT是32*32,保留左上角的8*8,这些代表的图片的最低频率
5.计算平均值:计算缩小DCT后的所有像素点的平均值。
6.进一步减小DCT:大于平均值记录为1,反之记录为0.
7.得到信息指纹:组合64个信息位,顺序随意保持一致性即可。
8.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)
此算法可参考开源项目pHash,下载地址:http://www.phash.org/download/
三、dHash
相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。
步骤:
1.缩小图片:收缩到9*8的大小,一遍它有72的像素点
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
3.计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值
4.获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.
这几种算法只是图片相似计算的核心,还有许多可以改进的地方,比如对于人物可以先进行人脸识别,再在面部区域进行局部的哈希,或者背景是纯色的可以先过滤剪裁等等。
come from internet
相关推荐
Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 这种技术的原理是什么? 计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。 我们可以用一个快速...
虽然均值哈希更简单且更快速,但是在比较上更死板、僵硬。...一个更健壮的算法叫pHash,(我使用的是自己改进后的算法,但概念是一样的) pHash的做法是将均值的方法发挥到极致。使用离散余弦变换(DCT)降低频率。
Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 这种技术的原理是什么?计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。我们可以用一个快速算法,...
Java实现相似图片搜索原理 源码分享。 Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 这种技术的原理是什么?计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常...
PixSearch(相似圖片搜索) 基于C++通过三种哈希算法,透过汉明距离的比较,搜索指定文件夹内相似图片 均值哈希 aHash 差异哈希 dHash 感知哈希 pHash
讲述了相似图片搜索的几种方法,包括:基于文本的相似图片搜索和基于内容的图片搜索(浅层和深度学习方法),邮箱:fufaloveguomengkai@163.com
根据图片相似度算法,输入源图像,输出与它相似的图片
图像搜索用于对相似图片进行搜索的一种算法
上传后,Google返回如下结果:类似的"相似图片搜索引擎"还有不少,TinEye甚至可以找出照片的拍摄背景。这种技术的原理是什么?计算机怎么知道两张图片相似呢?根据NealKrawetz博士的解释,原理非常简单易懂。我们可以...
类似于谷歌图片搜索,用户上传一个图片,谷歌显示因特网中与此图片相同或者相似的图片。
经过公司CTO的帮助,完成了基于Java语言实现的,相似图像识别,基于直方图比较算法,经过测算此算法优于基于图像指纹的哈希算法.千金难买好代码.
算法原理很简单:取一个点,然后把这个点之后的n个与该点差别不大的点个数数出来,然后存储为像素+n的格式,这样如果图像中连续相似的点比较多,就可以大幅度压缩图像。今天一天就把这个东东搞定了,测试了一下,...
介绍了检测装置的总体框架和检测算法,算法的核心是提出的改进的基于形状模板的图像匹配算法,利用加权归一化向量点积相似度量计算方法,采用图像金字塔分层搜索策略,与常用的SIFT(Scale-invariant feature ...
相似性搜索的分类:最邻近搜索(nearest neighbor search)和范围查询(range queries)是相似搜索的重要子分类,研究人员已针对这两种分类开发出多种解决方案。相似性搜索中存在的问题也是搜索复杂对象时的固有问题...
软件采用优化算法,即使文件名不一样也能够查找到相似的文件。支持自定义搜索文件类型.重复文件定义:文件名(不含类型)、文件类型、文件内容(按字节进行比较),按字节比较相同内容、MDB比较。软件启动后,界面默认为...
基于Java语言实现的,相似图像识别,基于直方图比较算法,经过测算此算法优于基于图像指纹的哈希算法.千金难买好代码.
由于使用了先进的搜索算法, 该工具可以迅速搜索您的硬盘,并找出重复或相似的照片. 它运行稳定使用简单,请享受它为您带来的高效整理照片集并腾出硬盘空间的乐趣。 注册信息:DFRZ-Y9KL-3UKK-HZBJ
感知哈希算法 count < =5 匹配最相似 count > 10 两张不同的图片 var_dump(ImageHash::run(‘./1.png’, ‘./psb.jpg’)); <?php class ImageHash { const FILE_NOT_FOUND = '-1'; const FILE_EXTNAME_...