Давайте начнем с известного образца изображения. Вот небольшой 3х2, с которым можно работать, и большой, чтобы вы могли его увидеть:
Small:
![enter image description here](https://i.stack.imgur.com/vyAEP.png)
Large:
![enter image description here](https://i.stack.imgur.com/xIUKH.png)
Вы можете открыть изображение и превратить его в эффективный, быстрый 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