2011-08-12 16 views
6

Yani, bu this thread'a bir yorum olmalı, ancak görünüşte kapalıdır, bu yüzden işte geliyor. Burada önerildiği gibi matplotlib ve numpy ve mencoder ile oldukça başarılı bir şekilde oynuyordum. O zamandan beri tüm süreci hızlandıran Voki Codder buffer to stdin solution'u kabul ettim. Sorun şu ki, komutun -format = "bgra" bölümünde herhangi bir belge bulamadım. Bu, baytların sağdan sola mavi yeşil kırmızı alfadan sağa doğru olduğu anlamına gelir. Uint32 veya başka bir şey olmalılar mı? Sorun şu ki, şamandıraların renk haritalarını çiziyorum, bu yüzden onları gri tonlamaya dönüştürmeye çalışıyorum, ama çok fazla tuhaf kalıp alıyorum, bu da beni yanlış bir şey yaptığına inanıyorum. Bu işlevi, bir aralıktaki yüzerlerden uint32'ye dönüştürmek için yazdım. Ama sonuç beklediğimden değil, çok aptalca bir şey yapıyorum?Doğrudan numpy ve mencoder ile filme çizimi

def grayscale(x, min, max): 
    return np.uint32((x-min)/(max-min)*0xffffff) 

cevap

5

Sana uint32 temsil ettiği öğeye karıştı düşünüyorum. 4 bant uint8 tam sayı.

Kayan nokta verisine sahipseniz ve bunu gri tonlamalı olarak göstermek istiyorsanız, onu tam 32 bitlik bir aralıkta yeniden ölçeklendirmek istemezsiniz, bunu 8 bitlik bir aralığa yeniden ölçeklemek ve bunu tekrarlamak için kırmızı, yeşil ve mavi bantlar (ve daha sonra muhtemelen sabit bir alfa bandına konur).

Ayrıca farklı bir byteorder da kullanabilirsiniz. Y8, tek bir gri tonlamalı, 8 bit bant ve Y16, tek, gri tonlamalı bir 16 bit banttır. (A) biraz kafa karıştırıcı olsa (tam liste için mencoder -rawvideo format=help çıkışında göz at.)

sadece 8 bitlik tamsayılar dört bant olarak görünümü için numpy 32 bit tamsayı kullanarak göstermek için:

import numpy as np 
height, width = 20,20 

# Make an array with 4 bands of uint8 integers 
image = np.zeros((height, width, 4), dtype=np.uint8) 

# Filling a single band (red) 
b,g,r,a = image.T 
r.fill(255) 

# Fill the image with yellow and leave alpha alone 
image[...,:3] = (255, 255, 0) 

# Then when we want to view it as a single, 32-bit band: 
image32bit = image.reshape(-1).view(np.uint32).reshape(height, width) 
# (Note that this is a view. In other words, we could change "b" above 
# and it would change "image32bit") 
senin durumunda

Ancak, muhtemelen daha böyle bir şey yapmak istiyorum:

import numpy as np 
from videosink import VideoSink 

height, width = 20,20 
numframes = 1000 
data = np.random.random((height, width, numframes)) 

# Rescale your data into 0-255, 8-bit integers 
# (This could be done in-place if you need to conserve memory) 
d ata_rescaled = 255.0/(data.max() - data.min()) * (data - data.min()) 
data_rescaled = data_rescaled.astype(np.uint8) 

# The key here is the "Y8" format. It's 8-bit grayscale. 
video = VideoSink((height,width), "test", rate=20, byteorder="Y8") 

# Iterate over last axis 
for frame in data.T: 
    video.run(frame.T) 
video.close() 
+0

Serin, böylece en iyi def tonlamalı gibi bir şey yapmak olacaktır (x, min, maks): t = INT_MAX * (x-min)/(maks-min) dönüş np.uint8 (t) * 0x1 + np.uint8 (t) * 0x100 + np.uint8 (x) * 0x10000 + 0x0f000000, burada int_max woul d 8 bitlik bitlerin maksimum değeri. –

+0

@Alex - Düzenlemeleri gözden geçirin. Umarım bazı şeyleri açıklığa kavuşturur! –

+0

Harika şeyler Joe, şu anda testi yapıyorum, ama şimdi anladım, byteorder muhtemelen hile yapacak! Teşekkürler bir ton! Alex. –