Обработка изображений с помощью 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 можно создавать многоканальные изображения, а также обрабатывать существующие.

Источник

НЕТ КОММЕНТАРИЕВ

Оставить комментарий