計算兩張圖片相似度的方法總結
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
總結
如果不使用基於模式識別的方法,以上所述多種方法都可以大致比較兩張圖片的相似性。但是以上各方法的效果也很大程度上依賴於許多具體實現細節,由於沒有一個衡量尺度,所以很難比較各方法的優劣。
計算兩張圖片相似度的方法總結