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

时间:2017-01-06 12:58:00

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

x是一个numpy.float32数组,其值从-2000。这些是dB(分贝)值。

当我这样做时(按照建议here):

Image.fromarray(x, mode='F')

我得到灰度或有时近乎黑的图像。

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

编辑:

所需的.wav音频文件为here,我们要为其绘制spectrogram

以下是一些要测试的代码:

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()

注意:

  • 色彩图是灰度的,如何获取另一个色彩图?例如this one

  • 我唯一的要求是输出图像可以读入Tkinter框架/画布(它适用于PIL的im = Image.fromarray(...)然后ImageTk.PhotoImage(image=im))或wxPython框架/画布。

enter image description here

3 个答案:

答案 0 :(得分:5)

根据答案here,您可以使用matplotlib colormaps转换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()

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

示例输出:

Sample output

答案 1 :(得分:3)

要使用色彩图绘制图像,我建议您使用matplotlib.pyplot.imshow

使用test.wav文件执行此操作的结果如下:

enter image description here

有关使用python创建音频谱图的更多详细信息,您可以阅读更多相关信息here

答案 2 :(得分:1)

我无法找到有关模式的详细信息=' F'在文档中,但我希望它采取像0.0 - 1.0范围内的像素值。你的值完全低于那个范围,因此是黑色图像;你需要改变它们。

获取彩色图像(而不是灰度)需要mode =' P',这需要您将数据转换为字节数组。