Как объединить два одинаковых изображения сцены для регистрации изображений

Я пытаюсь сделать регистрацию изображения на двух изображениях в градациях серого, где изображения были сделаны дважды с разными видами. Изображения были сделаны мной, используя камеру Lifecam.

Чтобы зарегистрировать эти изображения, я использовал метод сопоставления с шаблоном и нормализованную взаимную корреляцию в качестве меры сходства и нашел правильное местоположение. Но результат после объединения этих двух изображений был не очень хорошим, как мне хотелось. Я не знаю, как это исправить. Нужно ли сначала сделать ротацию или перевод, прежде чем объединить это? Если это так, я понятия не имею, как получить реальный угол поворота. Или у вас есть идея, как исправить результат изображения без применения поворота?

Входное изображение 1:

входное изображение 1

Входное изображение 2:

входное изображение 2

Результат:

результат

Это мой код:

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);

2 ответа

Ответ от Rayryeng в первой ссылке Райана Л. здесь вполне применим. Вероятно, взаимная корреляция не обеспечит достаточно близкого соответствия между двумя изображениями, поскольку преобразование между двумя изображениями более точно описывается как гомография, чем жесткое двумерное преобразование.

Точная регистрация изображений требует, чтобы вы нашли это проективное преобразование. Для этого вы можете найти набор соответствующих точек на двух изображениях (как правило, с помощью SURF, как упоминалось выше, обычно хорошо работает), а затем использовать RANSAC для получения параметров гомографии из соответствующих точек. RANSAC делает хорошую работу, даже если некоторые из "соответствующих" функций на ваших двух изображениях на самом деле не соответствуют друг другу. Найдя, вы можете использовать преобразование, чтобы переместить одно из ваших изображений в точку зрения другого и слиться.

Вот хорошее объяснение соответствия функций, RANSAC и объединения двух изображений с некоторыми примерами кода Matlab. В лекции используются функции SIFT, но идея все еще работает для SURF.

Лучший опубликованный способ выполнить такую ​​регистрацию основан на проверочных точках. Вы можете выбрать наиболее четкие ребра или точки пересечения в качестве опорных точек, а затем настроить параметры гладкости и регуляризации, чтобы зарегистрировать их вместе. посмотрите на пакет SlicerRT. и дайте мне знать, если у вас возникнут проблемы.

Другие вопросы по тегам