Выполнение операций преобразования изображений

Операции преобразования изображений изменяют значения пикселей в изображении, как определено пользовательскими функциями, предоставленными как обратный вызов. В отличие от операций свертки, функции трансформации не зависят от значений соседних пикселей.

Разработчики, интересующиеся эффективным выполнением гамма-коррекции или пользовательских пиксельных функций манипулирования на большом или изображении в реальном времени, сочтут эти функции полезными. С vImage можно использовать операции преобразования изображений на следующих видах функций:

Это главы описывают принципы преобразования изображений и показывают Вам, как использовать функции, предоставленные vImage. Путем чтения этой главы Вы будете учиться как:

Операции трансформации

Функции преобразования изображений попадают в четыре категории:

Функции трансформации используют a vImage_Buffer структура, чтобы получить и предоставить данные изображения. Этот буфер содержит указатель на данные изображения, высоту и ширину (в пикселях) данных изображения и числа байтов строки.

Некоторая трансформация функционирует работа на месте. Т.е. исходные и конечные изображения могут занять ту же память, если они - строго выровненный пиксель для пикселя. Для них можно обеспечить указатель на то же vImage_Buffer структура для одного из исходных изображений и конечного изображения.

Гамма-коррекция

Гамма-коррекция имеет отношение к изменению интенсивности пикселей в изображении, таким образом, что оно исправляет для неравного ответа глаза на определенные цвета в дисплее изображения. Полная цель гамма-коррекции состоит в том, чтобы гарантировать точное описание изображения, данного ограниченную дальность распространения сигналов его дисплея, (такую как число битов в каждом пикселе).

Когда vImage выполняет гамма-коррекцию на изображении, он берет каждый пиксель исходного изображения и передает его интенсивность через предопределенную гамма-функцию и сохраняет этот результант (исправленная гаммой) интенсивность пикселей в конечном изображении.

Используя таблицы поиска

Можно использовать таблицу поиска для применения трансформаций пользовательского изображения к изображению. Путем обеспечения массива 256 целых чисел (для целочисленных пиксельных типов) или 4 096 значений, представляющих интенсивность пиксельных типов с плавающей точкой, Вы определяете целевую интенсивность пикселей для каждой потенциальной интенсивности исходного пикселя. Когда vImage преобразовывает изображение согласно таблице поиска, он берет каждую интенсивность пикселей в изображении, индексах в соответствующий элемент матрицы для той интенсивности, и сохраняет интенсивность, сохраненную в той позиции в массиве как целевая интенсивность пикселей.

Перечисление 7-1 показывает, как использовать таблицу поиска для применения трансформации пользовательского изображения.

Перечисление 7-1  , Преобразовывающее изображение с помощью таблицы поиска

int MyLookup(void *inData, unsigned int inRowBytes, void *outData, unsigned int outRowBytes, unsigned int height, unsigned int width, void *table, unsigned int table_height, unsigned int table_width, int divisor, vImage_Flags flags )
{
    vImage_Buffer    in = { inData, height, width, inRowBytes }; // 1
    vImage_Buffer    out = { outData, height, width, outRowBytes }; // 2
 
    if( table_height != 1 || table_width != 256 ) // 3
        return kvImageInvalidKernelSize;
 
    return vImageTableLookUp_Planar8(&in, &out, table, flags); // 4
 
}
  1. Объявляет a vImage_Buffer структура данных для получения информации об исходном изображении. Данные изображения получены как массив байтов (inData). Другие элементы хранят высоту, ширину и байты на строку изображения. Эти данные позволяют vImage знать, насколько большой массив данных изображения, и как должным образом обработать его.

  2. Объявляет vImage_Buffer структура данных для получения информации о конечном изображении, как сделано ранее с исходным изображением.

  3. Проверки, чтобы удостовериться, что размер таблицы поиска подходит для Planar8 пиксельный тип.

  4. Выполняет фактический vImage вызов функции и отказывается от потенциальных ошибок.

Используя умножение матриц

Используя умножение матриц подобно использованию таблицы поиска для определения целевой интенсивности пикселей, за исключением того, что vImage умножает каждую интенсивность пикселей на определенную матрицу, которую Вы обеспечиваете. vImage умножает каждую интенсивность пикселей на ту же матрицу для выполнения этого типа трансформации. Формат матрицы 1D массив 4x4 int16_t типы данных для целочисленных пиксельных типов, и 1D массив 4x4 float типы данных для пиксельных типов плавающих.

vImage обеспечивает следующие функции для выполнения пиксельного умножения матриц:

Используя полиномиалы

Можно обеспечить полиномиальную функцию для vImage для применения к каждой интенсивности пикселей данного изображения. Вы определяете полиномиал путем решения его порядок, и затем обеспечения массива коэффициентов (с порядком - 1 коэффициент). Также необходимо решить граничные значения для разделения смежных диапазонов пиксельных значений. Это определяет, как vImage должен усечь и/или отсечь интенсивности пикселей. Можно использовать полиномиалы для служения в качестве приближений для других функций, которые являются к дорогому для вычисления. Вообразите полиномиальный подбор кривых в приложении графического изображения данных, за исключением того, что Вы соответствуете полиномиалу к непрерывной функции, а не серии дискретных данных. Можно обычно создавать полиномиал с некоторым числом условий, близко соответствующим функцию, которую Вы хотите (например, синус, питание, и т.д.) по ограниченному диапазону.

Кроме того, поддержки vImage с помощью кусочных многочленов для преобразования изображения. Для адаптации определенной кривой по всему диапазону возможных значений входного пикселя иногда необходимо использовать многократные полиномиалы, соответствующие непрерывным подобластям ожидаемой входной палитры. Например, если Вы ожидаете, что все пиксели будут в диапазоне [0, 1.0], у Вас могла бы быть одна полиномиальная польза для вводов в диапазоне [0, 0.5], и один для [0.5, 1.0]. У Вас может быть любое число полиномиалов, пока то число является точным питанием два. для осуществления этого требования vImage получает это значение как log2segments параметр — полиномиальное количество. Например, если Вы говорите, что Ваша функция является связью головы к хвосту восьми полиномиалов, число, необходимо передать в log2segments параметр должен быть 3 (потому что log2 (8) = 3).

vImage обеспечивает следующие функции для использования кусочных многочленов для преобразования изображений: