我目前在不使用内置库的情况下在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:
[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)以便移动坐标原点。我不知道为什么在DFTed图像上执行IDFT后为什么不能找回原始图像。
答案 0 :(得分:0)
您的代码可以正常工作。为了使第二个功能的output
与第一个功能的img_input
相同,我必须进行以下更改:
第一个功能:
F = Wm * input * Wn; % Don't divide by 200 here.
output = im2uint8(log(1 + abs(F))); % Skip this line altogether
第二个功能:确保此处第一个功能的F
用作input
。
f = Wm * input * Wn / N / M; % Divide by N*M, proper normalization
请注意,规范化通常放在IDFT中,但是如果您愿意,也可以将其放在DFT中。不过200的归一化是不正确的。