Я пытаюсь реализовать этот алгоритм регистрации изображений в 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.