`
zhangziyueup
  • 浏览: 1168572 次
文章分类
社区版块
存档分类
最新评论

图片相似原理 - Java实现

阅读更多

前阵子在阮一峰的博客上看到了这篇《相似图片搜索原理》博客,就有一种冲动要将这些原理实现出来了。

Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。

打开Google图片搜索页面:


点击使用上传一张原图:


点击搜索后,Google将会找出与之相似的图片,图片相似度越高就越排在前面。如:


这种技术的原理是什么?计算机怎么知道两张图片相似呢?

根据Neal Krawetz博士的解释,实现相似图片搜素的关键技术叫做"感知哈希算法"(Perceptualhash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。

以下是一个最简单的Java实现:

预处理:读取图片


第一步,缩小尺寸。

将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

第二步,简化色彩。

将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。


第三步,计算平均值。

计算所有64个像素的灰度平均值。


第四步,比较像素的灰度。

将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。


第五步,计算哈希值。

将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。

== 8f373714acfcf4d0


得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hammingdistance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

你可以将几张图片放在一起,也计算出他们的汉明距离对比,就可以看看两张图片是否相似。

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。

实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较。


以上内容大部分直接从阮一峰的网站上复制过来,想看原著的童鞋可以去在最上面的链接点击进去看。


提供源码下载,源码下载链接:http://download.csdn.net/detail/luohong722/3965112

分享到:
评论

相关推荐

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

    计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。 我们可以用一个快速算法,就达到基本的效果。 这里的关键技术叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是对...

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

    计算机怎么知道两张图片相似呢? 根据Neal Krawetz博士的解释,原理非常简单易懂。我们可以用一个快速算法,就达到基本的效果。 这里的关键技术叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是对每...

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

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

    相似图片搜索原理的Java实现源码范例和详细说明(由浅入深,深度解读在资料后半部分).docx

    相似图片搜索原理的Java实现源码范例和详细说明(由浅入深,深度解读在资料后半部分).docx

    相似图片搜索原理的Java实现源码范例和详细说明(由浅入深,深度解读在资料后半部分)(合集).docx

    相似图片搜索原理的Java实现源码范例和详细说明(由浅入深,深度解读在资料后半部分)(合集)

    JAVA根据图片搜索原理实现 项目附带图片非常完整适合学习

    关键技术:"感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。

    JAVA面试题最全集

    7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...

    image-similarity:计算图片之间的相似度

    结果越接近,就说明图片越相似。下面是一个最简单的实现: 第一步,缩小尺寸。将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异...

    纯javaScript、jQuery实现个性化图片轮播【推荐】

    纯javaScript实现个性化图片轮播 轮播原理说明<如上图所示>: 1. 画布部分(可视区域)属性说明:overflow:hidden使得超出画布部分隐藏或说不可见。position:relative 会导致自身位置的相对变化,而不会影响其他...

    QT 绘图函数

    为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。 还有一个疑问,既然反走样比不反走样的图像质量高很多,不进行反走样的绘制还有什么作用呢?前面说的是一个方面,也就是,在...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    ASP.Net中控件数量是非常多的,讲解ASP.Net的教材通常要上千页,让初学者望而生畏,其实ASP.Net大部分控件相似性非常强的,同类型的控件学会了一个那么其他控件也就很容易学会了。比如只要学会了DropDownList,那么...

    C# Winform数据库应用设计(附开发案例

    们之前的学习的C语言、Java语言一样同属于C语言语法系列,有很多相似的地方,同时也 有一些不同的地方,因此我们在学习的时候需要注意它们之间的区别,不要混淆。在本章中, 我们需要掌握c#中的变量、数据类型、运算符、...

Global site tag (gtag.js) - Google Analytics