在 MATLAB 中将频谱图另存为图像

Posted

技术标签:

【中文标题】在 MATLAB 中将频谱图另存为图像【英文标题】:Save Spectrogram as an Image in MATLAB 【发布时间】:2013-04-08 06:07:00 【问题描述】:

我正在使用 MATLAB 中的 spectrogram() 函数分析一些声音片段。我想将频谱图保存为图像(jpg、png 等)。但无论我以何种图像格式保存该图,生成的图像总是与我在图中看到的不同(“参差不齐”)。

以下是频谱图示例:Matlab Figure 与 Saved Image

我想要的只是将我在图中看到的内容保存为图像。我已经尝试将图形保存为所有可能的图像格式,但它们都产生了相同的“斑点”效果。我还尝试了手动保存(单击文件-> 另存为)和以编程方式使用print()saveas() 函数。每次结果都一样。

任何帮助将不胜感激!

【问题讨论】:

我在下面发布了一个解决方法,但我没有找到问题的根源。如果有人想试一试,可以在here找到音频样本。 【参考方案1】:

您的频谱图的数据范围是多少? 原因之一可能是您的频谱图范围超出了double 图像的 [0,1] 区域或uint* 图像的 [0,255] 区域(您保存的图像上的白点可疑地接近 MatLab 图上的局部最小值)。

另一个猜测可能是您正在使用imwrite 函数,尤其是它的imwrite(X,map,filename,fmt) 语法。 MatLab 文档说明:

imwrite(X,map,filename,fmt) 将 X 中的索引图像及其关联的颜色图映射以 fmt 指定的格式写入文件名。如果 X 属于 uint8 或 uint16 类,则 imwrite 将数组中的实际值写入文件。如果 X 属于 double 类,则 imwrite 在写入之前使用 uint8(X–1) 偏移数组中的值。 map 必须是有效的 MATLAB 颜色图。请注意,大多数图像文件格式不支持超过 256 个条目的颜色图。

所以uint8(X–1) 可能是白点的来源。 虽然不知道为什么它们出现在print()'ing 之后。

【讨论】:

上图的数据范围被归一化为[0,1]为double。但即使我只是直接绘制了频谱图输出,结果图看起来也完全一样。我没有在任何地方使用imwrite() 函数。 spectrogram() 函数的 documentation 表明 surf() 函数用于绘制图像。我尝试手动绘制图像,但保存后仍然出现“斑点”效果。【参考方案2】:

我通过使用 pcolor() 函数找到了解决此问题的方法,该函数本质上是一个以网格格式 (doc) 绘制的旋转 surf() 函数。在对spectrogram() 函数进行了更多修改之后,我确信这些“发现”工件与数据格式、属性或比例无关。问题似乎在于 MATLAB 绘制和可视化 3D 图的方式。我也尝试使用mesh() 函数进行绘图,它产生了一种不同的“定位”效果。 pcolor() 之所以有效,是因为它是 3D 绘图的 2D 可视化。

这是spectrogram() 使用surf() 绘制图像的方式(改编自doc):

[S,T,F,P] = spectrogram(X,256,250,256,2000);
surf(T,F,abs(S),'EdgeColor','none');
axis tight; view(0,90);

...这就是如何使用pcolor() 绘制便于保存的图像:

[S,T,F,P] = spectrogram(X,256,250,256,2000);
h = pcolor(T,F,abs(S));
set(h,'EdgeColor','none');

【讨论】:

【参考方案3】:

白点是 OpenGL 问题,这是 spectrogram()surf() 的内部调用中使用的渲染器。 由于您对绘制 2D 可视化感兴趣,请将当前图形的渲染器更改为 zbuffer:

set(gcf, 'renderer', 'zbuffer');

其中gcf 表示“获取当前数字”。白点现在消失了。

请注意,您也可以在创建图窗时选择 zbuffer 渲染器,然后再调用spectrogram()

myNewFig = figure('renderer','zbuffer');

【讨论】:

以上是关于在 MATLAB 中将频谱图另存为图像的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中将动画变形另存为 GIF 文件

matlab-另存为代码

怎样将matlab绘出的图形另存为高精度jpg图片?

将 Matplotlib 图另存为 TIFF

将谷歌图表另存为 pdf

JavaScript 将元素另存为图像或 Extjs 4.x 另存为图像