这是我写的一些代码来显示图像的幅度谱:
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
图像时,我会得到一张图片,尽管有相位和幅度。如果我在使用abs
后立即应用fftshift
功能,则会从imshow
获得空白结果。我需要一张图像光谱分析幅度的图像。
有谁知道这里出了什么问题?
答案 0 :(得分:7)
图像不是空白"一点都不imshow
的设计使得任何小于0的double
精度值都显示为黑色,任何大于1的值都显示为白色。计算图像的幅度分量时,您将在代码中生成double
精度图像。
因此,我非常怀疑,因为您的大多数组件(如果不是所有)都大于1,这会让您看到一个完全白色的组件,因此空白"图片。既然我们已经找到了问题,那么你就是not out of the woods yet。简单地缩放组件以使它们适合[0,1]
的范围也不会有帮助。如果这样做,幅度谱的直流分量可能会很大,以至于它压倒了图像中其余的幅度分量。因此,您只会在中间看到一个白点,而图像的其余部分将为黑色。
通常的做法是对幅度谱应用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
完成的重新缩放完全在呼叫内部完成。它不会以任何方式重新调整数据 - 它仅用于显示和那个。
放手一搏,看看它是怎么回事。