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

Sha*_*ala 5 matlab signal-processing image fft image-processing

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

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); 
Run Code Online (Sandbox Code Playgroud)

当我注释掉的使用abs和公正fftshift的形象,我得到的图像,尽管相位和幅度.如果我abs在使用后立即应用该功能fftshift,我会得到一个空白的结果imshow.我需要一张图像光谱分析幅度的图像.

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

ray*_*ica 7

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

因此,我非常怀疑,因为大多数组件(如果不是全部)大于1,这使您可以看到完全白色的因此"空白"的图像.既然我们已经找到了问题,那么你还没有走出困境.简单地缩放组件以使它们适合范围[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,[]); 
Run Code Online (Sandbox Code Playgroud)

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

你为每个组件添加1然后采取的原因log是为了避免log(0)操作.如果任何幅度分量为零,则评估为log(1)0,这将变为0.一旦这样做,您可以使用imshow(...,[])重新缩放显示,使最小幅度分量变为0,而最大幅度分量变为1的对频谱.注意,我并没有修改原来的频谱,因此您可以对您做处理.此外,完成的重新缩放imshow完全在呼叫内部完成.它不会以任何方式重新调整数据 - 它仅用于显示,就是这样.


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