【问题标题】:How to log scale a 2D Matrix / Image如何记录缩放 2D 矩阵/图像
【发布时间】:2020-11-22 17:49:11
【问题描述】:

我有一个音频频谱图的 2D numpy 数组,我想将其保存为图像。

我正在使用librosa 库来获取光谱。我还可以使用librosa.display.specshow() 函数绘制它。如下所示,有多种不同的缩放类型。

import PIL
import librosa
import librosa.display

def display_spectrogram(spectrum, sampling_rate):
    """
    Frequency types:
    ‘linear’, ‘fft’, ‘hz’ : frequency range is determined by the FFT window and sampling rate.
    ‘log’ : the spectrum is displayed on a log scale.
    ‘mel’ : frequencies are determined by the mel scale.
    ‘cqt_hz’ : frequencies are determined by the CQT scale.
    ‘cqt_note’ : pitches are determined by the CQT scale.
    """

    librosa.display.specshow(spectrum, sr=sampling_rate, x_axis='time', y_axis='log')
    plt.colorbar(format='%+2.0f dB')
    plt.title('Spectrogram')
    plt.show()

我还可以将频谱图(一个 numpy 数组)转换为图像并保存如下。

img = PIL.Image.fromarray(spectrum)
img.save("out.png")

我有原始的频谱图(线性缩放),我想用对数刻度的 y 轴保存它。我查看了 library's source code 以了解它是如何扩展的,但无法弄清楚。

如何记录缩放图像/二维 numpy 数组的 y 轴?


【问题讨论】:

  • @Antimon 我不想改变这些值,我只想对数挤压它们。
  • 没关系,我误解了你的问题。我现在知道了。但是您必须告诉我们数字数据的格式是什么。频率和时间点如何编制索引?

标签: python numpy python-imaging-library librosa spectrogram


【解决方案1】:

Y 轴的实际对数变换由 matplotlib 完成。您可以通过 ax.set_yscale('linear')ax.set_yscale('linear') 进行测试。因此,最简单的替代方法是调整 matplotlib 图形以删除刻度、边框等。这是其中的一个示例:https://stackoverflow.com/a/37810568/1967571

如果你想自己做对数缩放,步骤是

  • 计算 Y 轴上的当前频率。使用librosa.fft_frequencies
  • 在 Y 轴上计算所需的频率。使用numpy.logspace 或类似的
  • 以所需频率对频谱图进行采样,例如使用 scipy.interpolate (interp1d)

【讨论】:

  • 谢谢@jonnor。使用plt.axis("off")plt.tight_layout(pad=0) 我保存了图像。它用不同的方法解决了问题
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多