UMask C API: маска или черно-белое изображение
Обработка изображений UMask в UImage C API выполняется с помощью функций из библиотеки libuimagegray.dll. Инструкция подключения библиотеки в Python с помощью модуля ctypes:
import os.path
import ctypes
dll_path = r"D:\UImageC\unicross_img\bin"
_ulibpath = os.path.abspath(os.path.join(dll_path, "libuimagegray.dll"))
_ulibc = ctypes.CDLL(_ulibpath)
Преобразование объекта UImageGray в объект UMask и наоборот
Преобразовать объект UImageGray в объект UMask позволяет функция uimagegray_to_umask(). Прототип функции:
int uimagegray_to_umask(unsigned char* parr_int, int arr_len_int,
_Bool* parr_bool, int arr_len_bool, int threshold);
Код описания параметров для Python:
_uimagegray_to_umask = _ulibc.uimagegray_to_umask
_uimagegray_to_umask.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_bool), ctypes.c_int, ctypes.c_int]
_uimagegray_to_umask.restype = ctypes.c_int
Параметр parr_int является указателем, ссылающимся на массив пикселей. Размер этого массива задается в параметре arr_len_int. Параметр parr_bool является указателем, ссылающимся на массив в который будет записано черно-белое изображение. Размер этого массива задается в параметр arr_len_bool. Все значения меньшие или равные threshold будут преобразованы в UIMAGEGRAY_FALSE (фон). Все значения больше threshold будут преобразованы в UIMAGEGRAY_TRUE (часть объекта). Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:
_uimagegray_to_umask = _ulibc.uimagegray_to_umask
_uimagegray_to_umask.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_bool), ctypes.c_int, ctypes.c_int]
_uimagegray_to_umask.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
arr_b = (ctypes.c_bool * arr._length_)()
res = _uimagegray_to_umask(arr, arr._length_,
arr_b, arr_b._length_, 128)
print(res) # 1
print(arr_b[:])
# [False, False, False, True, True, True]
res = _uimagegray_to_umask(arr, arr._length_,
arr_b, arr_b._length_, 254)
print(res) # 1
print(arr_b[:])
# [False, False, False, False, False, True]
Создать объект UImageGray на основе объекта UMask позволяет функция umask_to_uimagegray(). Прототип функции:
int umask_to_uimagegray(_Bool* parr_bool, int arr_len_bool,
unsigned char* parr_int, int arr_len_int, _Bool invert);
Код описания параметров для Python:
_umask_to_uimagegray = _ulibc.umask_to_uimagegray
_umask_to_uimagegray.argtypes = [
ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_bool]
_umask_to_uimagegray.restype = ctypes.c_int
Параметр parr_bool является указателем, ссылающимся на массив маски. Размер этого массива задается в параметре arr_len_bool. Параметр parr_int является указателем, ссылающимся на массив в который будет записано изображение в оттенках серого. Размер этого массива задается в параметре arr_len_int. Если параметр invert имеет значение false, то все значения false будут преобразованы в 0, а все значения true — в 255. Если параметр invert имеет значение true, то все значения false будут преобразованы в 255, а все значения true — в 0. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:
_umask_to_uimagegray = _ulibc.umask_to_uimagegray
_umask_to_uimagegray.argtypes = [
ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_bool]
_umask_to_uimagegray.restype = ctypes.c_int
arr = [False, False, False, True, True, True]
arr_b = (ctypes.c_bool * len(arr))(*arr)
print(arr_b[:])
# [False, False, False, True, True, True]
arr_g = (ctypes.c_ubyte * arr_b._length_)()
res = _umask_to_uimagegray(arr_b, arr_b._length_,
arr_g, arr_g._length_, False)
print(res) # 1
print(arr_g[:])
# [0, 0, 0, 255, 255, 255]
res = _umask_to_uimagegray(arr_b, arr_b._length_,
arr_g, arr_g._length_, True)
print(res) # 1
print(arr_g[:])
# [255, 255, 255, 0, 0, 0]
Инверсия цвета
Инвертировать цвет всех пикселей позволяет функция umask_invert(). Прототип функции:
int umask_invert(_Bool* parr, int arr_len);
Код описания параметров для Python:
_umask_invert = _ulibc.umask_invert
_umask_invert.argtypes = [ctypes.POINTER(ctypes.c_bool), ctypes.c_int]
_umask_invert.restype = ctypes.c_int
Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметре arr_len. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGEGRAY_TRUE), а в случае ошибки — значение -1 (UIMAGEGRAY_ERR). Пример:
_umask_invert = _ulibc.umask_invert
_umask_invert.argtypes = [ctypes.POINTER(ctypes.c_bool), ctypes.c_int]
_umask_invert.restype = ctypes.c_int
arr = [False, False, False, True, True, True]
arr_b = (ctypes.c_bool * len(arr))(*arr)
print(arr_b[:])
# [False, False, False, True, True, True]
res = _umask_invert(arr_b, arr_b._length_)
print(res) # 1
print(arr_b[:])
# [True, True, True, False, False, False]
Сравнение изображений
Сравнить два изображения можно с помощью функции umask_cmp(). Прототип функции:
int umask_cmp(_Bool* parr1, int arr1_len,
_Bool* parr2, int arr2_len);
Код описания параметров для Python:
_umask_cmp = _ulibc.umask_cmp
_umask_cmp.argtypes = [
ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
ctypes.POINTER(ctypes.c_bool), ctypes.c_int]
_umask_cmp.restype = ctypes.c_int
Параметр parr1 является указателем, ссылающимся на массив с пикселями первого изображения. Размер этого массива задается в параметре arr1_len. Параметр parr2 является указателем, ссылающимся на массив с пикселями второго изображения. Размер этого массива задается в параметре arr2_len. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если в изображении равны, и 0 (UIMAGEGRAY_FALSE) — в противном случае. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:
_umask_cmp = _ulibc.umask_cmp
_umask_cmp.argtypes = [
ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
ctypes.POINTER(ctypes.c_bool), ctypes.c_int]
_umask_cmp.restype = ctypes.c_int
arr1 = (ctypes.c_bool * 3)(True, False, False)
arr2 = (ctypes.c_bool * 3)(True, False, False)
arr3 = (ctypes.c_bool * 3)(True, False, True)
res = _umask_cmp(arr1, arr1._length_, arr2, arr2._length_)
print(res) # 1
res = _umask_cmp(arr1, arr1._length_, arr3, arr3._length_)
print(res) # 0
print(arr1 == arr2) # False
Преобразование объекта UMask в строку в формате BWSTR и наоборот
Строка в формате BWSTR может содержать только два значения:
0 — означает фон или область вне зоны интереса (соответствует значению False);
1 — означает часть объекта или область зоны интереса (соответствует значению True).
Строки двумерной матрицы записываются слева направо и сверху вниз.
Преобразовать черно-белое изображение, хранимое в объекте UMask, в строку в формате BWSTR позволяет функция umask_to_bwstr(). Прототип функции:
int umask_to_bwstr(_Bool* parr_bool, int arr_len_bool,
char* s, int s_len);
Код описания параметров для Python:
_umask_to_bwstr = _ulibc.umask_to_bwstr
_umask_to_bwstr.argtypes = [
ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
ctypes.c_char_p, ctypes.c_int]
_umask_to_bwstr.restype = ctypes.c_int
Параметр parr_bool является указателем, ссылающимся на массив пикселей. Размер этого массива задается в параметре arr_len_bool. Параметр s является указателем, ссылающимся на изменяемый строковый буфер в который будет записана строка в формате BWSTR. Размер этого буфера задается в параметр s_len. Размер строкового буфера должен быть на 1 элемент больше массива пикселей, так как в конец строки вставляется нулевой байт. Все значения равные false будут преобразованы в '0'. Все остальные значения будут преобразованы в '1'. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:
_umask_to_bwstr = _ulibc.umask_to_bwstr
_umask_to_bwstr.argtypes = [
ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
ctypes.c_char_p, ctypes.c_int]
_umask_to_bwstr.restype = ctypes.c_int
arr = [False, False, False, True, True, True]
arr_b = (ctypes.c_bool * len(arr))(*arr)
s = ctypes.create_string_buffer(arr_b._length_ + 1)
print(ctypes.sizeof(s)) # 7
print(arr_b._length_) # 6
print(s[:]) # b'\x00\x00\x00\x00\x00\x00\x00'
print(s.raw) # b'\x00\x00\x00\x00\x00\x00\x00'
res = _umask_to_bwstr(arr_b, arr_b._length_, s, ctypes.sizeof(s))
print(res) # 1
print(s[:]) # b'000111\x00'
print(s.value) # b'000111'
print(s.value.decode()) # '000111'
Создать объект UMask на основе строки в формате BWSTR позволяет функция umask_from_bwstr(). Прототип функции:
int umask_from_bwstr(char* s, _Bool* parr_bool, int arr_len_bool);
Код описания параметров для Python:
_umask_from_bwstr = _ulibc.umask_from_bwstr
_umask_from_bwstr.argtypes = [ctypes.c_char_p,
ctypes.POINTER(ctypes.c_bool), ctypes.c_int]
_umask_from_bwstr.restype = ctypes.c_int
Параметр s является указателем на C-строку в формате BWSTR. Параметр parr_bool является указателем, ссылающимся на массив пикселей в который будет записан результат. Размер этого массива задается в параметре arr_len_bool. Длина строки должна быть равна числу элементов массива пикселей. Все значения равные '0' будут преобразованы в false. Все остальные значения будут преобразованы в true. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:
_umask_from_bwstr = _ulibc.umask_from_bwstr
_umask_from_bwstr.argtypes = [ctypes.c_char_p,
ctypes.POINTER(ctypes.c_bool), ctypes.c_int]
_umask_from_bwstr.restype = ctypes.c_int
s = "000111"
bwstr = s.encode()
print(bwstr) # b'000111'
arr = (ctypes.c_bool * len(bwstr))()
print(arr[:])
# [False, False, False, False, False, False]
res = _umask_from_bwstr(bwstr, arr, arr._length_)
print(res) # 1
print(arr[:])
# [False, False, False, True, True, True]
Класс входит в состав графической библиотеки UImageC. Описание библиотеки UImageC