x
- массив numpy.float32
со значениями от до 0
. Это дБ (децибел).Оказание массива с поплавком для 24-разрядного изображения RGB (например, с использованием PIL)
Когда я делаю (в соответствии с рекомендациями here):
Image.fromarray(x, mode='F')
я получаю в оттенках серого или иногда почти черное изображение.
Как сопоставить float в [-200, 0] с 24-битным массивом байтов RGB (с использованием цветовой схемы), который может быть прочитан с помощью модуля Python PIL с Image.fromarray(x, mode='RGB')
?
Edit:
Необходимый .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 кадр/холст.
Есть ли причина, почему вы не используете 'matplotlib.pyplot.imshow (X)'? –
@Basj У вас есть данные для игры? Я бы хотел сделать снимок – BPL
@NikolasRieble. Я добавил код в вопрос, а также примечание о том, почему должен быть желаемый вывод: выходное изображение должно быть прочитано в кадр/холст Tkinter или кадр/холст wxPython. – Basj