matlab中的二维离散傅里叶变换与逆DFT

matlab中的二维离散傅里叶变换与逆DFT,matlab,dft,Matlab,Dft,我目前正在matlab中为图像实现2D DFT和IDFT,而不使用内置库。我成功地输出了DFT后的光谱图像,但在IDFT后我无法恢复原始图像。 这是我的DFT代码 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

我目前正在matlab中为图像实现2D DFT和IDFT,而不使用内置库。我成功地输出了DFT后的光谱图像,但在IDFT后我无法恢复原始图像。 这是我的DFT代码

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:

我将输入乘以(-1)^(x+y)以移动坐标原点。我不知道为什么在DFTD图像上执行IDFT后无法恢复原始图像


您的代码运行良好。为了使第二个函数的
输出
与第一个函数的
img_输入
相同,我必须进行以下更改:

第一功能:

F = Wm * input * Wn;                % Don't divide by 200 here.
output = im2uint8(log(1 + abs(F))); % Skip this line altogether
第二个功能:确保第一个功能中的
F
用作此处的
输入

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

请注意,规范化通常放在IDFT中,但如果愿意,也可以放在DFT中。200的标准化并不正确。

谢谢您的评论。现在我将DFT的代码改为不除以200并输出im2uint8(abs(F))。然后,我也按照您的建议更改了IDFT的代码,并再次输出im2uint8(abs(f))。但是,这次我的IDFT输出都是黑色的。我仍然无法得到我的原始图像。我想我已经找到了它。非常感谢你的建议。@Nighost:是的,如果你扔掉所有的相位信息,舍弃那么多相关数据,你将无法重建原始图像
log
abs
仅用于显示,始终保留DFT中完整的浮点复数数据以计算逆。
f = Wm * input * Wn / N / M;        % Divide by N*M, proper normalization