Обработка изображений с помощью numpy
Модуль numpy и python позволяют создавать массивы произвольной длины и заполнять их некоторыми значениями. Так как изображение можно представить в виде массива, то мы можем отобразить созданный нами массив в виде изображения RGB, т.е. цветное изображение.
Изображения RGB обычно хранятся в виде 3-мерных массивов 8-битных целых чисел без знака. Форма массива такова:
height x width x 3.
Вот как мы создаем массив для представления изображения шириной 5 пикселей и высотой 4 пикселя:
import numpy as np
width = 5
height = 4
arr = np.zeros([height, width, 3], dtype=np.uint8)
Обратите внимание, что первое измерение-это высота, а второе измерение-ширина. Это связано с тем, что данные упорядочены по строкам, затем каждая строка упорядочена по пикселям, и, наконец, каждый пиксель содержит 3 байтовых значения для RGB. Каждый цвет представлен байтом без знака (numpy dtype uint8).
Теперь давайте заполним массив оранжевыми пикселями (красный=255, зеленый=128, синий=0). Для этого мы используем срезы, три значения передаются по всем строкам и столбцам массива:
arr[:,:] = [255, 128, 0]
Сохранение изображения RGB с помощью PIL
Теперь мы можем использовать метод fromarray для создания изображения PIL из массива numpy и сохранения его в виде файла PNG:
from PIL import Image
img = Image.fromarray(array)
img.save('imrgb.png')
Изображение:
Создание изображений RGBA
Изображение RGBA имеет 4 канала (в отличие от изображения RGB, которое имеет только 3). Четвертый канал-это альфа-канал. Значение альфа 255 сделает пиксель полностью непрозрачным, значение 0 сделает его полностью прозрачным, значения между ними сделают пиксель частично прозрачным.
В приведенном ниже коде мы создаем изображение RGBA, изначально устанавливая те же синие и оранжевые области, что и раньше, со значением альфа 255. Затем мы зацикливаемся на изображении, изменяя альфа-значение каждого пикселя так, чтобы оно было равно его координате x. Это означает, что пиксели в левой части изображения будут прозрачными, а пиксели справа будут почти полностью непрозрачными. Прозрачность плавно меняется слева направо.:
import numpy as np
from PIL import Image
array = np.zeros([100, 200, 4], dtype=np.uint8)
array[:,:100] = [255, 128, 0, 255] # оранжевый цвет для левого края
array[:,100:] = [0, 0, 255, 255] # голубой цвет для правого
# установление прозрачности в зависимости от положения x
for x in range(200):
for y in range(100):
array[y, x, 3] = x
img = Image.fromarray(array)
img.save('imrgba.png')
Изображение:
Таким образом, с помощью массива numpy и python можно создавать многоканальные изображения, а также обрабатывать существующие.