Класс UMask: маска или черно-белое изображение
Класс UMask описывает маску или черно-белое изображение с одним каналом (тип bool). Его можно использовать в трех случаях:
- как черно-белое изображение. Значение
False означает черный цвет, т. к. в логическом контексте значение 0 преобразуется в False. Значение True означает белый цвет, т. к. в логическом контексте значение 255 преобразуется в True. Если хотите наоборот, то всегда можно инвертировать значения, но учитывайте, что все методы класса подчиняются описанному правилу;
- как маску. При поиске объектов мы обычно выделяем объект прямоугольной рамкой. Но далеко не всегда объект занимает всю прямоугольную область. Часто другие объекты попадают в ту же самую область. Маска позволяет указать пиксели, входящие в состав найденного объекта в независимости от его формы. Значение
False означает фон или область вне зоны интереса. Значение True означает часть объекта или область зоны интереса;
- как маркер области, вместо объекта
URect. Объект не являющийся валидным описывает размеры и координаты прямоугольной области, занимающей всю зону интереса. Как будто все пиксели маски имеют значение True.
Инструкция импорта:
from unicross_image.uimagegray import UMask
Создание объекта
Создать объект позволяет конструктор класса UMask:
UMask(width, height, x=0, y=0, value=False, create_arr=True)
Параметры width и height задают ширину и высоту изображения соответственно. Если ширина или высота меньше 1 или больше 8000, то будет сгенерировано исключение ValueError. Если параметр value имеет значение False (значение по умолчанию), то изображение будет черного цвета. Пример создания нового изображения черного цвета с шириной 3px и высотой 2px:
from unicross_image.uimagegray import UMask
img = UMask(3, 2)
print(img) # UMask(width=3, height=2, x=0, y=0)
print(img.arr)
# [False, False, False, False, False, False]
Если в параметре value передать значение True, то изображение будет залито белым цветом. Создадим изображение белого цвета с размерами 3x2px:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, value=True)
print(img) # UMask(width=3, height=2, x=0, y=0)
print(img.arr)
# [True, True, True, True, True, True]
Можно обернуть уже существующий список в объект изображения. Чтобы не создавать лишний список, в параметре create_arr следует передать значение False. При этом объект станет не валидным, так как длина пустого списка не будет соответствовать параметрам изображения. Чтобы обновить длину списка, после добавления существующего списка в атрибут arr необходимо вызвать метод update_arr_len(). Проверить объект на валидность можно с помощью метода is_valid(). Пример:
from unicross_image.uimagegray import UMask
arr = [True, True, True, False, False, False]
img = UMask(3, 2, create_arr=False)
print(img.arr) # []
print(img.get_arr_len()) # 0
img.arr = arr # Добавляем существующий список
print(img.is_valid()) # False
img.update_arr_len() # Обновление данных
print(img.is_valid()) # True
print(img.get_arr_len()) # 6
print(img.arr)
# [True, True, True, False, False, False]
Важно понимать, что метод update_arr_len(). не делает объект валидным, он всего лишь обновляет внутренний размер списка. Объект станет валидным только в том случае, если длина списка соответствует параметрам изображения. Контроль за соблюдением валидности лежит на плечах программиста. Длина списка вычисляется по следующей формуле:
Объект, не являющийся валидным, можно использовать как маркер области, вместо объекта URect. Такой объект маски описывает размеры и координаты прямоугольной области внутри другого изображения, занимающей всю зону интереса. Как будто все пиксели маски имеют значение True. Указать координаты начальной точки прямоугольной область можно в параметрах x и y:
from unicross_image.uimagegray import UMask
# Создание маркера области
mask = UMask(3, 2, x=10, y=50, create_arr=False)
print(mask.arr) # []
print(mask.is_valid()) # False
print(mask) # UMask(width=3, height=2, x=10, y=50)
Этот способ создания маски является аналогичным, но напрасно тратит ресурсы:
from unicross_image.uimagegray import UMask
# Создание маски
mask = UMask(3, 2, x=10, y=50, value=True)
print(mask.arr) # [True, True, True, True, True, True]
print(mask.is_valid()) # True
print(mask) # UMask(width=3, height=2, x=10, y=50)
Маска позволяет указать пиксели, входящие в состав найденного объекта в независимости от его формы. Значение False означает фон или область вне зоны интереса. Значение True означает часть объекта или область зоны интереса. Если в составе изображения есть хоть один пиксель фона, то создавайте маску, а если таких пикселей нет, то создавайте маркер. Помните, что параметры x и y задают координаты области в другом изображении, а не координаты изображения с маской. В классах обычных изображений эти координаты всегда равны нулю и способа изменить эти значения нет.
Преобразование объекта UImageGray в объект UMask и наоборот
Преобразовать объект UImageGray в объект UMask позволяет метод get_umask(threshold=127) из класса UImageGray. Все значения меньшие или равные threshold будут преобразованы в False (фон). Все значения больше threshold будут преобразованы в True (часть объекта), В случае ошибки метод вернет значение None. Пример:
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2)
img.arr = [0, 64, 127, 128, 180, 255]
mask = img.get_umask(127)
print(mask) # UMask(width=3, height=2, x=0, y=0)
print(mask.arr)
# [False, False, False, True, True, True]
Создать объект UImageGray на основе объекта UMask позволяет статический метод from_umask() из класса UImageGray. Формат метода:
UImageGray.from_umask(<UMask>, invert=False)
В первом параметре указывается объект UMask. Если параметр invert не задан или имеет значение False, то все значения False будут преобразованы в 0, а все значения True — в 255. Если операция выполнена успешно, то метод вернет объект UImageGray, а в противном случае — значение None. Пример:
from unicross_image.uimagegray import UImageGray, UMask
mask = UMask(3, 2)
mask.arr = [False, False, False, True, True, True]
img = UImageGray.from_umask(mask)
print(img) # UImageGray(width=3, height=2)
print(img.arr) # [0, 0, 0, 255, 255, 255]
Если параметр invert имеет значение True, то все значения False будут преобразованы в 255, а все значения True — в 0. Пример:
from unicross_image.uimagegray import UImageGray, UMask
mask = UMask(3, 2)
mask.arr = [False, False, False, True, True, True]
img = UImageGray.from_umask(mask, invert=True)
print(img) # UImageGray(width=3, height=2)
print(img.arr) # [255, 255, 255, 0, 0, 0]
Сохранение изображения в файл
Сохранить изображение в файл с расширением .uimage позволяет метод save_uimage_gray(). Формат метода:
В качестве параметра указывается путь с расширением .uimage. Если операция выполнена успешно, то метод вернет значение True, а в противном случае — значение False. Изображение перед сохранением преобразуется в оттенки серого цвета.. Обратите внимание: данные о координатах маски не сохраняются в файл. Сохраняется только изображение. Пример:
from unicross_image.uimage import UImage
from unicross_image.uimagegray import UMask
mask = UMask(3, 2)
mask.arr = [False, False, False, True, True, True]
if mask.save_uimage_gray("test.uimage"):
print("Изображение успешно сохранено")
else:
print("Не удалось сохранить изображение")
img = UImage.load_uimage_any("test.uimage")
if img:
print(img) # UImageGray(width=3, height=2)
print(img.arr) # [0, 0, 0, 255, 255, 255]
Если нужно сохранить изображение в другом формате, то следует преобразовать изображение в объект UImageGray, а затем воспользоваться методами этого класса:
from unicross_image.uimagegray import UImageGray, UMask
mask = UMask(300, 200, value=False)
img = UImageGray.from_umask(mask)
if img.save("test.png"):
print("Изображение успешно сохранено")
else:
print("Не удалось сохранить изображение")
Загрузка изображения из файла
Загрузить изображение из файла с расширением .uimage позволяет статический метод load_uimage_gray(). Формат метода:
UMask.load_uimage_gray(<Путь>, threshold=127)
В качестве первого параметра указывается путь к файлу с расширением .uimage. Все значения меньшие или равные threshold будут преобразованы в False (черный цвет). Все значения больше threshold будут преобразованы в True (белый цвет). Если загрузка выполнена успешно, то метод вернет объект UMask, а в противном случае — значение None. Пример:
from unicross_image.uimagegray import UMask
img = UMask.load_uimage_gray("test.uimage")
if img:
print(img) # UMask(width=3, height=2, x=0, y=0)
print(img.arr) # [False, False, False, True, True, True]
else:
print("Не удалось загрузить изображение")
Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage