Как получить угол поворота и коэффициент масштабирования путем взаимной корреляции двух матриц -MATLAB- (лог-полярные координаты) - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь реализовать этот алгоритм регистрации изображений в Matlab: Регистрация изображений на основе БПФ с использованием Corner Response, у меня есть некоторые вопросы о том, как получить правильный угол поворота.

Вот алгоритм, который я пытаюсьреализовать:

1) Угловой отклик исходного и целевого изображений определяется, а затем дополняется нулями, так что размер изображения будет равен ? × ?, где ? = 2, так что ? ≥ ​​max (???? (??????),???? (??????)).

2) Вычислить прямое быстрое преобразование Фурье по угловому отклику исходного и целевого изображения и получить величину быстрого преобразования Фурье.

3) Фильтр верхних частот умножаетсяс изображением величины быстрого преобразования Фурье.

4) Спектр амплитуд Фурье в декартовых координатах сопоставляется с полярными координатами.

ЗДЕСЬ МОЙПРОБЛЕМА 5) Метод фазовой корреляции применяетсяЛогополярные спектры обоих изображений для определения масштабного коэффициента и угла поворота.

6) Вычисленные масштабный коэффициент и угол поворота применяются к целевому изображению, и снова выполняется фазовая корреляция для обнаруженияперевод

Я реализовал 4 первых шага алгоритма, и проблема, с которой я столкнулся, находится на 5 шаге.

Я использовал xcorr2 () для взаимной корреляции двух матриц, затем нашел максимальное значение, и это значение будет моим углом поворота, но я не получил правильный угол поворота, и я думаю, что еще одна вещьэто связано с тем, что тип данных сложный двойной вместо двойного (функция fft () возвращает комплексный двойной)

%LOAD images
ref = imread('reference_image.jpg');
rec = imread('image_to_be_registred.jpg');

%Cast the images to double
i1 = double(ref);    
i2 = double(rec);

%Zero Pad the source image     
i2 = padarray(i2,[1 1],0,'both');

%Apply Fast Fourrier Transform to both of the two images    
i1 = fft(i1);    
i2 = fft(i2);

%Apply High pass filter to the two images    
i1 = HighPassFilter(i1);    
i2 = HighPassFilter(i2);    

%Calculate polar-coordinates of the two images    
polar_i1 = calculate_polar_coord(i1);    
polar_i2 = calculate_polar_coord(i2);

%Cross-correlate the two matrices     
theta_correlation = xcorr2(polar_i1(:,:,1),polar_i2(:,:,1));

%Get the max value of the cross-correlation result    
max_theta = max(max(angle(theta_correlation)));

%Rotate the image to image to be registred using the max value    
img_rotated = imrotate(rec, max_theta*180);

%Show the rotated image
imshow(img_rotated);

Ожидаемый угол близок к 3,8, но полученное значение0,3681.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...