圖像相似度計算

http://blog.csdn.net/sarah_tang/article/details/39894863

圖像相似度計算主要用於對於兩幅圖像之間內容的相似程度進行打分,根據分數的高低來判斷圖像內容的相近程度。

 

   可以用於計算機視覺中的檢測跟蹤中目標位置的獲取,根據已有模板在圖像中找到一個與之最接近的區域。然後一直跟着。已有的一些算法比如BlobTracking,Meanshift,Camshift,粒子濾波等等也都是需要這方面的理論去支撐。

 

  還有一方面就是基於圖像內容的圖像檢索,也就是通常說的以圖檢圖。比如給你某一個人在海量的圖像數據庫中羅列出與之最匹配的一些圖像,當然這項技術可能也會這樣做,將圖像抽象爲幾個特徵值,比如Trace變換,圖像哈希或者Sift特徵向量等等,來根據數據庫中存得這些特徵匹配再返回相應的圖像來提高效率。

 

  下面就一些自己看到過的算法進行一些算法原理和效果上的介紹。

 

   (1)直方圖匹配。

 

      比如有圖像A和圖像B,分別計算兩幅圖像的直方圖,HistA,HistB,然後計算兩個直方圖的歸一化相關係數(巴氏距離,直方圖相交距離)等等。

 

      這種思想是基於簡單的數學上的向量之間的差異來進行圖像相似程度的度量,這種方法是目前用的比較多的一種方法,第一,直方圖能夠很好的歸一化,比如通常的256個bin條的。那麼兩幅分辨率不同的圖像可以直接通過計算直方圖來計算相似度很方便。而且計算量比較小。

 

      這種方法的缺點:

 

         1、直方圖反映的是圖像像素灰度值的概率分佈,比如灰度值爲200的像素有多少個,但是對於這些像素原來的位置在直方圖中並沒有體現,所以圖像的骨架,也就是圖像內部到底存在什麼樣的物體,形狀是什麼,每一塊的灰度分佈式什麼樣的這些在直方圖信息中是被省略掉得。那麼造成的一個問題就是,比如一個上黑下白的圖像和上白下黑的圖像其直方圖分佈是一模一樣的,其相似度爲100%。

 

         2、兩幅圖像之間的距離度量,採用的是巴氏距離或者歸一化相關係數,這種用分析數學向量的方法去分析圖像本身就是一個很不好的辦法。

 

         3、就信息量的道理來說,採用一個數值來判斷兩幅圖像的相似程度本身就是一個信息壓縮的過程,那麼兩個256個元素的向量(假定直方圖有256個bin條)的距離用一個數值表示那麼肯定就會存在不準確性。

 

   下面是一個基於直方圖距離的圖像相似度計算的Matlab Demo和實驗結果.

%計算圖像直方圖距離
%巴氏係數計算法

M=imread('1.jpg');
N=imread('2.jpg');
I=rgb2gray(M);
J=rgb2gray(N);

[Count1,x]=imhist(I);
[Count2,x]=imhist(J);
Sum1=sum(Count1);Sum2=sum(Count2);
Sumup = sqrt(Count1.*Count2);
SumDown = sqrt(Sum1*Sum2);
Sumup = sum(Sumup);
figure(1);
subplot(2,2,1);imshow(I);
subplot(2,2,2);imshow(J);
subplot(2,2,3);imhist(I);
subplot(2,2,4);imhist(J);
HistDist=1-sqrt(1-Sumup/SumDown)

 

圖像相似度計算

 

  

 

   通過上圖可以看到這種計算圖像相似度的方法確實存在很大的弊端。然而很多人也對於這種方法進行了修改,比如FragTrack算法,具體可以參見這篇論文《》。其中對圖像分成橫縱的小塊,然後對於每一個分塊搜索與之最匹配的直方圖。來計算兩幅圖像的相似度,融入了直方圖對應位置的信息。但是計算效率上很慢。

  還有一種是計算一個圖像外包多邊形,一般得到跟蹤圖像的前景圖後計算其外包多邊形,根據外包多邊形做Delauny三角形分解,然後計算每個三角形內部的直方圖,對於這兩個直方圖組進行相似距離計算。這樣就融入了直方圖的位置信息。

 (2)數學上的矩陣分解

   圖像本身就是一個矩陣,可以依靠數學上矩陣分解的一些知識來獲取矩陣中一些代表這個矩陣元素值和分佈的一些魯棒性特徵來對圖像的相似度進行計算。

    最常用的一般是SVD分解和NMF分解。

   下面簡單介紹下SVD分解的一些性質,如果需要探究的更深入一點網上有一些相關文獻,讀者可以去探究的更清楚:

 <1> 奇異值的穩定性

 <2> 奇異值的比例不變性

 <3> 奇異值的旋轉不變性

 <4> 奇異值的壓縮性        

    綜上所述,可以看出奇異值分解是基於整體的表示。圖像奇異值特徵向量不但具有正交變換、旋轉、位移、鏡像映射等代數和幾何上的不變性,而且具有良好的穩定性和抗噪性,廣泛應用於模式識別與圖像分析中。對圖像進行奇異值分解的目的是:得到唯一、穩定的特徵描述;降低特徵空間的維數;提高抵抗干擾和噪聲的能力。但是由於奇異值分解得到的奇異矢量中有負數存在所以不能很好的解釋其物理意義。

  非負矩陣分解(NMF):

    NMF的主要思想是將非負矩陣分解爲可以體現圖像主要信息的基矩陣與係數矩陣,並且可以對基矩陣賦予很好的解釋,比如對人臉的分割,得到的基向量正是人的“眼睛”,“鼻子”等主要概念特徵,源圖像表示爲這些特徵的加權組合。所以NMF算法也在人臉識別等場合中發揮着巨大的作用。

   下面一個實驗說明了SVD+NMF數學上的這些分解在圖像相似度判定方面的應用,這個跟我目前的課題有關細節方面就不再透露更多了。

圖像相似度計算

圖像相似度計算

圖像相似度計算

當然基於數學上的矩陣特徵值計算的還有很多方法比如Trace變換,不變矩計算等等,當然如果有需要這方面資料的同學可以找我,我可以進行相關的幫助。

(3)基於特徵點的圖像相似度計算

    每一幅圖像都有自己的特徵點,這些特徵點表徵圖像中比較重要的一些位置,比較類似函數的拐點那種,通常比較常用的有Harris角點和Sift特徵點。那麼將得到的圖像角點進行比較,如果相似的角點數目較多,那麼可以認爲這兩幅圖像的相似程度較高。這裏主要介紹基於Sift算子。

   對於Sift的原理和代碼可以參見David Lower的網站。

David G Lowe Sift網站

   那麼我們就可以通過找到匹配點的個數來判斷兩幅圖像是否一致,這個算法的好處是對於一個物體,兩個不同角度下得到的照片依然可以找到很多的匹配點,我也一直認爲是一個綜合來說結果相對較爲準確的方法,但是由於每個特徵點需要計算一個長度不小的特徵值,也造成了該算法的時間消耗比較大。所以不常用於實時的視頻處理。這個算法還有一個好處就是可以通過找到的匹配特徵點進行圖像校正。關於使用Sift做圖像校正請參見我的另外一篇博文。

   圖像相似度計算

圖像相似度計算

我當時對於比如左邊圖像,找到50個特徵點,如果其中有60%以上的與右邊的匹配上了,認爲兩幅圖像是相似圖像。

圖像相似度計算

上圖使用Sift找到的匹配對應點,然後通過仿射變換的6維參數計算,然後逆變換得到校正後的圖像,效果蠻不錯的,可見Sift對於抗旋轉和噪聲的效果確實很好。

對於Sift也不能全部相信,一般使用RANSAC對於錯誤匹配點去除可以達到更好的效果,當然目前也有很多對SIFT進行改進的算法。希望有這方面研究的可以多多交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章