`
wbj0110
  • 浏览: 1559259 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多

相似图片搜索的三种算法

图片

想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下:

 

一、平均哈希算法(aHash)

此算法是基于比较灰度图每个像素与平均值来实现的。

步骤:

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 就是两张完全不同的图片)

 

下面是我用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

分享到:
评论

相关推荐

    相似图片搜索原理源码-Java实现

    Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 这种技术的原理是什么? 计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。 我们可以用一个快速...

    图片搜索图片,基于php实现的图片相似搜索类,优化了感知算法(hash)不准确的问题

    虽然均值哈希更简单且更快速,但是在比较上更死板、僵硬。...一个更健壮的算法叫pHash,(我使用的是自己改进后的算法,但概念是一样的) pHash的做法是将均值的方法发挥到极致。使用离散余弦变换(DCT)降低频率。

    相似图片搜索原理 Java实现源码

    Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 这种技术的原理是什么?计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。我们可以用一个快速算法,...

    Java实现相似图片搜索原理 源码分享

    Java实现相似图片搜索原理 源码分享。 Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 这种技术的原理是什么?计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常...

    基于C++通过三种哈希算法,透过汉明距离的比较,搜索指定文件夹内相似图片

    PixSearch(相似圖片搜索) 基于C++通过三种哈希算法,透过汉明距离的比较,搜索指定文件夹内相似图片 均值哈希 aHash 差异哈希 dHash 感知哈希 pHash

    相似图片搜索

    讲述了相似图片搜索的几种方法,包括:基于文本的相似图片搜索和基于内容的图片搜索(浅层和深度学习方法),邮箱:fufaloveguomengkai@163.com

    bmp图片相似性搜索

    根据图片相似度算法,输入源图像,输出与它相似的图片

    caseopen.rar_C#图片相似_visual c_图像搜索_图片搜索_图片相似

    图像搜索用于对相似图片进行搜索的一种算法

    以图找图:相似图片搜索的原理

    上传后,Google返回如下结果:类似的"相似图片搜索引擎"还有不少,TinEye甚至可以找出照片的拍摄背景。这种技术的原理是什么?计算机怎么知道两张图片相似呢?根据NealKrawetz博士的解释,原理非常简单易懂。我们可以...

    图片识别-感知哈希算法

    类似于谷歌图片搜索,用户上传一个图片,谷歌显示因特网中与此图片相同或者相似的图片。

    淘宝中根据图片搜图片,基于Java语言实现的,相似图像识别准确率达95%

    经过公司CTO的帮助,完成了基于Java语言实现的,相似图像识别,基于直方图比较算法,经过测算此算法优于基于图像指纹的哈希算法.千金难买好代码.

    一个简单的图片压缩算法的源代码

    算法原理很简单:取一个点,然后把这个点之后的n个与该点差别不大的点个数数出来,然后存储为像素+n的格式,这样如果图像中连续相似的点比较多,就可以大幅度压缩图像。今天一天就把这个东东搞定了,测试了一下,...

    液晶屏字符显示缺陷检测算法研究 (2014年)

    介绍了检测装置的总体框架和检测算法,算法的核心是提出的改进的基于形状模板的图像匹配算法,利用加权归一化向量点积相似度量计算方法,采用图像金字塔分层搜索策略,与常用的SIFT(Scale-invariant feature ...

    Facebook AI实验室开源的相似性搜索库Faiss.zip

    相似性搜索的分类:最邻近搜索(nearest neighbor search)和范围查询(range queries)是相似搜索的重要子分类,研究人员已针对这两种分类开发出多种解决方案。相似性搜索中存在的问题也是搜索复杂对象时的固有问题...

    相似文件查找工具NoClone2013中文版.rar

    软件采用优化算法,即使文件名不一样也能够查找到相似的文件。支持自定义搜索文件类型.重复文件定义:文件名(不含类型)、文件类型、文件内容(按字节进行比较),按字节比较相同内容、MDB比较。软件启动后,界面默认为...

    淘宝中根据图片搜图片 Java语言实现的,相似图像识别

    基于Java语言实现的,相似图像识别,基于直方图比较算法,经过测算此算法优于基于图像指纹的哈希算法.千金难买好代码.

    查找相似或者相同的图片 win7 实测可用

    由于使用了先进的搜索算法, 该工具可以迅速搜索您的硬盘,并找出重复或相似的照片. 它运行稳定使用简单,请享受它为您带来的高效整理照片集并腾出硬盘空间的乐趣。 注册信息:DFRZ-Y9KL-3UKK-HZBJ

    PHP实现搜索相似图片

    感知哈希算法 count < =5 匹配最相似 count > 10 两张不同的图片 var_dump(ImageHash::run(‘./1.png’, ‘./psb.jpg’)); <?php class ImageHash { const FILE_NOT_FOUND = '-1'; const FILE_EXTNAME_...

Global site tag (gtag.js) - Google Analytics