为什么我得到一个空白图像作为我的输出?

Why am I getting a blank image as my output?

这是我编写的一些代码,用于显示图像的幅度谱:

orig_imdata = imread('Original_Image.png'); 
spec_orig = fft2(double(orig_imdata));
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2);
imshow(spec_img); 

当我注释掉 abs 的使用而仅 fftshift 图像时,我得到了一个图像,尽管有相位和幅度。如果我在使用 fftshift 后立即应用 abs 函数,我会从 imshow 得到空白结果。我需要一张我的图像光谱分析幅度的图像。

有人知道这里出了什么问题吗?

图像根本不是 "blank"。 imshow 旨在使任何小于 0 的 double 精度值显示为黑色,任何大于 1 的值都显示为白色。计算图像的幅度分量时,您将在代码中生成 double 精度图像。

因此,我高度怀疑因为你的大部分组件(如果不是 所有)都大于 1,这给你一个完全白色的可视化,因此 "blank" 图片。现在我们已经找到了问题所在,但是您 not out of the woods yet。简单地缩放您的组件以使其适合 [0,1] 的范围也无济于事。如果这样做,幅值谱的 DC 分量可能会非常大,以至于压倒图像中的其余幅值分量。因此,您只会在中间看到一个白点,图像的其余部分将是黑色的。

通常的做法是对显示的幅度谱应用log操作,然后重新缩放值,使其适合[0,1]:

的范围
%// Your code
orig_imdata = imread('Original_Image.png'); 
spec_orig = fft2(double(orig_imdata));
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2);

%// New code
spec_img_log = log(1 + spec_img);
imshow(spec_img_log,[]); 

log 操作中,值的巨大动态范围被压缩到较小的范围,尤其是当值变大时,因此自然地缩放到此压缩范围的 [0,1] 将提供你更好的视觉效果。

之所以每个分量都加1然后取log是为了避免log(0)操作。如果任何量级分量为零,这将计算为 log(1),这将变为 0。执行此操作后,您可以使用 imshow(...,[]) 重新缩放显示,以便最小量级分量变为 0,而最大幅度分量进入 log 频谱的 1。请注意,我 而不是 修改了原始光谱,因此您可以对其进行处理。此外,由 imshow 完成的重新缩放完全在调用内部完成。它不会以任何方式重新缩放数据 - 它只是为了显示而这样做。


试一试,看看效果如何。