如何在 MATLAB 中绘制 2D 图像的傅里叶变换的相位和幅度? 我使用
angle
和 abs
,然后使用 imshow
,但我得到了黑色图像。fftshift
有什么用?
F = fft2(I); where I is the input
F = fftshift(F); % Center FFT
F = abs(F); % Get the magnitude
F = log(F+1); % Use log, for perceptual scaling, and +1 since log(0) is undefined
F = mat2gray(F); % Use mat2gray to scale the image between 0 and 1
imshow(F,[]); % Display the result
试试这个。代码取自:如何在 Matlab 中绘制 2D FFT?
根据您的评论,您需要删除直流偏移。 比如:
imagesc(abs(fftshift(fft2(I - mean(I(:))))));
假设我们从保存到变量
image
的图像矩阵开始,并采用傅立叶变换来获取相位和幅度,如下所示:
ft_image = fftshift(fft2(image))
phase = angle(ft_image)
magnitude = abs(ft_image)
fftshift
函数将零频率 (DC) 分量移至图像的中心。如果不使用它,这些组件(通常显示为较亮的组件)就会被分成角落。
显示图像的问题可能是因为傅里叶变换的结果包含复数。它也可能超出图像值的正常范围。要显示幅度和相位,您可以使用以下任意函数:
plot()
imshow()
imagesc()
imshow
函数需要 0 到 1 之间的值,但包含逗号和空括号将使其起作用。如果很难看到高点,您可以尝试标准化数据、显示对数数据或使用傅立叶模数,如下例所示。您还可以使用 real(ft_image)
或 imag(ft_image)
分别可视化实部和虚部,或者可以在 3D 绘图中表示它们。
imshow(abs(log(1+ft_image)), [])
imagesc(magnitude^2)
plot(phase)
imshow(ft_image, [])
imagesc(phase)
请记住,
plot
、imshow
和imagesc
可以互换使用,只要您记得在必要时在imshow
中包含括号即可。