Сюжет непосредственно к фильму с NumPy и Mencoder
Итак, это должен быть комментарий к этой теме, но он, по-видимому, закрыт, так что здесь все идет. Я довольно успешно играл с matplotlib, numpy и mencoder, как было предложено здесь. С тех пор я применил буфер Voki Codder для решения stdin, что значительно ускоряет весь процесс. Дело в том, что я не смог найти никакой документации по части команды -format="bgra". Это означает, что байты справа налево сине-зеленый красный альфа, справа. Должны ли они быть uint32, или что-то еще. Проблема в том, что я строю цветные карты поплавков, поэтому я пытаюсь преобразовать их в оттенки серого, но получаю множество странных шаблонов, которые заставляют меня поверить, что я делаю что-то не так. Я написал эту функцию для преобразования из числа с плавающей точкой в uint32 в пределах диапазона. Но результат не в том, почему я ожидал, я делаю что-то ужасно глупое?
def grayscale(x, min, max):
return np.uint32((x-min)/(max-min)*0xffffff)
1 ответ
Я думаю, ты запутался в том, что uint32
представляет собой. Это 4 группы uint8
целые числа.
Если у вас есть данные с плавающей запятой, и вы хотите представить их в оттенках серого, вы не хотите масштабировать их до полного 32-битного диапазона, вы хотите изменить их до 8-битного диапазона, и повторите это для красного, зеленого и синие полосы (а затем предположительно положить в постоянную альфа-полосу).
Вы также можете просто использовать другой метеор. Y8
это всего лишь одна шкала серого, 8-битная полоса и Y16
это одна 16-битная полоса в оттенках серого. (Посмотрите на вывод mencoder -rawvideo format=help
для полного (хотя и несколько запутанного) списка.)
Просто для иллюстрации использования numpy для просмотра 32-разрядного целого числа в виде четырех полос 8-разрядных целых чисел:
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")
В вашем случае, однако, вы, вероятно, хотите сделать что-то вроде этого:
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()