2016-04-04 3 views
1

Я хочу, чтобы иметь возможность преобразовывать массивы numpy в изображения. Во-первых, я научился преобразовывать массив 3D (hight x width x color) в изображение. После некоторых исследований мне кажется, что PIL (или подушка) - самый естественный способ сделать это. Вот как я это делаю в данный момент (и это работает отлично):Возможно ли генерировать анимацию gif только с помощью библиотеки подушек?

from PIL import Image 
import numpy as np 

if __name__ == '__main__': 
    h = 4 
    w = 8 
    arr = np.zeros((h,w,3), dtype=np.uint8) 

    arr[0, 0, :] = [255,255,0] 
    arr[3, 7, :] = [0,255,0] 

    img = Image.fromarray(arr, 'RGB') 
    img.save('viz.png') 

В качестве следующего шага, я хочу, чтобы иметь возможность принимать список 3D массива (или 4D массив, где время является дополнительное измерение) и генерировать соответствующую анимацию. Так что, далеко я не нашел, как это сделать.

Похоже, что подушка способна читать gif-анимацию. Используя ImageSequence, мы можем получить доступ к его фреймам. Однако я не могу понять, как можно поместить последовательность изображений в анимацию.

Я видел некоторые решения, которые используют ìmages2gif, но я хотел бы остаться с одной библиотекой.

ДОБАВЛЕНО

Ответы here не ответили на мой вопрос. Они используют библиотеку gifmaker, которую я даже не могу установить по пипсу.

+1

Возможный дубликат [Сохранение анимированного GIF в подушку] (http://stackoverflow.com/questions/24688802/saving-an-animated-gif-in- подушка) – Reti43

+1

@ Reti43, нет, я хочу сделать это в подушке, и ответ там использует 'gifmaker'. – Roman

+0

Каков сценарий из Pillow, который является оберточной функцией для вызова 'Image.save()' со специальным параметром. Это не работает для вас? – Reti43

ответ

3

Итак, основное возражение вопроса состояло в том, чтобы создать анимацию gif, представленную списком трехмерных массивов (кадров) или матрицей 4D (с шириной, высотой, цветом и временем в качестве измерения) без использования инструментов которые являются «внешними» для Python.

Похоже, что библиотека PIL не может этого сделать. По крайней мере, не просто, без хаков или обходных решений. Однако цель может быть достигнута за счет использования библиотеки moviepy. Вот элегантное решение при условии этой библиотекой:

import numpy as np 
import moviepy.editor as mpy 

def make_frame(t): 

    h = 100 
    w = 100 

    ar = np.zeros((h, w, 3)) 

    for hi in range(h): 
     for wi in range(w): 
      for ci in range(3): 
       ar[hi, wi, ci] = 255.0*t/15.0 
    return ar 


if __name__ == '__main__': 

    clip = mpy.VideoClip(make_frame, duration=15.0) 
    clip.write_gif('ani.gif', fps=15) 

 Смежные вопросы

  • Нет связанных вопросов^_^