圖像匹配算法 MAD、SAD、SSD、MSD、NCC、SSDA、SATD,LBD算法

圖像匹配算法分爲3類:基於灰度的匹配算法、基於特徵的匹配算法、基於關係的匹配算法

(1)基於灰度的模板匹配算法:模板匹配(Blocking Matching)是根據已知模板圖像到另一幅圖像中尋找與模板圖像相似的子圖像。基於灰度的匹配算法也稱作相關匹配算法,用空間二維滑動模板進行匹配,不同匹配算法主要體現在相關準則的選擇方面,常見的基於模板的匹配算法可以參考下面的鏈接:

參考:http://blog.csdn.net/hujingshuang/article/details/47759579

(2)基於特徵的匹配算法:首先提取圖像的特徵,再生成特徵描述子,最後根據描述子的相似程度對兩幅圖像的特徵之間進行匹配。圖像的特徵主要可以分爲點、線(邊緣)、區域(面)等特徵,也可以分爲局部特徵和全局特徵。

區域(面)特徵提取比較麻煩,耗時,因此主要用點特徵和邊緣特徵。

點特徵包括:Harris 、Moravec、KLT、SIFT、SURF 、BRIEF、SUSAN、FAST、CENSUS、FREAK(點擊打開鏈接)、BRISK(點擊打開鏈接)、ORB、光流法(點擊打開鏈接)、A-KAZE等。

邊緣特徵包括:LoG算子、Robert算子、Sobel算子、Prewitt算子、Canny算子等。

 光流法:

(3)基於關係的匹配算法:建立語義的網絡,是人工智能領域在圖像處理中的應用,但還沒有突破性的進展。

 

立體匹配:左右相機的匹配,用基於灰度的模板匹配方法,對所有的像素點匹配。

跟蹤匹配:前後幀的匹配,用基於特徵的匹配算法,對特徵點進行匹配,然後根據幾個匹配的特徵點計算出相機的位姿.

基於灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法

簡介:

       本文主要介紹幾種基於灰度的圖像匹配算法:平均絕對差算法(MAD)、絕對誤差和算法(SAD)、誤差平方和算法(SSD)、平均誤差平方和算法(MSD)、歸一化積相關算法(NCC)、序貫相似性檢測算法(SSDA)、hadamard變換算法(SATD)。下面依次對其進行講解。

MAD算法

介紹

        平均絕對差算法(Mean Absolute Differences,簡稱MAD算法),它是Leese1971年提出的一種匹配算法。是模式識別中常用方法,該算法的思想簡單,具有較高的匹配精度,廣泛用於圖像匹配。

S(x,y)是大小爲mxn的搜索圖像,T(x,y)MxN的模板圖像,分別如下圖(a)(b)所示,我們的目的是:在(a)中找到與(b)匹配的區域(黃框所示)。

算法思路

        在搜索圖S中,以(i,j)爲左上角,取MxN大小的子圖,計算其與模板的相似度;遍歷整個搜索圖,在所有能夠取到的子圖中,找到與模板圖最相似的子圖作爲最終匹配結果。

        MAD算法的相似性測度公式如下。顯然,平均絕對差D(i,j)越小,表明越相似,故只需找到最小的D(i,j)即可確定能匹配的子圖位置:

其中:

算法評價:

優點:

思路簡單,容易理解(子圖與模板圖對應位置上,灰度值之差的絕對值總和,再求平均,實質:是計算的是子圖與模板圖的L1距離的平均值)。

運算過程簡單,匹配精度高。

缺點:

運算量偏大。

對噪聲非常敏感。

——————————————————————————————————————————————————————————————————————————————

SAD算法

介紹

        絕對誤差和算法(Sum of Absolute Differences,簡稱SAD算法)。實際上,SAD算法與MAD算法思想幾乎是完全一致,只是其相似度測量公式有一點改動(計算的是子圖與模板圖的L1距離),這裏不再贅述。

算法實現

由於文章所介紹的幾個算法非常相似,所以本文僅列出SAD算法的代碼,其餘算法的實現類似。看別人代碼都相對費力,想自己敲也很簡單。

MATLAB代碼

 

 
  1. %%
    
    %絕對誤差和算法(SAD)
    
    clear all;
    
    close all;
    
    %%
    
    src=imread('lena.jpg');
    
    [a b d]=size(src);
    
    if d==3
    
    src=rgb2gray(src);
    
    end
    
    mask=imread('lena_mask.jpg');
    
    [m n d]=size(mask);
    
    if d==3
    
    mask=rgb2gray(mask);
    
    end
    
    %%
    
    N=n;%模板尺寸,默認模板爲正方形
    
    M=a;%代搜索圖像尺寸,默認搜索圖像爲正方形
    
    %%
    
    dst=zeros(M-N,M-N);
    
    for i=1:M-N %子圖選取,每次滑動一個像素
    
    for j=1:M-N
    
    temp=src(i:i+N-1,j:j+N-1);%當前子圖
    
    dst(i,j)=dst(i,j)+sum(sum(abs(temp-mask)));
    
    end
    
    end
    
    abs_min=min(min(dst));
    
    [x,y]=find(dst==abs_min);
    
    figure;
    
    imshow(mask);title('模板');
    
    figure;
    
    imshow(src);
    
    hold on;
    
    rectangle('position',[y,x,N-1,N-1],'edgecolor','r');
    
    hold off;title('搜索圖');

     

 

輸出結果

——————————————————————————————————————————————————————————————————————————————

SSD算法

        誤差平方和算法(Sum of Squared Differences,簡稱SSD算法),也叫差方和算法。實際上,SSD算法與SAD算法如出一轍,只是其相似度測量公式有一點改動(計算的是子圖與模板圖的L2距離)。這裏不再贅述。

——————————————————————————————————————————————————————————————————————————————

MSD算法

        平均誤差平方和算法(Mean Square Differences,簡稱MSD算法),也稱均方差算法。實際上,MSD之餘SSD,等同於MAD之餘SAD(計算的是子圖與模板圖的L2距離的平均值),故此處不再贅述。

 

————————————————————————————————————————————————————————————————————————————————

NCC算法

        歸一化積相關算法(Normalized Cross Correlation,簡稱NCC算法),與上面算法相似,依然是利用子圖與模板圖的灰度,通過歸一化的相關性度量公式來計算二者之間的匹配程度。

其中,分別表示(i,j)處子圖、模板的平均灰度值。

————————————————————————————————————————————————————————————————————————

SSDA算法

        序貫相似性檢測算法(Sequential Similiarity Detection Algorithm,簡稱SSDA算法),它是由BarneaSliverman1972年,在文章《A class of algorithms for fast digital image registration》中提出的一種匹配算法,是對傳統模板匹配算法的改進,比MAD算法快幾十到幾百倍。

與上述算法假設相同:S(x,y)mxn的搜索圖,T(x,y)MxN的模板圖,是搜索圖中的一個子圖(左上角起始位置爲(i,j))。

顯然:

SSDA算法描述如下:

定義絕對誤差:

其中,帶有上劃線的分別表示子圖、模板的均值:

實際上,絕對誤差就是子圖與模板圖各自去掉其均值後,對應位置之差的絕對值。

設定閾值Th

在模板圖中隨機選取不重複的像素點,計算與當前子圖的絕對誤差,將誤差累加,當誤差累加值超過了Th時,記下累加次數H,所有子圖的累加次數H用一個表R(i,j)來表示。SSDA檢測定義爲:

下圖給出了A、B、C三點的誤差累計增長曲線,其中A、B兩點偏離模板,誤差增長得快;C點增長緩慢,說明很可能是匹配點(圖中Tk相當於上述的Th,即閾值;I(i,j)相當於上述R(i,j),即累加次數)。

在計算過程中,隨機點的累加誤差和超過了閾值(記錄累加次數H)後,則放棄當前子圖轉而對下一個子圖進行計算。遍歷完所有子圖後,選取最大R值所對應的(i,j)子圖作爲匹配圖像【若R存在多個最大值(一般不存在),則取累加誤差最小的作爲匹配圖像】。

        由於隨機點累加值超過閾值Th後便結束當前子圖的計算,所以不需要計算子圖所有像素,大大提高了算法速度;爲進一步提高速度,可以先進行粗配準,即:隔行、隔離的選取子圖,用上述算法進行粗糙的定位,然後再對定位到的子圖,用同樣的方法求其8個鄰域子圖的最大R值作爲最終配準圖像。這樣可以有效的減少子圖個數,減少計算量,提高計算速度。

——————————————————————————————————————————————————————————————————————

SATD算法

       hadamard變換算法(Sum of Absolute Transformed Difference,簡稱SATD算法),它是經hadamard變換再對絕對值求和算法。hadamard變換等價於把原圖像Q矩陣左右分別乘以一個hadamard變換矩陣H。其中,hardamard變換矩陣H的元素都是1-1,是一個正交矩陣,可以由MATLAB中的hadamard(n)函數生成,n代表n階方陣。

      SATD算法就是將模板與子圖做差後得到的矩陣Q,再對矩陣Q求其hadamard變換(左右同時乘以H,即HQH),對變換都得矩陣求其元素的絕對值之和即SATD值,作爲相似度的判別依據。對所有子圖都進行如上的變換後,找到SATD值最小的子圖,便是最佳匹配。

MATLAB實現:

  1. %//*****************************************
    
    %//Copyright (c) 2015 Jingshuang Hu
    
    
    %//@filename:demo.m
    
    %//@datetime:2015.08.20
    
    %//@author:HJS
    
    %//@e-mail:[email protected]
    
    %//@blog:http://blog.csdn.net/hujingshuang
    
    %//*****************************************
    
    %%
    
    %//SATD模板匹配算法-哈達姆變換(hadamard)
    
    clear all;
    
    close all;
    
    %%
    
    src=double(rgb2gray(imread('lena.jpg')));%//長寬相等的
    
    mask=double(rgb2gray(imread('lena_mask.jpg')));%//長寬相等的
    
    M=size(src,1);%//搜索圖大小
    
    N=size(mask,1);%//模板大小
    
    %%
    
    hdm_matrix=hadamard(N);%//hadamard變換矩陣
    
    hdm=zeros(M-N,M-N);%//保存SATD值
    
    for i=1:M-N
    
    for j=1:M-N
    
    temp=(src(i:i+N-1,j:j+N-1)-mask)/256;
    
    sw=(hdm_matrix*temp*hdm_matrix)/256;
    
    hdm(i,j)=sum(sum(abs(sw)));
    
    end
    
    end
    
    min_hdm=min(min(hdm));
    
    [x y]=find(hdm==min_hdm);
    
    figure;imshow(uint8(mask));
    
    title('模板');
    
    figure;imshow(uint8(src));hold on;
    
    rectangle('position',[y,x,N-1,N-1],'edgecolor','r');
    
    title('搜索結果');hold off;
    
    %//完

     

 

輸出結果:

—————————————————————————————————————————————————————————————————————

OK,介紹完畢,以上便是幾種常見的基於灰度的模板匹配算法。

參考文獻:

1、D.I BARNEA, H.F SILVERMAN, A class of algorithms for fast digital image registration[J], IEEE TRANSACTIONS ON COMPUTERS,1972.

2、趙啓, 圖像匹配算法研究[D], 2013.

3、丁慧珍, 抗任意角度旋轉灰度匹配方法研究[D], 2006.

4、陳皓, 馬彩文等, 基於灰度統計的快速模板匹配算法[J], 光子學報, 2009.

5、楊小岡等, 基於相似度比較的圖像灰度匹配算法研究[J], 系統工程與電子技術, 2005.

LBD算法 - Graph matching 圖匹配算法分析

概述


原文:《An efficient and robust line segment matching approach based on LBD descriptor and pairwise geometric consistency》

上一步我們進行了線特徵的提取和描述,接下來我們進行線特徵的匹配。在此之前我們先通過預處理將一些明顯無法匹配的特徵給消除,以降低圖匹配問題的維度。
該部分圖匹配算法分爲三步:

  1. 查找候選匹配對
  2. 構建關係圖
  3. 生成最終匹配結果

1. 查找候選匹配對


匹配的雙方,我們分別稱爲參考圖像和查詢圖像,檢測出雙方的LineVecs之後,我們要檢測他們的一元幾何屬性局部外觀相似度,若未通過測試,那麼認爲他們是不匹配的。這樣做可以大大減小圖優化匹配的問題維度,使得我們後期匹配的速度更快。

1.1.一元幾何屬性

線段的一元幾何屬性就是LineVecs的方向,在同一個LineVec中的線具有相同的方向,並且每一個LineVec擁有唯一的方向。但是兩張圖中的LineVecs的方向有可能是不可靠的,圖像有可能會有任意角度的旋轉,對於這點,我們利用圖像對之間存在的近似全局旋轉角,可以減少候選匹配對的數目。

構建旋轉

和其他文章中使用對應匹配來進行圖像旋轉不同,LBD的Matching中通過計算兩個圖像的LineVecs方向直方圖,得到規範化直方圖,h代表直方圖。我們改變的角度,通過公式尋找一個全局近似旋轉角

而全局旋轉變換不一定總是好的,所以我們也需要去檢查估計旋轉角是不是真的。實際上如果透視變換可以通過旋轉來近似,那麼直方圖之差比較小。這代表了在進行了旋轉之後,兩個圖像之間的相似程度。
這裏寫圖片描述
上圖就顯示出了兩張圖之間的直方圖差距,通過旋轉我們可以得出兩張圖之間相似度很高。上圖中的預估角度是0.349,偏移是0.243

但是如果圖像中提取的線重複度很低的話,這種直方圖方法就有可能提取出錯誤的旋轉角度。爲了解決這個問題,對於在方向直方圖上落入相同區間bins的線段,將他們的長度累積起來。那麼我們就可以得到一個長度向量,其第i個元素就是方向直方圖中第i個bin中的線段累計長度。

我們設定最小偏移直方圖小於閾值th,並且最小偏移長度向量距離小於閾值tl時,我們接受我們所估計的全局旋轉角。一旦全局旋轉角被接受,就會有一對LineVecs被匹配。但是如果這對LineVecs的方向角度和估計的全局旋轉角之差超過閾值,那麼我們認爲他們是不能夠匹配的。如果兩個圖片之間沒有可以接受的旋轉角度,那麼我們只測試他們的外觀相似性。

1.2. 局部外觀相似性

我們用直線描述符之間的距離(lost)來度量局部外觀相似度。
對於LineVec中的每個線段,我們都從提取出線的尺度層中生成一個LBD描述子向量V。當我們對一幅圖像中提取出來的兩組LineVec進行匹配,要去評估參考LineVec和測試LineVec中所有描述子之間的距離,並且用最小的描述子距離去測量LineVec外觀相似度s。如果 s > ts s大於局部外觀不相似容忍度,那麼相應兩個LineVecs將不會再進一步考慮。

在檢查了LineVecs的一元幾何屬性和局部外觀相似性之後,通過了這些測試的直線對被當做候選匹配。我們在上面的測試中,應當選取一組鬆散閾值,其中經驗值是 tθ=π/4 ts=0.35。候選匹配的數量比實際匹配的數量要大很多,因爲我們不能僅僅按照剛纔兩個屬性來確定最終的匹配結果,當然我們上面的工作也是大大減小了圖形匹配的問題維度的。

2. 構建關係圖

對於上面得到一組候選匹配項,我們要構建一個關係圖
其中關係圖裏的節點代表潛在的對應點
節點之間的連接的權重代表對應點之間的一致性

拿到了k對對應關係,我們用一個大小爲k*k的鄰接矩陣A來表示關係圖,其中第i行第j列的元素值是候選LineVec匹配對的一致性得分。其中分別是引用圖和查詢圖的LineVecs變量,上面的一致性得分是通過候選匹配對的成對幾何屬性外觀相似度計算的來的。

成對幾何屬性


我們選擇兩條線分別是,他們代表了這兩個LineVecs之間的最小描述子距離,並在原圖中定位他們的端點位置。然後我們用他們的交點比率,投影比率和相對角度來描述的幾何屬性,就如上圖所描述的那樣。其中的兩個值的計算方法如下:

Ij和Pj的值可以用相同的方法求解得到,相對角度可以直接用線方向求得。這三個量對平移旋轉縮放都是不變的。

外觀相似度

之前,我們使用LBD描述向量來表示線的局部外觀。
假設描述子與r圖(參考圖)和q圖(查詢圖)的LineVecs之間的最小距離是,同理對。我們可以得到兩組成對幾何屬性和局部外觀,分別是

計算一致性得分Aij:



其中是幾何相似性;是局部外觀相似性;是條件。最後一個代表所有在內的元素都不能大於1。
接下來我們設。計算完他們的一致性得分之後,我們便獲得了鄰接矩陣A。

3. 生成最終匹配結果

到這一步之後,匹配的問題最終就變成了,尋找匹配簇LM,該匹配簇可以最大化總的一致性分數,以至於可以滿足映射約束。我們使用一個指標向量來表示這個簇,否則爲0,因此這個問題被表示爲:

其中x受制於映射約束。一般來說用二次規劃來解決這個問題太耗費資源,我們採用譜圖技術,對x放款映射約束和積分約束,使得他的元素可以採集實際值在[0,1]區間裏。
通過Raleigh比率定理,可以最大化的x*是A的主特徵向量。它仍然是使用映射約束二值化特徵向量和獲得最優解的一個強大近似。

以下是算法細節:

  1. 通過EDLine算法從參考圖和查詢圖內提取LineVecs,以從兩幅圖中分別獲得兩組LineVecs
  2. 利用兩組LineVecs的方向直方圖估計圖像對的全局旋轉角
  3. 計算兩組LineVecs的LBD描述子
  4. 通過檢查描述子的一元幾何屬性和局部外觀,生成一組候選匹配對
  5. 根據候選匹配對中一致性分數,構建k*k大小的鄰接矩陣
  6. 通過使用ARPACK庫,得到鄰接矩陣A的主特徵向量x*
  7. 初始化匹配結果
  8. 查找,如果x*(a)=0,那麼停止查找返回匹配結果LM,否則設且x*(a)=0。
  9. 檢查CM中所有的候選者,如果衝突,那麼設
  10. 如果CM是空的,那麼返回LM,否則返回到步驟8。

最後一行的線段匹配可以從LineVecs LM的匹配結果直接檢索。注意,在LineVec的線位於圖像的同一區域,並且具有同一方向,因此,每對linevec的匹配,線段匹配有一對就足夠檢索了。

參考文檔:
http://www.cnblogs.com/Jessica-jie/p/7545554.html

代碼:
https://github.com/chishuideyu/LBD_and_LineMatching

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