2

我嘗試在兩幅灰度圖像上進行圖像配準,其中圖像是以不同視圖拍攝兩次圖像。這些照片是我自己使用Lifecam相機拍攝的。如何結合兩個相同的場景圖像進行圖像配準

爲了登記這些圖像,我使用了模板匹配法和歸一化互相關作爲相似性度量,找到了正確的位置。但是這兩幅圖像結合後的結果並不像我想的那樣好。我不知道如何解決它。在結合之前,我需要先做一些輪換或翻譯嗎?如果是這樣,我不知道如何獲得真正的旋轉角度。或者你有沒有任何想法如何修復圖像結果而不應用任何旋轉?

輸入圖像1:

input image 1

輸入圖像2:

input image 2

結果:

result

這是我的代碼:

A = imread('image1.jpg'); 
B = imread('image2.jpg'); 

[M1, N1] = size(A);  % size imej A n B 
[M2, N2] = size(B); 
%% finding coordinated of (r2,c2) 
r1 = size(A,1)/2;  % midpoint of image A as coordinate 
c1 = size(A,2 
template = imcrop(A,[(c1-20) (r1-20) 40 40]); 
[r2, c2] = normcorr(temp,B);  % Normalized cross correlation 

%% count distance of coordinate (r1,c1) in image A and (r2,c2)in image B 
UA = r1;   % distance of coordinate (r1,c1) from top in image A 
BA = M1 - r1;  % distance of coordinate (r1,c1) from bottom 
LA = c1;   % left distance from (r1,c1) 
RA = N1 - c1;  % right distance from (r1,c1) 

UB = r2;   % finding distance of coordinate (r2,c2) from top, 
BB = M2 - r2;  % bottom, left and right in image B 
LB = c2; 
RB = N2 - c2; 
%% zero padding for both image 
if LA > LB 
L_diff = LA - LB;   % value of columns need to pad with zero on left side   
B = [zeros(M2,L_diff),B]; 
else 
L_diff = LB - LA; 
A = [zeros(M1,L_diff),A]; 
end 
if RA > RB 
R_diff = RA - RB;   % value of columns need to pad with zero on right side 
B = [B, zeros(M2,R_diff)]; 
else 
R_diff = RB - RA; 
A = [A, zeros(M1,R_diff)]; 
end 
N1 = size(A, 2);     % renew value column image A and B  
N2 = size(B, 2); 
if UA > UB 
U_diff = UA - UB;     % value of rows need to pad with zero on top 
B = [zeros(U_diff,N2);B]; 
else 
U_diff = UB - UA; 
A = [zeros(U_diff,N1);A]; 
end 
if BA > BB 
B_diff = BA - BB;   % value of rows need to pad with zero on bottom 
B = [B; zeros(B_diff,N2)]; 
else 
B_diff = BB - BA; 
A = [A; zeros(B_diff,N1)]; 
end 
%% find coordinate that have double value 
if LA > LB 
r = r1; 
c = c1; 
else 
r = r2; 
c = c2; 
end 
if UA >= UB 
i_Start = r - UB + 1; 
else 
i_Start = r - UA + 1; 
end 
if BA >= BB 
i_Stop = r + BB ; 
else 
i_Stop = r + BA; 
end 
if LA >= LB 
j_Start = c - c2 + 1; 
else 
j_Start = c - c1 + 1; 
end 
if RA >= RB 
j_Stop = c + RB; 
else 
j_Stop = c + RA; 
end 
%% add image A and B 
A = im2double(A); 
B = im2double(B); 
final_im = A + B; 
for i = i_Start:i_Stop 
for j = j_Start:j_Stop 
    final_im(i,j) = final_im(i,j)/2; 
end 
end 

final_im = im2uint8(final_im); 
+0

你檢查了[this](https://stackoverflow.com/questions/29127181/matching-images-with-different-orientations-and-scales-in-matlab)? –

+0

我在matlab工具箱中沒有detectSURFFeatures函數。我使用版本2014b – badr

+0

嗯...以及請檢查[this](https://stackoverflow.com/questions/30677494/surface-feature-detection-on-image-processing/30678620#30678620)。 –

回答

0

從瑞安L'第一個鏈接rayryeng答案很適用在這裏。由於兩個圖像之間的變換比2D剛性變換更準確地描述爲homography,所以互相關可能不會在兩個圖像之間提供足夠接近的匹配。

準確的圖像配準要求您找到這個投影轉換。爲此,您可以在兩幅圖像中找到一組相應的點(使用SURF,如上所述,通常效果很好),然後使用RANSAC從相應點獲取單應性的參數。即使兩幅圖像中的某些「相應」特徵實際上不匹配,RANSAC也做得很好。一旦找到,您可以使用轉換將圖像中的一個移動到另一個的視角並融合。

Here's一個很好的解釋特徵匹配,RANSAC,並與一些Matlab代碼示例融合兩個圖像。該講座使用SIFT功能,但該想法仍然適用於SURF。