为什么我的输出会出现空白图像?

时间:2015-11-29 17:15:50

标签: image matlab image-processing signal-processing fft

这是我写的一些代码来显示图像的幅度谱:

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获得空白结果。我需要一张图像光谱分析幅度的图像。

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

1 个答案:

答案 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完成的重新缩放完全在呼叫内部完成。它不会以任何方式重新调整数据 - 它仅用于显示和那个。

放手一搏,看看它是怎么回事。