如何用Python计算上几百张图片之间的相似度?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Python计算上几百张图片之间的相似度?相关的知识,希望对你有一定的参考价值。
文件夹里有几百张png图片,图片大小一致,如何用python将相同的那些图片找出来?
参考技术A 把图片表示成向量,二维拉成一维每个维度非零即一,然后比较两个向量的汉明距离就能反向代表相似度 参考技术B 这是扫雷游戏吗
要计算相同局面吗
计算两张图片相似度的方法总结
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
评价
使用上面的简单实现几乎没什么效果。当然上面的实现略显粗糙,图片被压缩得很小。
基于模式识别的方法
- 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:没有找到实现)
网上有价值的讨论链接
- 谷歌图像搜索原理:https://www.zhihu.com/question/19726630
- How can we measure similarities between two images? https://www.researchgate.net/post/How_can_we_measure_similarities_between_two_images
总结
如果不使用基于模式识别的方法,以上所述多种方法都可以大致比较两张图片的相似性。但是以上各方法的效果也很大程度上依赖于许多具体实现细节,由于没有一个衡量尺度,所以很难比较各方法的优劣。
以上是关于如何用Python计算上几百张图片之间的相似度?的主要内容,如果未能解决你的问题,请参考以下文章