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

时间:2013-04-08 06:07:00

标签: matlab plot artifacts spectrogram

我正在使用 MATLAB 中的spectrogram()函数分析一些声音片段。我想将频谱图保存为图像(jpg,png等)。但无论我保存图像的图像格式如何,结果图像总是与我在图中看到的不同(“斑点”)。

以下是光谱图的示例:Matlab FigureSaved Image

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

任何帮助将不胜感激!

enter image description here

3 个答案:

答案 0 :(得分:1)

您的频谱图的数据范围是多少? 其中一个原因可能是您的频谱图范围超出double图像的[0,1]区域或[{1}}图像的[0,255](保存图像上的白点可疑地接近本地MatLab上的最小值图。)

另一个猜测可能是你正在使用uint*函数,特别是它的imwrite语法。 MatLab文档解释说:

  

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

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

答案 1 :(得分:0)

我通过使用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');

答案 2 :(得分:0)

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

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

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

请注意,在调用spectrogram()之前,您还可以在创建图形时选择zbuffer渲染器:

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