Сохранение списка в виде изображения в python - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь сохранить 2D-список как изображение в python (изображение в оттенках серого), поэтому 0 значений в массиве будут черными, а 255 - белым. Например:

255 255 255
255  0  255
255  0  255
255  0  255
255 255 255 

Сохранит l-образную форму. Я пробовал следующий код, использующий библиотеку PIL, как было предложено другими вопросами о переполнении стека:

WIDTH, HEIGHT = img.size
imgData = list(img.getdata()) 
imgData = [imgData[offset:offset + WIDTH] for offset in range(0, WIDTH * HEIGHT, WIDTH)]
#to print the image 
for row in data:
    print(' '.join('{:3}'.format(value) for value in row))
imgData = np.array(imgData)
**IMG VALUES AUGMENTED HERE**
newimg = Image.new('L', (WIDTH, HEIGHT), 'white')
newimg.putdata(imgData)
newimg.save('C:/File/Name.png')

Однако создаваемое изображение не отражает список вообще. Если бы у меня были 0 и 255 в разных позициях, то создавалось бы одно и то же изображение. Кто-нибудь знает решение?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Поскольку в вашем примере отсутствуют какие-либо входные данные, я просто набрал их, как вы описываете, сделал изображение, а затем увеличил его. Я также искусственно добавил красную рамку, чтобы вы могли видеть ее на белом фоне StackOverflow:

#!/usr/bin/env python3

from PIL import Image
import numpy as np

pixels = [[255,255,255],
          [255,0,255],
          [255,0,255],
          [255,0,255],
          [255,255,255]]

# Make list of pixels into Image
im = Image.fromarray(np.array(pixels,dtype=np.uint8))
im.save('result.png')

enter image description here

0 голосов
/ 28 марта 2020

Вместо:

newimg.putdata(imgData)

вам нужна строка:

newimg.putdata([j[0] for i in imgData for j in i])

Данные в градациях серого указаны в 1d списке, а не в 2d списке.

Это создает список:

>>> [j[0] for i in imgData for j in i]
[255, 255, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 255, 255]

Что означает:

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

РЕДАКТИРОВАТЬ Приведенное выше решение работает, если вы редактируете imgData с помощью imgData[0][0] = [0, 0, 0, 255]. Если вы редактируете imgData с помощью imgData[0][0] = 0, тогда вам понадобится строка:

[j[0] if hasattr(j, '__iter__') else j for i in imgData for j in i]

или вы можете сделать ее лучше:

imgData = np.array([[j[0] for j in i] for i in imgData])
imgData[0][0] = 0
newimg.putdata(imgData.flatten())
...