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

3
我正在使用MATLAB中的函数分析一些声音剪辑。我想将谱图保存为图像(jpg,png等)。但无论我将图形保存为什么图像格式,所得到的图像与我在图形中看到的总是不同的(“斑点”)。
以下是谱图的示例:Matlab Figure vs. Saved Image。
我想要保存与我在图形中看到的完全相同的图像。我已经尝试过将图形保存为所有可能的图像格式,但它们都会产生相同的“斑点”效果。我还尝试了手动保存(单击文件->另存为)和利用和函数编程地保存。每次结果都相同。
任何帮助都将不胜感激!

我已经在下面发布了一个解决方法,但我还没有找到问题的根源。如果有人想尝试,音频样本可以在此处找到:http://eeninja.com/public/sample_clip.aiff。 - shapeshifter
3个回答

1
你的频谱图数据范围是多少? 其中一个原因可能是你的频谱图超出了[0,1]对于double类型图片或者[0,255]对于uint*类型图片(保存的图片上白色斑点怀疑与MatLab图表上的局部极小值点非常接近)。
另一个猜测可能是你正在使用imwrite函数,特别是它的imwrite(X,map,filename,fmt)语法。MatLab文档解释道:
“imwrite(X,map,filename,fmt)将索引图像X和它关联的颜色映射map以指定的格式fmt写入filename中。如果X属于uint8或uint16类,则imwrite会将数组中的实际值写入文件。如果X属于double类,则imwrite在写入之前用uint8(X–1)偏移数组中的值。map必须是有效的MatLab颜色映射。请注意,大多数图像文件格式不支持超过256个条目的颜色映射。”
因此uint8(X–1)可能是白色斑点的来源,虽然不知道为什么在print()后它们会出现。

上面显示的图像数据范围已归一化为[0,1],类型为double。但即使我直接绘制了声谱图输出,结果看起来也完全相同。我没有在任何地方使用imwrite()函数。spectrogram()函数的文档显示使用surf()函数绘制图像。我尝试手动绘制图像,但保存后仍然出现“斑点”效应。 - shapeshifter

0

我通过使用pcolor()函数找到了解决这个问题的方法,它本质上是一个以网格格式绘制的旋转surf()函数(doc)。在更多地尝试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');

0
白点是OpenGL问题,这是在spectrogram()内部调用surf()时使用的渲染器。 由于你想要绘制一个二维可视化图形,所以请将当前图形的渲染器更改为zbuffer。
set(gcf, 'renderer', 'zbuffer');

gcf 表示 "获取当前图形"。白色斑点现在已经消失。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接