Python 如何将Librosa光谱图图保存为特定大小的图像?

Python 如何将Librosa光谱图图保存为特定大小的图像?,python,matplotlib,audio,librosa,Python,Matplotlib,Audio,Librosa,所以我想把光谱图图像输入到一个卷积神经网络中,试图对各种声音进行分类。我希望每个图像精确到384x128像素。然而,当我实际保存图像时,它只有297x98。这是我的密码: def save_spectrogram(num): dpi = 128 x_pixels = 384 y_pixels = 128 samples, sr = load_wave(num) stft = np.absolute(librosa.stft(samples)) db = librosa.a

所以我想把光谱图图像输入到一个卷积神经网络中,试图对各种声音进行分类。我希望每个图像精确到384x128像素。然而,当我实际保存图像时,它只有297x98。这是我的密码:

def save_spectrogram(num):
  dpi = 128
  x_pixels = 384
  y_pixels = 128
  samples, sr = load_wave(num)
  stft = np.absolute(librosa.stft(samples))
  db = librosa.amplitude_to_db(stft, ref=np.max)
  fig = plt.figure(figsize=(x_pixels//dpi, y_pixels//dpi), dpi=dpi, frameon=False)
  ax = fig.add_subplot(111)
  ax.axes.get_xaxis().set_visible(False)
  ax.axes.get_yaxis().set_visible(False)
  ax.set_frame_on(False)
  librosa.display.specshow(db, y_axis='linear')
  plt.savefig(TRAIN_IMG+str(num)+'.jpg', bbox_inches='tight', pad_inches=0, dpi=dpi)

有人对我如何解决这个问题有什么建议吗?我也尝试过不使用子绘图,但当我这样做时,它仍然会保存为错误的大小,并且有空白/背景。

绘图是供人类查看的,并且包含对机器学习不有用的轴标记、标签等内容。要向模型提供光谱图的“图像”,只需输出数据。这些数据可以以任何格式存储,但如果您想使用标准图像格式,则应使用PNG。JPEG等有损压缩会引入压缩伪影

下面是保存光谱图的工作示例代码。请注意,为了获得固定大小的图像输出,代码提取音频信号的固定长度窗口。将音频流划分为这种固定长度的分析窗口是标准做法

示例代码
导入librosa
进口numpy
导入skimage.io
def比例_最小值最大值(X,最小值=0.0,最大值=1.0):
X_标准=(X-X.min())/(X.max()-X.min())
X_标度=X_标准*(最大-最小)+最小
返回X_标度
def光谱图图像(y、sr、out、跃点长度、n\u mels):
#使用对数谱图
mels=librosa.feature.melspectrogram(y=y,sr=sr,n_-mels=n_-mels,
n_fft=跃点长度*2,跃点长度=跃点长度)
mels=numpy.log(mels+1e-9)#添加少量以避免日志(0)
#最小最大刻度,适合8位范围
img=刻度最小值(mels,0,255).aType(numpy.uint8)
img=numpy.flip(img,轴=0)#将低频置于图像底部
img=255 img#倒置。使变黑=更多能量
#另存为PNG
skimage.io.imsave(out,img)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#背景
跃点长度=512#谱图中每个时间步的样本数
n_mels=128#光谱图中的箱数。影像高度
时间步数=384个时间步数。图像宽度
#加载音频。使用librosa中的示例
path=librosa.util.example_audio_file()
y、 sr=librosa.load(路径,偏移量=1.0,持续时间=10.0,sr=22050)
out='out.png'
#提取固定长度的窗口
开始样本=0#从开始开始
长度\样本=时间\步数*跳数\长度
窗口=y[开始样本:开始样本+长度样本]
#转换为PNG
光谱图图像(窗口,sr=sr,out=out,hop_长度=hop_长度,n_mels=n_mels)
打印('写入文件',输出)
输出

您是否确认您的dpi为128,而不是接近100?否则,我认为这篇文章有很好的答案,为什么你不简单地pickle
db
,并使用原始数据作为你的CNN的输入?使用图像(尤其是有损JPEG压缩)不太可能获得所需的结果。您是如何为CNN使用此图像的?我正在做同样的工作,并且一直在将保存的图像保存到模型中。AttributeError:模块“skimage”没有属性“io”。你需要直接导入skimage.io:import skimage.ioI不知道…可能这只是一个Imgur工件,但在我的浏览器中,你的图像是385像素宽。现在修复了导入,谢谢John。Imgur可能会重新压缩图像,有时会出现一个大小的错误。如果有人能在本地复制,那将是一个错误。有没有可能在给定.png图像的情况下重建(或至少估计)原始的.wav?谢谢@琼纳