x
là một mảng numpy.float32
, với các giá trị từ -200
đến 0
. Đây là các giá trị dB (decibel).Hiển thị mảng nổi cho hình ảnh RGB 24 bit (sử dụng PIL chẳng hạn)
Khi tôi làm (theo khuyến cáo here):
Image.fromarray(x, mode='F')
tôi nhận được một tông màu xám hoặc hình ảnh đôi khi gần như màu đen.
Cách ánh xạ phao trong [-200, 0] tới mảng byte 24 bit (sử dụng bản đồ màu) có thể đọc được với mô-đun Python PIL với Image.fromarray(x, mode='RGB')
?
Edit:
Các yêu cầu tập tin âm thanh .wav là here, mà chúng muốn âm mưu spectrogram.
Dưới đây là một số mã để kiểm tra:
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()
Ghi chú:
Các bản đồ màu là xám, làm thế nào để có được bản đồ màu khác? như this one
Yêu cầu duy nhất của tôi là hình ảnh đầu ra có thể được đọc vào một khung Tkinter/canvas (nó hoạt động tốt với PIL của
im = Image.fromarray(...)
sau đóImageTk.PhotoImage(image=im)
) hoặc wxPython khung hình/canvas.
Có lý do bất kỳ lý do tại sao bạn không sử dụng 'matplotlib.pyplot.imshow (X)'? –
@Basj Bạn có bất kỳ dữ liệu nào để chơi cùng? Tôi muốn cung cấp cho nó một shot – BPL
@NikolasRieble Tôi đã thêm một số mã trong câu hỏi, và một số lưu ý về lý do tại sao nên là đầu ra mong muốn: hình ảnh đầu ra nên được đọc vào khung/khung Tkinter hoặc khung wxPython/canvas. – Basj