Двумерное дискретное преобразование Фурье и обратное ДПФ в Matlab

В настоящее время я реализую 2D DFT и IDFT для изображений в Matlab без использования встроенной библиотеки. Я успешно вывожу изображение спектра после DFT, но не могу вернуть исходное изображение после IDFT. Вот мой код для ДПФ

input = im2double(img_input);
[M, N] = size(input);
Wm = zeros(M, M);
Wn = zeros(N, N);

for x = 1:M-1
    for y = 1:N-1
        input(x, y) = input(x, y) * (-1)^(x + y);
    end
end

for u = 0:M-1
    for x = 0:M-1
        Wm(u+1, x+1) = exp(-li * pi * 2 * u * x/ M);
    end    
end

for v = 0:N-1
    for y = 0:N-1
        Wn(v+1, y+1) = exp(-li * pi * 2 * v * y / N);
    end    
end
F = Wm * input * Wn / 200;
output = im2uint8(log(1 + abs(F)));

IDFT:

[M, N] = size(input);
Wm = zeros(M, M);
Wn = zeros(N, N);

for x = 0:M-1
    for u = 0:M-1
        Wm(x+1, u+1) = exp(2 * pi * 1i * u * x/ M);
    end    
end

for y = 0:N-1
    for v = 0:N-1
        Wn(y+1, v+1) = exp(2 * pi * 1i * v * y / N);
    end
end

f = Wm * input * Wn;

for x = 1:M-1
    for y = 1:N-1
        f(x, y) = f(x, y) * (-1)^(x + y);
    end
end

output = im2uint8(abs(f));

Я умножаю ввод на (-1) ^ (x + y), чтобы сместить начало координат. Я понятия не имею, почему я не могу вернуть исходное изображение после выполнения IDFT на изображении с DFT.

Исходное изображение

Изображение после ДПФ

Изображение после IDFT


person Nighost    schedule 05.10.2018    source источник


Ответы (1)


Ваш код работает нормально. Чтобы output второй функции было идентично img_input первой функции, мне пришлось внести следующие изменения:

1-я функция:

F = Wm * input * Wn;                % Don't divide by 200 here.
output = im2uint8(log(1 + abs(F))); % Skip this line altogether

2-я функция: убедитесь, что F из первой функции используется здесь как input.

f = Wm * input * Wn / N / M;        % Divide by N*M, proper normalization

Обратите внимание, что нормализация обычно вводится в IDFT, но вы также можете поместить ее в DFT, если хотите. Однако нормализация на 200 неверна.

person Cris Luengo    schedule 05.10.2018
comment
Спасибо за комментарий. Теперь я изменил свой код ДПФ, чтобы он не делился на 200 и выводил im2uint8 (abs (F)). Затем я изменил код IDFT, как вы предложили, и снова вывел im2uint8 (abs (f)). Однако на этот раз мой вывод IDFT полностью черный. Я все еще не мог получить исходное изображение. - person Nighost; 06.10.2018
comment
Думаю, я понял это. Большое спасибо за совет. - person Nighost; 06.10.2018
comment
@Nighost: да, если вы отбросите всю фазовую информацию и округлите столько важных данных, вы не сможете восстановить исходное изображение. log и abs предназначены только для отображения, всегда сохраняйте полные комплексные данные с плавающей запятой из вашего ДПФ, чтобы вычислить обратное. - person Cris Luengo; 06.10.2018