x
是一个 numpy.float32
数组,值从 -200
到 0
。这些是 dB(分贝)值。
当我执行(如此处建议here):
Image.fromarray(x, mode='F')
我得到一张灰度图或者几乎是黑色的图像。
如何将一个范围在[-200,0]之间的浮点数映射到一个24位RGB字节数组(使用颜色映射),该数组可以通过Python模块PIL读取,并使用
Image.fromarray(x, mode='RGB')
函数进行处理?
编辑:
以下是一些测试代码:
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()
注:
颜色映射为灰度,如何获取其他的颜色映射?例如这个。
我的唯一要求是输出的图像可以读入Tkinter框架/画布(使用PIL的
im = Image.fromarray(...)
然后ImageTk.PhotoImage(image=im)
很好用)或wxPython框架/画布。
matplotlib.pyplot.imshow(X)
呢? - Nikolas Riebletest.wav
的链接。有了这两个东西,你就可以绘制图像并查看发生了什么。如果你有想法,在此先感谢你! - Basj