基於harris角點和RANSAC演算法的影像拼接matlab模擬

简简单单做算法發表於2024-05-09

1.演算法執行效果圖預覽

2.演算法執行軟體版本

MATLAB2022a

3.演算法理論概述

Harris角點檢測是一種區域性特徵檢測方法,它尋找影像中具有顯著區域性曲率變化的位置,即邊緣轉折點或角點。主要透過計算影像視窗內的自相關矩陣M,並對其特徵值進行評估。Harris響應函式H由自相關矩陣M的兩個主特徵值 λ1​ 和λ2​ 計算得到:

當H值較大時,視窗內畫素的變化足夠大,表明可能存在角點。

在影像拼接過程中,RANSAC用於在兩幅影像的重疊區域找到正確的對應點對,即使資料中存在大量噪聲和異常點。

1.隨機選擇一組候選點對作為基礎模型(通常是仿射或透視變換模型),計算此模型引數。

2.應用模型引數A預測所有剩餘點對是否符合模型,統計一致樣本數。

3.重複步驟1和2一定次數(迭代次數T),選取一致樣本數最多的模型作為最優模型。

4.設定閾值(如變換殘差閾值t),確定最終的內點集合(即那些變換誤差小於閾值的所有點對)。

5.使用內點集合重新估計變換引數,以提高精度。

綜上所述,影像拼接流程:

在每幅影像中檢測Harris角點,並提取特徵描述符。

利用匹配演算法(如SIFT、SURF等)在重疊區域找到對應的角點對。

應用RANSAC演算法找出最優變換模型。

根據最優變換模型對一幅影像進行幾何校正,使兩幅影像的重疊部分對齊。

最後,對齊後的影像透過融合演算法(如加權平均、高斯金字塔融合等)拼接成全景影像。

4.部分核心程式

I1_harris   = func_harris(img1,3,para_harris,scales);% 使用自定義函式計算 img1 的角點響應
I2_harris   = func_harris(img2,3,para_harris,scales);% 使用自定義函式計算 img2 的角點響應
.........................................................................
% RANSAC 方法引數設定
% RANSAC 迭代次數
Miter = 500;
% 內點距離閾值
lvls  = 0.003;
% 最小內點數量要求
nums  = 10;
% RANSAC
[ransac_points,~]=func_ransac(harris_p1,harris_p2,mpoint,Miter,lvls,nums);
 
% 儲存 RANSAC 匹配得到的正確匹配點座標
Lens         =length(ransac_points);
X1_r=zeros(1,Lens);
Y1_r=zeros(1,Lens);
X2_r=zeros(1,Lens);
Y2_r=zeros(1,Lens);
 
for i=1:Lens
    p1=ransac_points(i,1);
    p2=ransac_points(i,2);
    X1_r(i)=x1(p1);
    Y1_r(i)=y1(p1);
    X2_r(i)=x2(p2);
    Y2_r(i)=y2(p2);
end
 
figure
subplot(1,2,1);
imshow(img1);
title('RANSAC匹配點')
hold on;
plot(Y1_r,X1_r,'ro');
 
subplot(1,2,2);
imshow(img2);
title('RANSAC匹配點')
hold on;
plot(Y2_r,X2_r,'go');
% 合成一幅影像展示 RANSAC 匹配結果
figure
img_match=[img1,img2];
imshow(img_match);
title('匹配結果')
hold on;
plot(Y1_r,X1_r,'rx','LineWidth',1,'MarkerSize',8);
plot(Y2_r+size(img1,2),X2_r,'gx','LineWidth',1,'MarkerSize',8);
 
Xm1_ransac=X1_r; 
Ym1_ransac=Y1_r;
match1=zeros(Lens,2);
match1(:,1)=Xm1_ransac; 
match1(:,2)=Ym1_ransac;
 
Xm2_ransac=X2_r;
Ym2_ransac=Y2_r+size(img1,2);
match2=zeros(Lens,2);
match2(:,1)=Xm2_ransac; 
match2(:,2)=Ym2_ransac;
% 繪製匹配線段連線匹配點
for i=1:Lens
    hold on;
    plot([match1(i,2) match2(i,2)], [match1(i,1) match2(i,1)],'LineWidth',1)
end
% 計算 RANSAC 方法得到的仿射變換矩陣
H_ransac = func_affine(X2_r,Y2_r,X1_r,Y1_r);
 
 
%生成一張新的全景圖
[I1_ransac,I2_ransac]=func_trans(img1,img2,H_ransac);
 
 
 
figure
I_ransac= I1_ransac+I2_ransac ;
imshow(I_ransac);
title('RANSAC拼接結果')

  

相關文章