摘要: 本文使用opencv。numpy等簡單的工具庫,根據mse及ssim兩種算法來評估兩張圖像的類似度,便於理解與實踐。
做爲人類,咱們一般很是善於發現圖像中的差別。例如,常見的遊戲——兩張圖像找不一樣。如今讓咱們玩下這個遊戲吧,首先讓咱們看看上面的圖像,三十秒內看看是否可以從中找出有什麼不一樣的地方。python
答案:水果、冰淇淋和飲料的顏色發生了明顯改變,窗簾、太陽也發生了改變,這是否是很簡單呢?若是有補充的答案,請在留言處給出哦!算法
這類問題對於人類來講看起來是一件垂手可得的事情,可是,對於計算機來講,這可不是一件容易的事兒。這是因爲計算機只能從咱們訓練它的模型中學習,才最終具備這類能力。目前有不少很好的模型能夠對批量圖像進行分類,好比TensorFlow和Keras等開源工具。less
藉助於這類開源工具庫,計算機視覺領域的研究得以高發展。如今咱們也能夠藉助於這類工具箱建立很是複雜的模型以及解決比較複雜的問題,例如kaggle:Animals-10,該數據集包含數十種不一樣類型動物的圖像以及非動物圖像。所要作的就是建立一個模型來預測圖片是哪一種類型的動物。機器學習
然而,上述任務較爲簡單,好比常見的手寫體數字識別MNIST等,通常也都能取得很高的精度。在這裏,我想增長一點難度,建立一個圖像分類器,以分辨出兩個圖像的類似程度。而且,不依賴任何複雜的工具庫,如TensorFlow、Keras等。本文采用傳統的機器學習方法,這裏從中選取兩種方法,用於查找圖像是否與另外一個圖像類似。這兩種方法分別爲均方偏差(MSE)、結構類似度指數(SSIM)。函數
上述公式看起來很是複雜,但不要懼怕。藉助於NumPy,能夠至關容易地計算出MSE;另外,因爲SSIM是Sci-Kit圖像庫的內置方法的一部分,所以也能夠很容易地計算出SSIM。工具
在進行編碼以前,這裏先對這兩種方法予以簡單的說明。MSE將計算正在比較的兩個圖像的每一個像素之間的均方偏差。而SSIM作的事情與MSE剛好相反,尋找像素值的類似之處。 也就是,若是兩個圖像中的像素排列類似或具備類似的像素密度值。MSE方法遇到的一個的問題是其結果每每具備任意大的值,所以很難給出標準的評判標準。通常而言,MSE越高,代表兩張圖像的類似程度越低。若是圖像之間的MSE值是隨機值,則很難說明兩者是否類似。另外一方面,SSIM將全部內容歸一化到-1~1
的範圍內(很可貴到小於0的分數)。得分爲1表示兩者很是類似,得分爲-1表示兩者很是不一樣。基於此,SSIM相較於MSE而言是一個更好的衡量指標。性能
如今使用代碼實現上述想法:學習
加載必要的庫:測試
本文使用常見的圖像處理工具箱OpenCV實現圖像的讀取和編輯。若是你對其它圖像處理工具箱熟悉,你也可使用本身熟悉的工具箱完成此類操做,好比matplotlibden。編碼
編寫MSE公式:
使用Numpy操做起來很簡單吧!
因爲SSIM已經經過skimage導入,所以無需進行手動編碼。如今建立一個比較函數,該函數的輸入爲兩個圖像,分別計算兩者的MSE和SSIM,並展現計算結果。
下面的三個步驟可使用for循環一次完成,可是爲了更容易地理解,這裏不使用for循環編寫代碼,將其分解爲三個部分:
首先,加載保存在目錄中的圖像。其次,必須確保它們的大小相同,不然會出現尺寸不匹配的錯誤。問題是對其進行尺寸變換操做會致使圖像失真,因此在找到比較合適的尺寸數字以前,能夠嘗試快速搜索方法,尺寸大小按照必定的規律設置,不斷實驗以找到最終比較合適的尺寸。接下來咱們再實現一個功能,以便於看到測試圖像是什麼樣子的。
如今經過比較兩個同樣的圖像來測試並查看MSE和SSIM是否正常工做。若是它有效,那麼咱們應該獲得MSE值爲0和SSIM值爲1的結果。
從中能夠看到,代碼正確,結果與猜測的一致!
如今計算機就能夠判斷比較的兩張圖像是否相同了。爲簡單起見,我將三張狗的圖像與本身以及三張貓的圖像進行比較。
下面看看兩種算法的性能比較。正如所看到的那樣,MSE的值變化很大,所以該值很難說明其表達的意思是什麼。但從SSIM的結果看出,能夠看到狗2和狗3相對於其餘狗的圖像最爲類似。從視覺上來說,我贊成這個結果,由於兩隻狗的耳朵很是像。但我還會認爲狗1和狗3會有更高的SSIM值,由於兩者的姿式也很類似。實際上,在圖像沒有進行灰度處理以前,狗2和狗3在鼻子區域周圍有相似的白色毛皮,而狗1沒有。這極可能是狗2和3具備比狗1更高的SSIM值的緣由。對於貓來講,這就有點困難。貓1和貓2具備類似的形狀,而且圖像是從類似的距離拍攝的,但貓2和貓3具備類似的皮毛顏色。
這裏我想進行的測試只有兩個:一個是狗和貓的類似性,第二個是每一個動物與原始源代碼附帶的門圖的類似性。
正如所預料的那樣,狗和貓是類似的,這點與與無生命的物體相比呈鮮明的對比,如侏羅紀公園入口門。狗和貓對門的圖像具備較高的SSIM值,惟一緣由在於圖像都通過了尺寸縮放和灰度處理。
在調整圖像大小和從新配置時,OpenCV並非最好的。通常而言,TensorFlow是最好的,TensorFlow也最適合批量圖像。
以後,我也將使用TensorFlow處理kaggle Animal-10數據集,來實現一個完整的圖像分類器。
本文爲雲棲社區原創內容,未經容許不得轉載。