Нулевое заполнение Фурье изображения - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь решить вопрос, учитывая изображение f (x, y) размера N, M с преобразованием Фурье F. Мы определяем функцию g, которую ее преобразование Фурье G определяет следующим образом:

G (x, y) = F (x, y), если x

, что означает, что мы дополняем изображение нулями.Я попытался проверить это, используя matlab с этим кодом:

i1 = imread('1.bmp');
i1 = im2double(i1);
k=fft2(i1);
newmat = padarray(k,[84,84],0,'post');
mat2=ifft2(newmat);
imshow(mat2);

. По какой-то причине я получаю сложную матрицу, о которой я не могу сказать что-то интересное, о чем я скучаю?(просто чтобы уточнить, изображение, которое я пробовал, имеет размер 84x84).

Спасибо!

1 Ответ

0 голосов
/ 30 сентября 2018

Вы Заполнение должно добавлять высокие частоты, а это не то, что вы делаете.Для 1D БПФ F, F(2) и F(end) соответствуют одной и той же частоте - в 2D это абсолютно одинаково для каждой линии изображения вдоль каждого размера изображения.Заполняя нули, расширяя массив, вы создаете новый F(end).Это значение больше не соответствует значению в F(2).Чтобы обратное преобразование было действительным, эти два значения должны быть комплексными сопряженными друг с другом.

Решение состоит в том, чтобы добавить заполнение в middle массива, где самое высокоечастоты есть.Самый простой способ сделать это - сначала использовать fftshift, чтобы переместить нулевую частоту в центр массива, затем заполнить все вокруг массива, а затем вернуться назад:

k = fft2(i1);
k = fftshift(k);
k = padarray(k,[84,84]/2,'both');
k = ifftshift(k);
mat2 = ifft2(k);

Таким образом, вы сохранитесопряженная симметрия, ожидаемая от преобразования Фурье вещественного изображения.


Похоже, что OP сбит с толку из-за того, что происходит при заполнении нулями в разных частях спектра Фурье.Вот небольшой эксперимент:

% Create a test image, a simple Gaussian, purely real-valued
x = linspace(-3,3,84);
img = exp(-0.5*x.^2);
img = img.' * img;
imshow(img)

input image

% OP's method
k = fft2(img);
k = padarray(k,[84,84],0,'post');
k = complex(k); % This line does nothing
out = ifft2(k) * 4;
subplot(1,2,1); imshow(real(out)); title('real part')
subplot(1,2,2); imshow(imag(out)); title('imaginary part')

output

% Correct method
k = fft2(img);
k = fftshift(k);
k = padarray(k,[84,84]/2,'both');
k = ifftshift(k);
out = ifft2(k) * 4;
subplot(1,2,1); imshow(real(out)); title('real part')
subplot(1,2,2); imshow(imag(out)); title('imaginary part')

output

Как видите, при заполнении 'post' вы вводите асимметрию в области Фурье, которая переводит в нереальное изображение в пространственной области.Напротив, заполнение, как я указывал в этом ответе, приводит к сохранению сопряженной симметрии и, следовательно, к реальному значению (мнимая часть вся черная).

(извините за все пустое пространство вокруг изображений)

...