为什么我得到一个空白图像作为我的输出?
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
完成的重新缩放完全在调用内部完成。它不会以任何方式重新缩放数据 - 它只是为了显示而这样做。
试一试,看看效果如何。
这是我编写的一些代码,用于显示图像的幅度谱:
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
完成的重新缩放完全在调用内部完成。它不会以任何方式重新缩放数据 - 它只是为了显示而这样做。
试一试,看看效果如何。