Главная » 2026 » Январь » 05 » UImageGray C API: изображение в оттенках серого
18:40
UImageGray C API: изображение в оттенках серого

UImageGray C API: изображение в оттенках серого

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

// Логическое значение true
#define UIMAGEGRAY_TRUE    1
// Логическое значение false
#define UIMAGEGRAY_FALSE   0
// Значение, означающее ошибку при выполнении функции
#define UIMAGEGRAY_ERR   (-1)
// Максимальная ширина изображения
#define UIMAGEGRAY_MAX_W   8000
// Максимальная высота изображения
#define UIMAGEGRAY_MAX_H   8000
// Максимальный размер массива с пикселями (8000 * 8000 * 1)
#define UIMAGEGRAY_MAX_SIZE   64000000

В этом же файле объявлены структуры для хранения изображений:

typedef struct {
   int width;
   int height;
   unsigned char* parr;
} UImageGray;

typedef struct {
   int width;
   int height;
   int* parr;
} UImageGrayI;

typedef struct {
   int width;
   int height;
   float* parr;
} UImageGrayF;

typedef struct {
   int width;
   int height;
   double* parr;
} UImageGrayD;

Заливка изображения цветом

Функция uimagegray_fill() позволяет присвоить всем пикселям изображения указанное значение. Прототип функции:

int uimagegray_fill(int w, int h,
                    unsigned char* parr, int arr_len, int value);

Код описания параметров для Python:

_uimagegray_fill = _ulibc.uimagegray_fill
_uimagegray_fill.argtypes = [ctypes.c_int, ctypes.c_int,
      ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_int]
_uimagegray_fill.restype = ctypes.c_int

Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся  на массив с пикселями. Размер этого массива задается в параметре arr_len. Значение в диапазоне от 0 до 255, которое заполнит весь массив, указывается в параметре value. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGEGRAY_TRUE), а в случае ошибки — значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_fill = _ulibc.uimagegray_fill
_uimagegray_fill.argtypes = [ctypes.c_int, ctypes.c_int,
      ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_int]
_uimagegray_fill.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 5)()
print(arr[:])  # [0, 0, 0, 0, 0]
res = _uimagegray_fill(arr._length_, 1, arr, arr._length_, 255)
print(res)     # 1
print(arr[:])  # [255, 255, 255, 255, 255]

Инверсия цвета

Инвертировать цвет всех пикселей позволяет функция uimagegray_invert(). Прототип функции:

int uimagegray_invert(unsigned char* parr, int arr_len);

Код описания параметров для Python:

_uimagegray_invert = _ulibc.uimagegray_invert
_uimagegray_invert.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_invert.restype = ctypes.c_int

Параметр parr является указателем, ссылающимся  на массив с пикселями. Размер этого массива задается в параметре arr_len. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGEGRAY_TRUE), а в случае ошибки — значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_invert = _ulibc.uimagegray_invert
_uimagegray_invert.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_invert.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(255, 255, 255, 255, 255, 255)
print(arr[:])
# [255, 255, 255, 255, 255, 255]
res = _uimagegray_invert(arr, arr._length_)
print(res)     # 1
print(arr[:])
# [0, 0, 0, 0, 0, 0]
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
res = _uimagegray_invert(arr, arr._length_)
print(res)     # 1
print(arr[:])
# [255, 191, 127, 55, 1, 0]

Преобразование целочисленного диапазона в вещественный и наоборот

Преобразовать целочисленный диапазон значений от 0 до 255 в вещественный диапазон от 0.0 до 1.0 позволяет функция uimagegray_ubyte_to_double(). Прототип функции:

int uimagegray_ubyte_to_double(unsigned char* parr_int, int arr_len_int,
                               double* parr_f, int arr_len_f);

Код описания параметров для Python:

_uimagegray_ubyte_to_double = _ulibc.uimagegray_ubyte_to_double
_uimagegray_ubyte_to_double.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_double), ctypes.c_int]
_uimagegray_ubyte_to_double.restype = ctypes.c_int

Параметр parr_int является указателем, ссылающимся на массив с целочисленными значениями. Размер этого массива задается в параметре arr_len_int. Параметр parr_f является указателем, ссылающимся  на массив с вещественными значениями. Размер этого массива задается в параметре arr_len_f. Значения из массива parr_int после преобразования будут записаны в массив parr_f. Размеры массивов должны совпадать. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGEGRAY_TRUE), а в случае ошибки — значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_ubyte_to_double = _ulibc.uimagegray_ubyte_to_double
_uimagegray_ubyte_to_double.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_double), ctypes.c_int]
_uimagegray_ubyte_to_double.restype = ctypes.c_int
arr_int = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
print(arr_int[:])
# [0, 64, 128, 255]
arr_f = (ctypes.c_double * 4)()
print(arr_f[:])
# [0.0, 0.0, 0.0, 0.0]
res = _uimagegray_ubyte_to_double(arr_int, arr_int._length_,
                                  arr_f, arr_f._length_)
print(res) # 1
print(arr_f[:])
# [0.0, 0.25098039215686274, 0.5019607843137255, 1.0]

Преобразовать вещественный диапазон от 0.0 до 1.0 в целочисленный диапазон значений от 0 до 255 позволяет функция uimagegray_double_to_ubyte(). Прототип функции:

int uimagegray_double_to_ubyte(double* parr_f, int arr_len_f,
                         unsigned char* parr_int, int arr_len_int);

Код описания параметров для Python:

_uimagegray_double_to_ubyte = _ulibc.uimagegray_double_to_ubyte
_uimagegray_double_to_ubyte.argtypes = [
   ctypes.POINTER(ctypes.c_double), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_double_to_ubyte.restype = ctypes.c_int

Параметр parr_f является указателем, ссылающимся  на массив с вещественными значениями. Размер этого массива задается в параметре arr_len_f. Параметр parr_int является указателем, ссылающимся на массив с целочисленными значениями. Размер этого массива задается в параметре arr_len_int. Значения из массива parr_f после преобразования будут записаны в массив parr_int. Размеры массивов должны совпадать. Перед преобразованием выполняется нормализация диапазона. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGEGRAY_TRUE), а в случае ошибки — значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_double_to_ubyte = _ulibc.uimagegray_double_to_ubyte
_uimagegray_double_to_ubyte.argtypes = [
   ctypes.POINTER(ctypes.c_double), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_double_to_ubyte.restype = ctypes.c_int
arr = [0.0, 0.25098039215686274, 0.5019607843137255, 1.0]
arr_f = (ctypes.c_double * 4)(*arr)
print(arr_f[:])
# [0.0, 0.25098039215686274, 0.5019607843137255, 1.0]
arr_int = (ctypes.c_ubyte * 4)()
print(arr_int[:])
# [0, 0, 0, 0]
res = _uimagegray_double_to_ubyte(arr_f, arr_f._length_,
                                  arr_int, arr_int._length_)
print(res) # 1
print(arr_int[:])
# [0, 64, 128, 255]

Сравнение изображений

Сравнить два изображения можно с помощью функции uimagegray_cmp(). Прототип функции:

int uimagegray_cmp(unsigned char* parr1, int arr1_len,
                   unsigned char* parr2, int arr2_len);

Код описания параметров для Python:

_uimagegray_cmp = _ulibc.uimagegray_cmp
_uimagegray_cmp.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_cmp.restype = ctypes.c_int

Параметр parr1 является указателем, ссылающимся  на массив с пикселями первого изображения. Размер этого массива задается в параметре arr1_len. Параметр parr2 является указателем, ссылающимся  на массив с пикселями второго изображения. Размер этого массива задается в параметре arr2_len. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если в изображении равны, и 0 (UIMAGEGRAY_FALSE) — в противном случае. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_cmp = _ulibc.uimagegray_cmp
_uimagegray_cmp.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_cmp.restype = ctypes.c_int
arr1 = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
arr2 = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
arr3 = (ctypes.c_ubyte * 4)(0, 64, 128, 0)
res = _uimagegray_cmp(arr1, arr1._length_, arr2, arr2._length_)
print(res)          # 1
res = _uimagegray_cmp(arr1, arr1._length_, arr3, arr3._length_)
print(res)          # 0
print(arr1 == arr2) # False

Узнать на какую величину отличаются два изображения можно с помощью функции uimagegray_hamming_distance(). Прототип функции:

int uimagegray_hamming_distance(unsigned char* parr1, int arr1_len,
                                unsigned char* parr2, int arr2_len);

Код описания параметров для Python:

_uimagegray_hamming_distance = _ulibc.uimagegray_hamming_distance
_uimagegray_hamming_distance.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_hamming_distance.restype = ctypes.c_int

Параметр parr1 является указателем, ссылающимся  на массив с пикселями первого изображения. Размер этого массива задается в параметре arr1_len. Параметр parr2 является указателем, ссылающимся  на массив с пикселями второго изображения. Размер этого массива задается в параметре arr2_len. Размеры массивов должны быть одинаковыми. Функция возвращает:

  • 0 — если изображения идентичны;
  • положительное число — это расстояние Хэмминга, показывающее насколько изображения отличаются друг от друга. Чем меньше это число, тем более схожи изображения;
  • значение -1 (UIMAGEGRAY_ERR) при наличии ошибки.

Пример:

_uimagegray_hamming_distance = _ulibc.uimagegray_hamming_distance
_uimagegray_hamming_distance.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_hamming_distance.restype = ctypes.c_int
arr1 = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
arr2 = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
arr3 = (ctypes.c_ubyte * 4)(0, 64, 0, 0)
res = _uimagegray_hamming_distance(arr1, arr1._length_,
                                   arr2, arr2._length_)
print(res) # 0
res = _uimagegray_hamming_distance(arr1, arr1._length_,
                                   arr3, arr3._length_)
print(res) # 2

Вычисление гистограммы

Вычислить гистограмму изображения позволяет функция uimagegray_histogram(). Прототип функции:

int uimagegray_histogram(int w, int h,
                         unsigned char* parr, int arr_len,
                         int* phist, int hist_len);

Код описания параметров для Python:

_uimagegray_histogram = _ulibc.uimagegray_histogram
_uimagegray_histogram.argtypes = [ctypes.c_int, ctypes.c_int,
    ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
    ctypes.POINTER(ctypes.c_int), ctypes.c_int]
_uimagegray_histogram.restype = ctypes.c_int

Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся  на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр phist является указателем, ссылающимся  на массив в который будет записана гистограмма. Размер этого массива задается в параметре hist_len. Размер массива с гистограммой должен быть равен 257. Индексы первых 256 элементов соответствуют коду цвета в оттенках серого. Значения элементов соответствуют числу пикселей с таким цветом внутри изображения. Последний элемент массива содержит общее число пикселей в изображении. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_histogram = _ulibc.uimagegray_histogram
_uimagegray_histogram.argtypes = [ctypes.c_int, ctypes.c_int,
    ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
    ctypes.POINTER(ctypes.c_int), ctypes.c_int]
_uimagegray_histogram.restype = ctypes.c_int
arr = [0, 0, 128, 255, 255, 255]
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [0, 0, 128, 255, 255, 255]
hist = (ctypes.c_int * 257)()
res = _uimagegray_histogram(arr2._length_, 1, arr2, arr2._length_,
                            hist, hist._length_)
print(res)            # 1
print(hist[0])        # 2 (число черных пикселей)
print(hist[255])      # 3 (число белых пикселей)
print(hist[128])      # 1 (число пикселей с цветом 128)
print(hist[64])       # 0 (число пикселей с цветом 64)
print(hist[256])      # 6 (число всех пикселей)

Класс входит в состав графической библиотеки UImageC. Описание библиотеки UImageC

Категория: UImage C | Просмотров: 6 | Добавил: unicross | Теги: UImageC, UImageGray | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Списки слов [10]
Списки слов и словари
OCR [4]
Оптическое распознавание символов
UImage [80]
Графическая библиотека для Python
UImage C [7]
Графическая библиотека для Python
Программы [4]
Полезные программы
Прочее [3]
Другие темы
Календарь
«  Январь 2026  »
Пн Вт Ср Чт Пт Сб Вс
   1234
567891011
12131415161718
19202122232425
262728293031