我想在MATLAB中反转图像的傅里叶变换,但结果不是原始图像(应该是)。显然有一些我不知道的实现细节导致了这个问题。这是代码:
img = imread('img.jpg');
fft = fft2(img);
inv = ifft2(fft);
imshow(inv);
答案 0 :(得分:15)
由于fft2
和ifft2
都以double
或single
精度执行计算,因此image data(可能属于uint8
类型)在被double
处理之前,首先转换为fft2
类型。因此,您必须使用函数uint8
将输出图像inv
转换回无符号的8位整数,以恢复原始图像:
>> img = imread('peppers.png'); % Load a sample image
>> fft = fft2(img); % Get the Fourier transform
>> inv = ifft2(fft); % Get the inverse Fourier transform
>> inv = uint8(inv); % Convert to uint8
>> imshow(inv); % Show the image
>> isequal(img, inv) % Test if inv matches the original image img
ans =
1 % It does!
注意:作为补充提示,我会避免命名变量fft
和inv
,因为MATLAB中已经存在具有这些名称的函数。
答案 1 :(得分:3)
此外,如果您尝试对彩色(24位)图像进行FFT - 请注意,imread()将返回M x N x 3阵列。因此,您应该分别对每个R / G / B通道执行FFT。
See this了解详情。