【发布时间】:2010-09-16 17:40:38
【问题描述】:
我想在 MATLAB 中反转图像的傅里叶变换,但结果不是原始图像(应该是)。显然有一些我不知道导致问题的实现细节。代码如下:
img = imread('img.jpg');
fft = fft2(img);
inv = ifft2(fft);
imshow(inv);
【问题讨论】:
标签: matlab image-processing fft
我想在 MATLAB 中反转图像的傅里叶变换,但结果不是原始图像(应该是)。显然有一些我不知道导致问题的实现细节。代码如下:
img = imread('img.jpg');
fft = fft2(img);
inv = ifft2(fft);
imshow(inv);
【问题讨论】:
标签: matlab image-processing fft
由于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 中。
【讨论】:
此外,如果您尝试对彩色(24 位)图像进行 FFT - 请注意 imread() 将返回 M x N x 3 数组。所以应该对每个 R/G/B 通道分别进行 FFT。
See this 了解详情。
【讨论】:
type fft2,您可以看到一个 3-D 输入 x 导致操作 fft(fft(x,[],2),[],1),它在第二维和第一维上执行 FFT,而二维输入 @987654326 @(如果您分别传递每个颜色平面)会导致调用 FFTN。比较每种方法,结果之间的最大绝对像素差异约为 5.6e-10,可能是由于操作顺序的差异。简而言之,两者几乎是等价的。