首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我得到一个空白的图像作为我的输出?

为什么我得到一个空白的图像作为我的输出?
EN

Stack Overflow用户
提问于 2015-11-29 17:15:49
回答 1查看 2K关注 0票数 5

下面是我为显示图像的幅度谱而编写的一些代码:

代码语言:javascript
复制
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得到一个空白结果。我需要一张像我的图像的光谱分析的大小。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 18:02:11

这张照片一点也不“空白”。imshow的设计使得任何小于0的double精度值都显示为黑色,任何大于1的值都显示为白色。当计算图像的大小分量时,您将在代码中生成double精度图像。

因此,我非常怀疑,因为大多数组件(如果不是全部的话)都大于1,这会使您看到一个完全白色的,因此“空白”的图像。现在我们已经发现了问题,但是您是还没有走出险境。简单地缩放您的组件,使它们能够适应[0,1]的范围也于事无补。如果你这样做,星等谱的直流分量可能会非常大,它会压倒你图像中其他的震级分量。因此,您将只看到一个白点在中间,其余的图像将是黑色的。

一种常见的做法是将log操作应用到显示的幅度谱中,然后重新标度这些值,使它们符合[0,1]的范围。

代码语言:javascript
复制
%// 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,而最大的震级分量达到日志谱的1。请注意,我做了,而不是修改了原始频谱,这样您就可以对其进行处理了。另外,imshow完成的重标度完全是在内部完成的。不管怎么说,它不会重放数据--它只是为了显示数据,仅此而已。

试一试,看看进展如何。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33985585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档