2017-01-06 5 views
5

x은 에서 0 사이의 값을 갖는 numpy.float32 배열입니다. dB (데시벨) 값입니다. 내가 할 때 (here를 권장)float 배열을 24 비트 RGB 이미지로 렌더링 (예 : PIL 사용)

는 :

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

을 나는 그레이 스케일 또는 때때로 거의 검은 색 이미지를 얻을.

[-200, 0]의 float를 Image.fromarray(x, mode='RGB')과 함께 Python 모듈 PIL로 읽을 수있는 24 비트 RGB 바이트 배열 (색상 표 사용)에 매핑하는 방법은 무엇입니까?


편집 :

필요한 .wav 오디오 파일은 우리가 spectrogram을 플롯하려는 here이다.

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

  • 내 유일한 요구 사항은 출력 이미지 또는 wxPython에 프레임/캔버스 (는 PIL의 im = Image.fromarray(...) 다음 ImageTk.PhotoImage(image=im) 잘 작동)는 Tkinter를 프레임/캔버스로 읽을 수 있다는 것입니다.

enter image description here

+0

는'matplotlib.pyplot.imshow (X)를'사용하지 않는 이유는 어떤 이유가 있나요? –

+0

@Basj 게임 할 데이터가 있습니까? 그걸 줄께 – BPL

+0

@NikolasRieble 질문에 몇 가지 코드를 추가하고 왜 원하는 출력이되어야하는지에 대한 몇 가지주의 사항이 있습니다. 출력 이미지는 Tkinter 프레임/캔버스 또는 wxPython 프레임/캔버스로 읽혀 져야합니다. – Basj

답변

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

나는 모드에 대한 모든 정보를 찾을 수 없습니다 = 문서에서 'F',하지만 난 그것을 0.0과 같은 범위의 픽셀 값을 기대 - 1.0. 귀하의 가치는 완전히 그 범위 아래에 있으므로 검은 색 이미지가됩니다. 당신은 그들을 변형시켜야 할 것입니다.

회색조 대신에 색상이 지정된 이미지를 얻으려면 mode = 'P'가 필요하며 데이터를 바이트 배열로 변환해야합니다.

+0

'mode = 'P''를 사용하는 것에 대해 생각해 보았지만 좋지 않은 (8 비트) 256 색이 될 것입니다 ... 아마도'mode = 'RGB ''를 사용하고 변환을해야합니다 [-200 , 0] => RGB 모드로 읽을 수있는 24 비트 정수. 하지만 그걸 어떻게 ... – Basj

+0

나는'mode = 'F'를 본다 : [modes] (http://pillow.readthedocs.io/en/3.1.x/handbook/concepts.html#concept-modes) 문서에서. 나는 잘못된 문서를보고 있는가? – fedepad

+0

이러한 문서는 단순히 'F'모드가 부유물을 사용한다고 말합니다. 그 수레가 무엇을 의미하는지 아무 것도 말하지 않고, 음수에 할당 된 유용한 의미를 상상하기가 힘듭니다. 당신은 numpy를 사용하고 있습니다. 당신은 사소한 일을 할 수있는 다른 범위에 값을 얻기 위해 200을 더한 다음 200으로 나누는 것과 같은 일을 할 수 있습니다. – jasonharper

3

컬러 맵을 사용하여 이미지를 플롯하려면 matplotlib.pyplot.imshow을 사용하는 것이 좋습니다.

당신의 test.wav 파일 이렇게의 결과는 다음과 같이 될 것이다 :

enter image description here

자세한 정보는 파이썬을 사용하여 오디오 스펙트로을 만드는 방법에 대한 더 많은 읽을 수 그것을 here

+0

@BPL을 고맙게 생각하지만 파이썬을 사용하여 스펙트로 그램을 만드는 방법과 matplotlib를 사용하여 스펙트로 그램을 표시하는 방법을 이미 알고 있습니다. 이 질문의 요구 사항은 Tkinter 또는 wxPython * 사용자 인터페이스 (예 : 캔버스 위젯 사용)에서로드 할 수있는 이미지 출력 (PIL 또는 anothing else 사용)입니다. 저는 오디오 편집기를 코딩하고 있습니다. 여기에는 tkinter 또는 wxPython에서 완료 한 UI가 필요합니다 (예 : http://stackoverflow.com/a/41504376/1422096). [here] (http://stackoverflow.com/a/41504376/1422096)와 같은 tkinter UI에서 솔루션을 사용할 수 있다고 생각합니까? – Basj