Конвертировать анимированный GIF в 4D массив в Python - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу преобразовать файл .gif в массив 4D / массив значений RGB в 3D.

Я пробовал PIL, но, похоже, это позволяет мне читать GIF как изображение в оттенках серого. ndimage от numpy не имеет этой проблемы, но приводит только к первому кадру gif.

.gif, который я пытаюсь преобразовать, для тестирования это

enter image description here (очень маленький, сделано в GIMP)

Который просто увеличивается красным цветом в верхней части первого кадра, увеличивается зеленым цветом по краям первого кадра и увеличивается синим цветом в левом верхнем углу по мере продвижения кадров.

PIL дает мне

[[[ 0  3  5  6  8]
  [ 7 12 12 12 12]
  [ 9 12 12 12 12]
  [10 12 12 12 12]
  [11 12 12 12 12]]
 [[ 1 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]]
 [[ 2 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]]
 [[ 4 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]
  [12 12 12 12 12]]]

В то время как Numpy дает мне

[[[  0   0   0]
  [ 20   0   0]
  [ 40   0   0]
  [ 60   0   0]
  [ 80   0   0]]

 [[  0  20   0]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[  0  40   0]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[  0  60   0]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[  0  80   0]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]]

Ничего из того, чего я хочу.

1 Ответ

0 голосов
/ 27 апреля 2018
import numpy as np
from PIL import Image, ImageSequence

img = Image.open('test.gif')
frames = np.array([np.array(frame.copy().convert('RGB').getdata(),dtype=np.uint8).reshape(frame.size[1],frame.size[0],3) for frame in ImageSequence.Iterator(img)])

вывод:

(frame_num * frame_width * frame_height * 3 (RGB))

    [array([[[  0,   0,   0],
             [ 20,   0,   0],
             [ 40,   0,   0],
             [ 60,   0,   0],
             [ 80,   0,   0]],

            [[  0,  20,   0],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[  0,  40,   0],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[  0,  60,   0],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[  0,  80,   0],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]]], dtype=uint8), 
     array([[[  0,   0,  20],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]]], dtype=uint8), 
     array([[[  0,   0,  40],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]]], dtype=uint8), 
     array([[[  0,   0,  60],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]],

            [[255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255],
             [255, 255, 255]]], dtype=uint8)]
...