Конвертировать изображение (png и jpg) в многомерный список и обратно в python - PullRequest
0 голосов
/ 31 августа 2018

Я использую PIL для преобразования imagse в монохромный режим, а затем в список списков, но я не уверен, как это сделать с изображениями rgb.

Может ли кто-нибудь дать мне указание, как преобразовать изображения в многомерный список и обратно в питон?

1 Ответ

0 голосов
/ 31 августа 2018

Давайте начнем с известного образца изображения. Вот небольшой 3х2, с которым можно работать, и большой, чтобы вы могли его увидеть:

Small:

enter image description here

Large:

enter image description here

Вы можете открыть изображение и превратить его в эффективный, быстрый numpy многомерный массив, подобный этому:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open image from disk
im = Image.open('image.png')
na = np.array(im)

Это будет выглядеть так:

array([[[255,   0,   0],                      # Red
        [  0, 255,   0],                      # Green
        [  0,   0, 255]],                     # Blue

       [[  0,   0,   0],                      # Black
        [255, 255, 255],                      # White
        [126, 126, 126]]], dtype=uint8)       # Mid-grey

И преобразовать его обратно в изображение PIL и сохранить как это (просто добавьте этот код в код выше):

# Convert array back to Image
resultim = Image.fromarray(na)
resultim.save('result.png')

Некоторые заметки :

Примечание 1

Если вы ожидаете и хотите получить изображение RGB888 и открываете изображение PNG, вы можете получить изображение с палитрой, в котором нет значений RGB для каждого пикселя, но вместо этого есть индекс в палитре для каждого пикселя и всего остального пойдет не так!

В качестве примера, здесь показано то же изображение, что и выше, но когда приложение для генерации сохранило его как изображение в виде палитры:

array([[0, 1, 2],
       [3, 4, 5]], dtype=uint8)

А вот что возвращается с im.getpalette():

[255,
 0,
 0,
 0,
 255,
 0,
 0,
 0,
 255,
 0,
 0,
 0,
 255,
 255,
 255,
 126,
 126,
 126,
 ...
 ...

Итак, мораль этой истории ... если вы ожидаете RGB888-изображение, используйте:

Image.open('image.png').convert('RGB')

Примечание 2

Аналогично, если вы откроете файл PNG, который содержит прозрачность, у него будет 4 канала, последний из которых является альфа / прозрачностью, и вам следует позвонить convert('RGB'), если вы хотите сбросить альфа-канал.

Примечание 3

Вы можете сократить загрузку и сохранение в отдельные строки, если вы не хотите промежуточное изображение:

# Load and make array in one go
na = np.array(Image.open('image.png').convert('RGB'))

# Convert back to PIL Image and save in one go
Image.fromarray(na).save('result.png')

Ключевые слова : Изображение, обработка изображений, numpy, массив, ndarray, PIL, Pillow, Python, Python3, палитра, PNG, JPG

...