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

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

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

评价

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

cosin相似度

简介

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

使用

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

评价

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

基于直方图

简介

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

使用

评价

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

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

基于互信息(Mutual Information)

简介

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

使用

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

评价

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

计算图像“指纹信息”

简介

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

使用

评价

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

基于模式识别的方法

Learning Fine-grained image similarity with deep ranking (2014)   https://users.eecs.northwestern.edu/~jwa368/pdfs/deep_ranking.pdf

提出一种基于深度学习的图片评级模型,不仅能很好地区分类内图片和类外图片,而且对于类内图片也能有一个相似度级别的区分。

On the Euclidean distance of images   http://ieeexplore.ieee.org/document/1453520/

一种针对图片的欧几里得距离计算方法,可以用来匹配图像相似度。(PS:没有找到实现)

网上有价值的讨论链接

总结

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

你可能感兴趣的:(python相似图片计算)