【问题标题】:Why am I getting a blank image as my output?为什么我得到一个空白图像作为我的输出?
【发布时间】:2016-03-03 07:41:31
【问题描述】:

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

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); 

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

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

【问题讨论】:

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


    【解决方案1】:

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

    因此,我高度怀疑,因为您的大多数组件(如果不是 all)都大于 1,因此您可以看到完全白色的图像,因此是“空白”图像。现在我们已经找到了问题,但是您是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 完成的重新缩放完全在调用内部完成。它不会以任何方式重新调整数据 - 它只是为了显示而这样做。


    试一试,看看进展如何。

    【讨论】:

    • 这个解决方案很有效,一旦我完成了我需要做的事情,我会回来仔细阅读为什么会这样。令人难以置信的详细答案!赞!
    • @SharanDuggirala 自从您接受 :) 以来,我添加了更多编辑...尤其是这种缩放的工作原理。不客气。祝你好运!顺便说一句,具体看一下代码后面的段落。它会告诉你它为什么起作用。
    • 我想,稍后我将能够澄清有关此答案的任何进一步疑问?再次感谢您的回答!
    • @SharanDuggirala 你当然可以。在这里给我留言。不客气。祝你好运!