计算图像相似度的算法都有哪些
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算图像相似度的算法都有哪些相关的知识,希望对你有一定的参考价值。
rt
SIM = Structural SIMilarity(结构相似性),这是一种用来评测图像质量的一种方法。由于人类视觉很容易从图像中抽取出结构信息,因此计算两幅图像结构信息的相似性就可以用来作为一种检测图像质量的好坏.首先结构信息不应该受到照明的影响,因此在计算结构信息时需要去掉亮度信息,即需要减掉图像的均值;其次结构信息不应该受到图像对比度的影响,因此计算结构信息时需要归一化图像的方差;最后我们就可以对图像求取结构信息了,通常我们可以简单地计算一下这两幅处理后的图像的相关系数.
然而图像质量的好坏也受到亮度信息和对比度信息的制约,因此在计算图像质量好坏时,在考虑结构信息的同时也需要考虑这两者的影响.通常使用的计算方法如下,其中C1,C2,C3用来增加计算结果的稳定性:
2u(x)u(y) + C1
L(X,Y) = ------------------------ ,u(x), u(y)为图像的均值
u(x)^2 + u(y)^2 + C1
2d(x)d(y) + C2
C(X,Y) = ------------------------,d(x),d(y)为图像的方差
d(x)^2 + d(y)^2 + C2
d(x,y) + C3
S(X,Y) = ----------------------,d(x,y)为图像x,y的协方差
d(x)d(y) + C3
而图像质量Q = [L(X,Y)^a] x [C(X,Y)^b] x [S(X,Y)^c],其中a,b,c分别用来控制三个要素的重要性,为了计算方便可以均选择为1,C1,C2,C3为比较小的数值,通常C1=(K1 x L)^2, C2=(K2 xL)^2, C3 = C2/2, K1 << 1, K2 << 1, L为像素的最大值(通常为255).
希望对你能有所帮助。 参考技术A sift算法,shape context
计算两张图片相似度的方法总结
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
总结
如果不使用基于模式识别的方法,以上所述多种方法都可以大致比较两张图片的相似性。但是以上各方法的效果也很大程度上依赖于许多具体实现细节,由于没有一个衡量尺度,所以很难比较各方法的优劣。
以上是关于计算图像相似度的算法都有哪些的主要内容,如果未能解决你的问题,请参考以下文章