基於SIFT點特征匹配的圖像配准MATLAB程序
這是本小白第一次寫博客,本來想着寫起來應該很快,因為自己的思路很清晰。直到動手寫,才知道任何事都是看着簡單做起來難,希望以后有機會自己能多多寫點東西,提高自己的書面表達能力。
不當之處,請留言批評指正!
圖像配准可定義為求取兩幅相鄰圖像之間的空間變換和灰度變換的過程。對於給定的兩幅圖像 I1(x,y)和I2(x,y),若I1(x,y)為基准圖像,另一幅I2(x,y)為待配准圖像,則圖像變換公式為
I2(x,y)=g(I1(f(x,y)))
式中,f為二維空間坐標變換;g為一維灰度變換。
簡單來說,圖像配准就是把兩幅圖像上的點轉換到同一個坐標系下。
圖像配准基本步驟
同樣,基於SIFT點特征的圖像配准過程也包括特征提取、特征描述、特征匹配、求解變換模型參數以及圖像變換配准。
下面主要通過具體的例子來講解基於SIFT點特征的圖像配准,整個流程都用MATLAB代碼實現了,其中基准圖如下左圖,待配准圖為右圖。
一、SIFT特征提取、特征描述
SIFT特征提取、特征描述的MATLAB實現函數可以直接使用Lowe所給的siftDemoV4例子中的sift實現。% sift特征提取
[des1, loc1]=sift(gray1);
[des2, loc2] = sift(gray2);
其中,des為128維的描述子,loc為特征點的位置坐標,gray為輸入的灰度圖像。
二、SIFT特征粗匹配
SIFT粗匹配是通過歐氏距離測度來定義的,Lowe通過比較最近鄰歐氏距離與次近鄰歐氏距離的比值來進行匹配,當最近鄰歐氏距離與次近鄰歐氏距離的比值小於某個閾值時為匹配點,閾值一般取0.8。
SIFT粗匹配簡單代碼如下:distRatio =0.8;
for i = 1 : size(des1,1)
dotprods = des1(i,:) * des2t; % Computes vector of dot products
[vals,indx] = sort(acos(dotprods)); % Take inverse cosine and sort results
% Check if nearest neighbor has angle less than distRatio times 2nd.
if (vals(1) < distRatio * vals(2))
match(i) = indx(1);
else
match(i) = 0;
end
end
粗匹配結果如下圖
很明顯,這些匹配點中,存在許多誤匹配點。
三、RANSAC精匹配以及變換模型參數估計
由於簡單基於歐氏距離測度的SIFT特征匹配中存在許多誤匹配的點,這些誤匹配點將嚴重影響后面變換模型參數的解算,因此需要利用魯棒估計的方法將這些誤匹配的點剔除,在這里魯棒估計我們使用最常規的RANSAC方法。
RANSAC(RANdom SAmple Consensus)隨機抽樣一致性是由Fischler於1981年引入的魯棒方法,常用於大量點集處理,該方法的主要原理可以閱讀pi9nc的這篇博客。
matlabR2013a版本以后,RANSAC精匹配以及變換模型參數估計可以由函數estimateGeometricTransform同時實現。[T,inlierloc2_m,inlierloc1_m] = estimateGeometricTransform(loc2_m,loc1_m,'affine');
其中,輸入值loc2_m為待配准圖像粗匹配點坐標,loc1_m為基准圖像粗匹配點坐標,’affine’為變換模型,圖像配准一般選擇仿射模型即可,當然這個函數也可以使用其它模型,具體參數輸入可以使用MATLAB自帶幫助文檔;輸出值T為變換模型參數矩陣,inlierloc2_m為待配准圖像經過RANSAC以后精匹配點坐標,inlierloc1_m為基准圖像精匹配點坐標。
精匹配結果如下圖
四、圖像變換
在獲取圖像變換參數矩陣之后,利用該仿射變換參數以及圖像插值,便可以將待配准圖像轉化到基准圖像的坐標系下。
最后將待配准圖像配准后與基准圖進行拼接,拼接圖如下:
由上圖可以看出配准的效果還不錯,從載入圖像到最后的圖像拼接在DELL7559筆記本上總共運行28s(圖像大小600*600),計算效率還能加以改進。
基於SIFT點特征的圖像配准MATLAB完整code可以在此下載,在MATLAB R2013a版本以上可行。