Модуль изображения и его части
Это учебное руководство предоставляет подробную информацию о том, как записать различные части модуля изображения так, чтобы они сотрудничали как модуль изображения. Важно, чтобы у Вас была идея не только того, каковы части, но и как они совмещаются. Эта глава обеспечивает такой обзор. Это описывает части модуля изображения, обсуждает то, что каждый делает и обеспечивает инструкции для записи некоторых компонентов в модуле изображения.
Перед запуском этой главы Вы должны быть знакомы с понятиями, описанными в Базовом Руководстве по программированию Изображения, уже использовали некоторые встроенные фильтры обработки изображений, предоставленные Базовым Изображением, и понимаете классы, определенные Базовым Изображением API (см. Базовый Ссылочный Набор Изображения).
Главные части модуля изображения
Фильтр обработки изображений, когда упаковано как исполнимый модуль изображения, имеет три главных части:
A
kernel
стандартный файл. Этот файл содержит один или большеkernel
подпрограммы и любые необходимые подпрограммы.kernel
подпрограмма должна быть записана с помощью Core Image Kernel Language (CIKL). Подобное языку C, CIKL является подмножеством Языка Штриховки OpenGL (glslang). CIKL ограничивает некоторые glslang ключевые слова, которые Вы можете использовать, но представляете много ключевых слов и типов данных, которые не предоставлены glslang. (См. Базовую Ссылку Языка Ядра Изображения.)Файлы фильтра Objective C. Каждый фильтр имеет интерфейс и файл реализации, выполняющий весь набор, работают требуемые до применения a
kernel
подпрограмма.Файлы загрузки плагина. Каждый модуль изображения имеет интерфейс и файл реализации, реализующий протокол загрузки плагина.
Разделение труда
Задачи обработки изображений разделены на низкий уровень (ядро) и высокий уровень (Objective C) задачи. Когда Вы сначала начинаете писать модули изображения, Вы могли бы найти, что он бросающий вызов разделил задачи соответственно. Если Вы стремитесь сохранить kernel
наклон подпрограмм, Вы, вероятно, преуспеете в том, чтобы делить задачи соответственно.
A kernel
подпрограмма воздействует на отдельные пиксели и использует GPU (предполагающий, что каждый доступен). Для лучшей производительности, a kernel
подпрограмма должна максимально фокусироваться на пиксельной обработке. Любой устанавливал работу или вычисления, которые могут быть сделаны вне kernel
подпрограмма должна быть сделана вне kernel
подпрограмма, в Objective C фильтруют файлы. Как Вы будете видеть, потому что Базовое Изображение ожидает, что определенные задачи будут выполнены вне kernel
подпрограмма, шаблон плагина модуля изображения XCode обеспечивает методы, установленные в просто этой цели. В записи Части Objective C Вы видите специфические особенности, но на данный момент, общее понимание - все, в чем Вы будете нуждаться.
Это задачи, обычно выполняемые в файлах фильтра Objective C:
Получите файлы, необходимые для фильтра. I/O изображения является высокоуровневой задачей, обычно делающейся во время фазы инициализации фильтра модуля изображения. Файлы могут включать изображение (или изображения), чтобы быть обработанными и любые другие данные изображения, необходимые
kernel
подпрограмма (такая как текстура или карта среды).Установите один или больше
CISampler
объекты. Asampler
(нижний регистр «s»), источник данных для подпрограммы ядра. (Это определяется в Базовой Ссылке Языка Ядра Изображения.) ACISampler
объект является Базовым классом Изображения, инкапсулирующим asampler
, ссылается на файл для выборки выборок от, определяет координатное преобразование (если таковые имеются) для использования на выборках и определяет режимы для использования для интерполяции и обертывания. На источник данных ссылается aCISampler
объект может быть текстурой, картой среды, изображение для обработки, таблица поиска — независимо от того, что необходимоkernel
подпрограмма.Установите один или больше
CIKernel
объекты. Akernel
(нижний регистр «k»), относится к подпрограмме ядра. (Это определяется в Базовой Ссылке Языка Ядра Изображения.) ACIKernel
объект является Базовым классом Изображения, инкапсулирующим файл ядра, ссылки каждый изkernel
подпрограммы в файле и определяют метод области интереса для каждого изkernel
подпрограммы, который требует такого метода.Установите метод области интереса и любые входные параметры, требуемые для того метода. Область интереса (ROI) определяет область в исходном изображении, из которого сэмплер берет информацию о пикселе для обеспечения для ядра для обработки. Простые фильтры — тем, для которых существует 1:1 отображающийся между источником и целевым пикселем — не нужен метод для вычисления области интереса, потому что Базовое Изображение принимает 1:1 отображение, если Вы не предоставляете метод ROI. Дополнительную информацию см. в Методах Области интереса.
Установите входные параметры для
kernel
подпрограмма. Часть Objective C модуля изображения - то, где Вы выполняете все вычисления, возможные так, чтобы значения Вы передалиkernel
подпрограмма готова использовать. Например, Вы могли вычислить радиус эффекта в части Objective C, а не передать диаметр ядру и выполнить вычисление радиуса в ядре. Таким образом, вычисление выполняется только один раз, а не для каждого пикселя, это обрабатывается.Применяйтесь
kernel
подпрограмма. Можно вызвать akernel
подпрограмма несколько раз (как Вы могли бы для эффектов, требующих итерации, такой как эффект размытия). Можно использовать больше чем одинkernel
подпрограмма для обработки изображения. Можно также объединить Вашkernel
подпрограмма с эффектом, произведенным одним из встроенных Базовых фильтров Изображения.
Правила подпрограммы ядра
A kernel
подпрограмма походит на работника на конвейере — она специализируется на фокусируемой задаче. Каждый раз, когда подпрограмма вызывается, она производит a vec4
тип данных от материалов (входные параметры) данный ему. Подпрограмма должна выполнить как можно меньше работы, чтобы быть эффективной. Когда работники используют заранее смонтированные субкомпоненты, конвейерная работа идет самая быстрая. Это - также истина kernel
подпрограммы. Что-либо, что может быть вычислено заранее и передано подпрограмме, должно быть. Поскольку Вы становитесь более опытными при записи kernel
подпрограммы, Вы разработаете умные способы срезать код в подпрограмме. Примеры в записи Ядер должны дать Вам некоторое представление. Базовое Изображение также помогает в этом отношении путем ограничения того, какие виды операций могут быть сделаны в a kernel
подпрограмма.
Помните следующий, как Вы разрабатываете и пишете kernel
подпрограммы:
Операторы управления потоком (
if
,for
,while
,do while
) поддерживаются только, когда условие цикла может быть выведено в это время компиляции кода.Входные параметры к a
kernel
подпрограмма может быть любым из этих типов данных:sampler
,__table sampler
,__color
,float
,vec2
,vec3
, илиvec4
. Однако, когда Вы применяете akernel
подпрограмма в части Objective C модуля изображения, необходимо предоставить объекты. Посмотрите Таблицу 1-1.A
kernel
подпрограмма не берет изображения в качестве входных параметров. Вместо этого это берет asampler
объект это связано с изображением. Это - заданиеsampler
возразите, чтобы выбрать данные изображения и обеспечить их дляkernel
подпрограмма. Всеsampler
объекты устанавливаются какCISampler
объекты в части Objective C модуля изображения. Посмотрите Разделение труда.Вы ограничиваетесь использованием, что описано в Базовой Ссылке Языка Ядра Изображения. Core Image Kernel Language (CIKL) является подмножеством Языка Штриховки OpenGL (glslang), таким образом, не все, это определяется glslang, позволяется CIKL. Однако Вы найдете, что большинство ключевых слов в gslang доступно Вам. Кроме того, CIKL обеспечивает много типов данных, ключевых слов и функций, которые не доступны в glslang.
Вы не можете использовать массивы.
A
kernel
подпрограмма вычисляет выходной пиксель при помощи обратного отображения назад к соответствующим пикселям входных изображений. Несмотря на то, что можно выразить большинство пиксельных вычислений этот путь — некоторые более естественно, чем другие — существуют некоторые операции обработки изображений, для которых это трудно, если не невозможный. Например, вычисления гистограммы трудно описать как обратное отображение к исходному изображению. Вы также не можете выполнить заливки семени или любые операции анализа изображения, требующие сложных условных операторов.Если Вы разворачиваете циклы, подпрограмма быстрее.
Таблица 1-1 перечисляет допустимые входные параметры для a kernel
подпрограмма и связанные объекты, которые должны быть переданы подпрограмме ядра от части Objective C модуля изображения. Базовое Изображение извлекает надлежащий базовый тип данных из высокоуровневого объекта Objective C, который Вы предоставляете. Если Вы не используете объект, фильтр может неожиданно выйти. Например, если, в части Objective C модуля изображения, Вы передаете значение с плавающей точкой непосредственно вместо того, чтобы упаковать его как NSNumber
объект, Ваш фильтр не будет работать. Фактически, когда Вы используете инструмент Image Unit Validator на таком модуле изображения, сбоях модуля изображения с загадочным сообщением. (См. Проверку Модуля Изображения.)
Входной параметр подпрограммы ядра | Объект |
---|---|
|
|
|
|
|
|
|
|
|
|
Методы области интереса
Область интереса (ROI) является областью исходных данных сэмплера, которые Ваше ядро использует для его обработки на пиксель. A kernel
подпрограмма всегда возвращает a vec4
тип данных — т.е. один пиксель. Однако подпрограмма может воздействовать на любое число пикселей для создания этого vec4
тип данных. Если отображение между источником и местом назначения не является непосредственным, то необходимо определить метод области интереса в файле фильтра Objective C.
Вам не нужен метод ROI когда a kernel
подпрограмма:
Обрабатывает пиксель от координаты рабочей области (r, s) сэмплера для создания пикселя в координате рабочей области (r, s) в конечном изображении.
Необходимо предоставить метод ROI когда a kernel
подпрограмма:
Использование много исходных пикселей в вычислении одного целевого пикселя. Например, фильтр искажения мог бы использовать пиксель (r, s) и его соседи из исходного изображения для создания единственного пикселя (r, s) в конечном изображении.
Значения использования, предоставленные a
sampler
это не связано с координатами рабочей области в исходном изображении и месте назначения. Например, текстура, шкала цветов или таблица, приближающая функцию, обеспечивают значения, которые не связаны с понятием рабочих координат.
Вы предоставляете метод ROI для каждого kernel
подпрограмма в модуле изображения, которому нужны Вы. (Модуль изображения может содержать один или больше kernel
подпрограммы.) Каждый метод ROI, который Вы предоставляете, должен использовать сигнатуру метода следующей формы:
- (CGRect) regionOf:(int)samplerIndex |
destRect:(CGRect)r |
userInfo:obj; |
Можно заменить regionOf
с надлежащим именем. Например, метод ROI для фильтра размытия можно было назвать blurROI:destRect:userInfo:
.
Базовое Изображение вызывает Ваш метод ROI в надлежащих случаях, передавая ему sampler
индекс (о котором Вы узнаете больше позже), прямоугольник для области, представляемой, и любые данные, которые необходимы Вашей подпрограмме. Метод должен определить ROI для каждого sampler
источник данных, используемый kernel
подпрограмма. Если a sampler
источник данных, используемый kernel
подпрограмма не требует метода ROI, тогда можно пасовать назад destRect
прямоугольник для этого sampler
. Вы просто проверяете samplerIndex
значение передало методу. Если вычисление ROI является потребностью в sampler
, выполните вычисление и пасуйте назад надлежащий прямоугольник. Если вычисление ROI не необходимо для той детали sampler
, тогда пасуйте назад destRect
переданный методу.
Например, если Ваш kernel
стандартные пиксели доступов в радиусе r
вокруг текущей цели необходимо сместить целевой прямоугольник в методе ROI радиусом r
. Вы будете видеть, как все это работает более подробно позже.
Следующие шаги
Теперь, когда у Вас есть общее представление о том, что главные части модуля изображения и что каждый делает, Вы готовы идти дальше к записи kernel
подпрограммы. Запись Ядер запускается с некоторых простых kernel
подпрограммы и прогресс к более сложным. Не только будет Вы se, как записать kernel
подпрограммы, но Вы будете видеть, как можно протестировать простой kernel
подпрограммы без потребности обеспечить код Objective C.