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()
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. –
@Alex - Düzenlemeleri gözden geçirin. Umarım bazı şeyleri açıklığa kavuşturur! –
Harika şeyler Joe, şu anda testi yapıyorum, ama şimdi anladım, byteorder muhtemelen hile yapacak! Teşekkürler bir ton! Alex. –