Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > fft и регистрация изображения через оптимизацию.


Автор: mrgloom 12.10.2012, 14:49
пытаюсь сделать регистрацию изображения через фазовую корреляцию, для этого задаю параметры перспективного преобразования и загоняю это всё в минимизатор. 

почему то не работает, когда пытаюсь исказить изображение и сравнить с не искажённым, чтобы проверить точность. 

ниже код на матлабе с комментариями.

main.m 

Цитата

global model; 
global scene; 

%загружаем изображения 
scene = imread('001_001.tif'); 
%тестовое искажение формат m11 m12 m21 m22 m31 m32 потом добавим не изменяемые m13=0 m23=0 m33=1 
H= [0.95 -0.05 0.0000 1.0000 -0.0000 -0.0000];% протестируем с известным искажением это позволит определить точность 
model=warp_im(scene,H); 

%m11 m12 m21 m22 m31 m32 
init_sol= [1 0 0 1 0 0]; %начальное приближение и есть само изображение 

%надо еще подумать над настройкой парамтеров 
opts= optimset('Algorithm','interior-point','MaxFunEvals',5000,'MaxIter',5000,'TolFun',1e-6,'TolX',1e-10); 

problem= createOptimProblem('fmincon','objective','compute_NCC','x0',init_sol,'options',opts); 

gs= GlobalSearch; 
[x,f]= run(gs,problem) 
param=x;




compute_NCC.m 

Цитата

function peak = compute_NCC(param) 

global scene; 
global model; 

img= warp_im(model,param); 

%возвращает изображения дополненные нулями 
sz1= size(scene); % y x размеры 
sz2= size(img); 
sz= abs(sz2-sz1); 
pad_im1=scene;pad_im2=img; 
if(sz1(1)>sz2(1))%y 
pad_im2= padarray(img,[sz(1),0],'post'); 
else 
pad_im1= padarray(scene,[sz(1),0],'post'); 
end; 
if(sz1(2)>sz2(2))%x 
pad_im2= padarray(pad_im2,[0,sz(2)],'post'); 
else 
pad_im1= padarray(pad_im1,[0,sz(2)],'post'); 
end; 

FFT1 = fftshift(fft2(pad_im1)); 
FFT2 = fftshift(fft2(pad_im2)); 

FFT = FFT1.*conj(FFT2); 
FFT = FFT./abs(FFT); 

mag = (ifft2(FFT)); 

peak= -abs(max(max(mag))) % минус потому что минимизируем



warp_im.m 

Цитата

function out = warp_im(img,param) 
%преобразуем к матрице гомографии 3х3 добавляя неизменяемые элементы 
param=[param(1:2),0,param(3:4),0,param(5:6),1] 
H=reshape(param,3,3)' 

tform = maketform('projective',H'); 
out= imtransform(img,tform);

Автор: maxdiver 12.10.2012, 15:00
При дополнении нулями X с Y не перепутаны? (матлаб не знаю, поэтому могу только предполагать)

Автор: mrgloom 12.10.2012, 15:28
Цитата

При дополнении нулями X с Y не перепутаны?

вроде нет.

минимизатор выдает [1 0 0 1 0 0] - что соответствует исходному не искажённому изображению.
возможно дело именно в нём.

Автор: mrgloom 15.10.2012, 11:59

на самом деле хотелось бы даже понять, прав ли я хотя бы концептуально.
а то может быть такую cost function "метрику" как пик корреляции по каким либо причинам и нельзя использовать?
или проблема может быть в том, что пики сравнимы только между двумя изображениями, вот между двумя разными парами нет?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)