пытаюсь сделать регистрацию изображения через фазовую корреляцию, для этого задаю параметры перспективного преобразования и загоняю это всё в минимизатор.
почему то не работает, когда пытаюсь исказить изображение и сравнить с не искажённым, чтобы проверить точность.
минимизатор выдает [1 0 0 1 0 0] - что соответствует исходному не искажённому изображению.
возможно дело именно в нём.
ниже код на матлабе с комментариями.
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);