Обработка изображений с помощью numpy

Обработка изображений с помощью numpy

Обработка изображений с помощью 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')

Изображение:

Обработка изображений с помощью numpy

Создание изображений 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

Таким образом, с помощью массива numpy и python можно создавать многоканальные изображения, а также обрабатывать существующие.

Источник

Читайте также