Главная » 2025 » Декабрь » 05 » Класс UMask: маска или черно-белое изображение
20:32
Класс UMask: маска или черно-белое изображение

Класс 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(). не делает объект валидным, он всего лишь обновляет внутренний размер списка. Объект станет валидным только в том случае, если длина списка соответствует параметрам изображения. Контроль за соблюдением валидности лежит на плечах программиста. Длина списка вычисляется по следующей формуле:

arr_len = width * height

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

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

Категория: UImage | Просмотров: 8 | Добавил: unicross | Теги: Python, UImageGray, UImage, UMask | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Списки слов [10]
Списки слов и словари
OCR [4]
Оптическое распознавание символов
UImage [80]
Графическая библиотека для Python
UImage C [7]
Графическая библиотека для Python
Программы [4]
Полезные программы
Прочее [3]
Другие темы
Календарь
«  Декабрь 2025  »
Пн Вт Ср Чт Пт Сб Вс
1234567
891011121314
15161718192021
22232425262728
293031