使用Opencv构建一个简单的图像相似检测器(MSE、SSIM)
介紹
? ? ? ?作為人類,我們通常非常善于發現圖像中的差異。例如,常見的游戲——兩張圖像找不同。現在讓我們玩下這個游戲吧,首先讓我們看看上面的圖像,三十秒內看看是否能夠從中找出有什么不同的地方。
? ? ? ?答案:水果、冰淇淋和飲料的顏色發生了明顯改變,窗簾、太陽也發生了改變,這是不是很簡單呢?如果有補充的答案,請在留言處給出哦!
? ? ? ?這類問題對于人類來說看起來是一件輕而易舉的事情,但是,對于計算機來說,這可不是一件容易的事兒。這是由于計算機只能從我們訓練它的模型中學習,才最終具有這類能力。目前有很多很好的模型可以對批量圖像進行分類,比如TensorFlow和Keras等開源工具。
? ? ? ?借助于這類開源工具庫,計算機視覺領域的研究得以高發展。現在我們也可以借助于這類工具箱創建非常復雜的模型以及解決比較復雜的問題,例如kaggle:Animals-10,該數據集包含數十種不同類型動物的圖像以及非動物圖像。所要做的就是創建一個模型來預測圖片是哪種類型的動物。
MSE和SSIM
? ? ? ?然而,上述任務較為簡單,比如常見的手寫體數字識別MNIST等,一般也都能取得很高的精度。在這里,我想增加一點難度,創建一個圖像分類器,以分辨出兩個圖像的相似程度。并且,不依賴任何復雜的工具庫,如TensorFlow、Keras等。本文采用傳統的機器學習方法,這里從中選取兩種方法,用于查找圖像是否與另一個圖像相似。這兩種方法分別為均方誤差(MSE)、結構相似度指數(SSIM)。
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數據集,來實現一個完整的圖像分類器。
作者信息
Iftekher Mamun, 機器學習
本文由阿里云云棲社區組織翻譯。
文章原標題《Image Classification using SSIM
Simple Image Classifier with OpenCV》,譯者:海棠,審校:Uncle_LLD。
文章簡譯,更為詳細的內容,請查看原文。
總結
以上是生活随笔為你收集整理的使用Opencv构建一个简单的图像相似检测器(MSE、SSIM)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELK logstash 配置自定义字段
- 下一篇: 小猴子吃桃子