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拼接結果')