3

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

这是频谱图的示例:Matlab Figure vs. Saved Image

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

任何帮助,将不胜感激!

在此处输入图像描述

4

3 回答 3

1

你的频谱图的数据范围是多少?原因之一可能是您的频谱图范围超出了图像的 [0,1] 区域double或图像的 [0,255]区域uint*(您保存的图像上的白点可疑地接近 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 之后。

于 2013-04-08T06:26:54.753 回答
0

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

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

[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');
于 2013-04-10T06:36:08.167 回答
0

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

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

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

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

myNewFig = figure('renderer','zbuffer');
于 2013-12-13T10:05:25.117 回答