将浮点数组渲染为24位RGB图像(例如,使用PIL)

Bas*_*asj 5 python numpy spectrogram python-imaging-library colormap

x是一个numpy.float32数组,使用来自值-2000.这些是dB(分贝)值.

当我这样做时(按照此处的建议):

Image.fromarray(x, mode='F')
Run Code Online (Sandbox Code Playgroud)

我得到一个灰度或有时几乎是黑色的图像.

如何将[-200,0]中的float映射到24位RGB字节数组(使用色彩映射),可以使用Python模块PIL读取Image.fromarray(x, mode='RGB')


编辑:

所需的.wav音频文件是在这里,为此我们要绘制的频谱.

这是一些要测试的代码:

import scipy, numpy as np
import scipy.io.wavfile as wavfile
import numpy as np
from PIL import Image

def stft(x, fftsize=1024, overlap=4): 
    hop = fftsize / overlap
    w = scipy.hanning(fftsize+1)[:-1]
    return np.array([np.fft.rfft(w*x[i:i+fftsize]) for i in range(0, len(x)-fftsize, hop)])

def dB(ratio):
    return 20 * np.log10(ratio+1e-10)

def magnitudedB(frame, fftsize=1024):
    w = scipy.hanning(fftsize+1)[:-1]
    ref = np.sum(w) / 2
    return dB(np.abs(frame) / ref)

sr, x = wavfile.read('test.wav')

x = np.float32(x) / 2**15

s = magnitudedB(stft(x)).astype(np.float32).transpose()[::-1,]
print "Max %.1f dB, Min %.1f dB" % (np.max(s), np.min(s))

im = Image.fromarray(s+200, mode='F')
im.show()
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 色彩图是灰度,如何获得另一个色彩图?喜欢这个

  • 我唯一的要求是,输出图像可以读入一个Tkinter的帧/月(其与PIL的效果很好im = Image.fromarray(...),然后ImageTk.PhotoImage(image=im)或wxPython的帧/月).

在此输入图像描述

Pet*_*son 5

根据此处的答案,您可以使用matplotlib色彩映射在转换为图像之前转换numpy数组.

#im = Image.fromarray(s+200, mode='F')
from matplotlib import cm
s = (s + 200)/200.0 # input data should range from 0-1
im = Image.fromarray(cm.jet(s, bytes=True))
im.show()
Run Code Online (Sandbox Code Playgroud)

您应该根据最小/最大值适当地设置缩放比例.

样本输出:

样本输出