计算两张图片相似度的方法总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算两张图片相似度的方法总结相关的知识,希望对你有一定的参考价值。

技术分享

python工具包-pyssim

简介

python工具包,用来计算图像之间的结构相似性 (Structural Similarity Image Metric: SSIM)。结构相似性介绍详见:https://zh.wikipedia.org/wiki/%E7%B5%90%E6%A7%8B%E7%9B%B8%E4%BC%BC%E6%80%A7

使用

安装:sudo pip install pyssim

源码:https://github.com/jterrace/pyssim

使用示例: pyssim image1 image2            返回一个-1~1之间的实数,代表两张图片的结构相似。更多参数详见git中的介绍。

评价

该方法能对两张图片的相似度进行一个大致的区分,它的计算基于两张图片的亮度、对比度和结构。但是对于有的图片,比如下面两个,它完全无法捕捉到它俩都是护照的信息,此方法计算的这两张图片的相似度接近于0。该方法更常用来衡量一张图片压缩后的失真度。

技术分享技术分享

cosin相似度

简介

把图片表示成一个向量,通过计算向量之间的余弦距离来表征两张图片的相似度。

使用

github上源码:https://github.com/hirobert/python-image-similarity

实现细节:首先会将两张图片缩小到相同的规格,一来可以减少运算量,二来大小不同的图片的表示向量没法直接点乘。向量每一维的值为对应像素点RGB值的平均。

评价

即使缩小了图片,求范数和点积的运算量仍然很大,速度明显比使用pyssim方法慢。但是直观感觉计算的结果比pyssim更靠谱。

除了使用余弦相似度,还可以使用别的评价指标来表征两个向量之间的相似度。详见以下链接:http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html

基于直方图

简介

直方图能够描述一幅图像中颜色的全局分布,是一种入门级的图像相似度计算方法。

使用

原理介绍及源码参考:http://blog.csdn.net/gzlaiyonghao/article/details/2325027   http://www.ruanyifeng.com/blog/2013/03/similar_image_search_part_ii.html

评价

过于简单,只能捕捉颜色的相似性,捕捉不到更多的信息。比如以下两张图片:

技术分享技术分享

由于二者颜色分布相似,所以判定二者相似度较高,显然不合理。

基于互信息(Mutual Information)

简介

通过计算两个图片的互信息来表征它们之间的相似度。

使用

可以借助medpy来计算互信息,详见:http://pythonhosted.org/MedPy/_modules/medpy/metric/image.html

medpy是个基于python的医学影像处理工具,提供计算图像之间的互信息的接口。

评价

这种方式,如果两张图片尺寸相同,还是能在一定程度上表征两张图片的相似性的。但是,大部分情况下图片的尺寸不相同,如果把两张图片尺寸调成相同的话,又会让原来很多的信息丢失,所以很难把握。经过实际验证,此种方法的确很难把握。

计算图像“指纹信息”

简介

将图片归一化成一定大小,计算一个序列作为它的指纹信息,然后比较两张图片指纹信息序列相同的位数。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

使用

一个简单的实现:http://www.ruanyifeng.com/blog/2011/07/imgHash.txt

评价

使用上面的简单实现几乎没什么效果。当然上面的实现略显粗糙,图片被压缩得很小。

基于模式识别的方法

网上有价值的讨论链接

总结

如果不使用基于模式识别的方法,以上所述多种方法都可以大致比较两张图片的相似性。但是以上各方法的效果也很大程度上依赖于许多具体实现细节,由于没有一个衡量尺度,所以很难比较各方法的优劣。



以上是关于计算两张图片相似度的方法总结的主要内容,如果未能解决你的问题,请参考以下文章

图片相似度判断

Java 如何对比两张图片的相似度

JAVA 比较两张图片的相似度的代码

图像处理中常用的相似度评估指标

图像处理中常用的相似度评估指标

图像处理中常用的相似度评估指标