Класс UMask: получение информации об объекте
Получить информацию об объекте позволяют следующие методы:
get_x() и get_y() — возвращают координаты левого верхнего угла по осям X и Y соответственно. Пример:
from unicross_image.uimagegray import UMask
mask = UMask(3, 2, x=10, y=20, value=True)
print(mask.get_x()) # 10
print(mask.get_y()) # 20
get_point() — возвращает объект UPoint с координатами левого верхнего угла. Пример:
print(mask.get_point()) # UPoint(x=10, y=20)
x, y = mask.get_point()
print(x) # 10
print(y) # 20
get_width() и get_height() — возвращают ширину и высоту соответственно. Пример:
w = mask.get_width()
h = mask.get_height()
print(w, h) # 3 2
get_size() — возвращает объект USize с размерами изображения. Пример:
s = mask.get_size()
print(s) # USize(width=3, height=2)
w = s.get_width()
h = s.get_height()
print(w, h) # 3 2
w, h = mask.get_size()
print(w, h) # 3 2
get_rect() — возвращает объект URect с координатами и размерами изображения. Пример:
r = mask.get_rect()
print(r) # URect(x=10, y=20, width=3, height=2)
x = r.get_x()
y = r.get_y()
w = r.get_width()
h = r.get_height()
print(x, y, w, h) # 10 20 3 2
x, y, w, h = mask.get_rect()
print(x, y, w, h) # 10 20 3 2
get_num_channels() — возвращает число каналов. Пример:
print(mask.get_num_channels()) # 1
get_img_mode() — возвращает режим изображения в виде строки. Пример:
print(mask.get_img_mode()) # BW
get_mat_type() — возвращает тип матрицы (значение UMat.Type_8B). Пример:
print(mask.get_mat_type()) # 3
get_arr_len() — возвращает количество элементов списка arr, в котором хранится изображение. При этом вычисление размера списка не производится. Размер списка вычисляется только при создании объекта и при вызове метода update_arr_len(). Если объект не является валидным, то значение, возвращаемое методом, будет неправильным. Пример:
print(mask.get_arr_len()) # 6
print(len(mask.arr)) # 6
update_arr_len() — обновляет информацию о размере списка с изображением. Ничего не возвращает;
is_valid() — возвращает значение True, если объект изображения является валидным, и False — в противном случае. Проверяется соответствие размеров изображения размеру списка. Содержимое списка не проверяется. Пример:
img = UMask(300, 200)
print(img.is_valid()) # True
img2 = UMask(3, 2, create_arr=False)
print(img2.arr) # []
print(img2.get_arr_len()) # 0
img2.arr = [True] * 6 # Добавляем существующий список
print(img2.is_valid()) # False
img2.update_arr_len() # Обновление данных
print(img2.is_valid()) # True
print(img2.get_arr_len()) # 6
Получение и изменение пикселей изображения
В основе объекта изображения лежит одномерный список, доступный через атрибут arr. Размер списка вычисляется следующим образом:
Строки двумерной матрицы записываются в список слева направо и сверху вниз. Вычисление положения элемента внутри списка arr, при известных координатах x и y, производится по следующей формуле:
Пример заливки всего изображения цветом фона:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, value=True)
print(img.arr) # [True, True, True, True, True, True]
img_width = img.get_width()
img_height = img.get_height()
img_arr = img.arr
for y in range(img_height):
for x in range(img_width):
i = x + y * img_width
img_arr[i] = False
print(img.arr) # [False, False, False, False, False, False]
Учитывая, что положение пикселя по осям X и Y в этой задаче нам не нужно, будем работать с одномерным списком:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, value=True)
print(img.arr) # [True, True, True, True, True, True]
img_arr_len = img.get_arr_len()
img_arr = img.arr
for i in range(img_arr_len):
img_arr[i] = False
print(img.arr) # [False, False, False, False, False, False]
В нашей задаче одно значение должно заполнить весь список. Для этого перебирать все значения списка не нужно, достаточно создать список заново средствами языка Python:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, value=True)
print(img.arr) # [True, True, True, True, True, True]
img.arr = [False] * img.get_arr_len()
print(img.arr) # [False, False, False, False, False, False]
print(img.is_valid()) # True
Инверсия цвета
Инвертировать цвет всех пикселей позволяет метод invert(). Метод возвращает значение True, если операция выполнена успешно, и False — в противном случае. Пример преобразования белого цвета в черный:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, value=True)
print(img.arr) # [True, True, True, True, True, True]
print(img.invert()) # True
print(img.arr) # [False, False, False, False, False, False]
Обратите внимание, метод изменяет значения в текущем объекте. Если нужно этого избежать, то следует применить метод к копии объекта.
Создание копии объекта
Создать копию объекта позволяет метод copy(). Если операция выполнена успешно, то метод вернет копию объекта, а в противном случае — значение None. Пример:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, x=10, y=20, value=True)
print(img.arr) # [True, True, True, True, True, True]
img2 = img.copy()
print(img2) # UMask(width=3, height=2, x=10, y=20)
print(img2 is img) # False
img2.arr[0] = False
print(img2.arr) # [False, True, True, True, True, True]
print(img.arr) # [True, True, True, True, True, True]
Если объект изображения не является валидным, то метод вернет значение None:
img3 = UMask(3, 2, create_arr=False)
img4 = img3.copy()
print(img4) # None
Если просто присвоить объект другой переменной, то будет скопирована лишь ссылка на объект, а не сам объект:
img2 = img
print(img2) # UMask(width=3, height=2, x=10, y=20)
print(img2 is img) # True
img2.arr[0] = False
print(img2.arr) # [False, True, True, True, True, True]
print(img.arr) # [False, True, True, True, True, True]
Как видно из результата, изменение списка через один объект, привело к изменению списка в другом объекте. Иными словами, оба объекта ссылаются на один и тот же список.
Сравнение объектов
Сравнить два объекта можно с помощью операторов == и !=.Пример:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, value=True)
img2 = UMask(3, 2, value=True)
img3 = UMask(3, 2, value=False)
print(img == img2) # True
print(img == img3) # False
print(img != img2) # False
print(img != img3) # True
Для проверки, ссылаются ли две переменные на один и тот же объект, нужно использовать оператор is:
img4 = img
print(img is img4) # True
print(img is img2) # False
Строка в формате BWSTR
Строка в формате BWSTR может содержать только два значения:
0 — означает фон или область вне зоны интереса (соответствует значению False);
1 — означает часть объекта или область зоны интереса (соответствует значению True).
Строки двумерной матрицы записываются слева направо и сверху вниз. Точно так же, как в список arr.
Преобразование объекта UMask в строку в формате BWSTR и наоборот
Преобразовать объект UMask в строку в формате BWSTR позволяет метод get_bwstr() из класса UMask. В случае ошибки метод вернет значение None. Пример:
from unicross_image.uimagegray import UMask
img = UMask(3, 2, x=10, y=20, create_arr=False)
print(img.is_valid()) # False
print(img.get_bwstr()) # None
img.arr = [True, True, True, False, False, False]
img.update_arr_len() # Обновление данных
print(img.is_valid()) # True
print(img.get_bwstr()) # 111000
Создать объект UMask на основе строки в формате BWSTR позволяет статический метод from_bwstr() из класса UMask. Формат метода:
UMask.from_bwstr(<Ширина>, <Высота>, <BWSTR>, x=0, y=0)
В первом параметре указывается ширина изображения, а во втором — его высота. В третьем параметре задается строка в формате BWSTR. Необязательные параметры x и y позволяют задать координаты. Если операция выполнена успешно, то метод вернет объект UMask, а в противном случае — значение None. Пример:
from unicross_image.uimagegray import UMask
bwstr = "111000"
img = UMask.from_bwstr(3, 2, bwstr, x=10, y=20)
print(img) # UMask(width=3, height=2, x=10, y=20)
print(img.arr) # [True, True, True, False, False, False]
bwstr = "222000"
img = UMask.from_bwstr(3, 2, bwstr, x=10, y=20)
print(img) # None
Сохраним все параметры маски в файл, а затем загрузим их из файла и создадим объект маски:
from unicross_image.uimagegray import UMask
mask = UMask(3, 2, x=10, y=20)
mask.arr = [True, True, True, False, False, False]
x, y, w, h = mask.get_rect()
bwstr = mask.get_bwstr()
data = "{0}|{1}|{2}|{3}|{4}".format(x, y, w, h, bwstr)
# Сохранение маски в файл
with open("test.txt", "w", encoding="utf-8") as f:
f.write(data)
# Загрузка маски из файла
with open("test.txt", "r", encoding="utf-8") as f:
d = f.read()
a = d.strip().split("|")
x, y, w, h = int(a[0]), int(a[1]), int(a[2]), int(a[3])
mask = UMask.from_bwstr(w, h, a[4], x=x, y=y)
print(mask) # UMask(width=3, height=2, x=10, y=20)
print(mask.arr) # [True, True, True, False, False, False]
Преобразование объекта UImageGray в строку в формате BWSTR и наоборот
Преобразовать черно-белое изображение, хранимое в объекте UImageGray, в строку в формате BWSTR позволяет статический метод uimagegray_to_bwstr() из класса UMask. Формат метода:
UMask.uimagegray_to_bwstr(<UImageGray>)
В качестве параметра указывается черно-белое изображение. Если изображение не является черно-белым, а также в случае ошибки метод вернет значение None. Пример:
from unicross_image.uimagegray import UImageGray, UMask
img = UImageGray(3, 2)
img.arr = [255, 255, 255, 0, 0, 0]
print(UMask.uimagegray_to_bwstr(img)) # 111000
img.arr = [255, 255, 255, 128, 128, 128]
print(UMask.uimagegray_to_bwstr(img)) # None
Создать объект UImageGray на основе строки в формате BWSTR позволяет статический метод bwstr_to_uimagegray() из класса UMask. Формат метода:
UMask.bwstr_to_uimagegray(<Ширина>, <Высота>, <BWSTR>)
В первом параметре указывается ширина изображения, а во втором — его высота. В третьем параметре задается строка в формате BWSTR. Если операция выполнена успешно, то метод вернет объект UImageGray, а в противном случае — значение None. Пример:
from unicross_image.uimagegray import UMask
bwstr = "111000"
img = UMask.bwstr_to_uimagegray(3, 2, bwstr)
print(img) # UImageGray(width=3, height=2)
print(img.arr) # [255, 255, 255, 0, 0, 0]
bwstr = "222000"
img = UMask.bwstr_to_uimagegray(3, 2, bwstr)
print(img) # None
Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage