Что случилось с CITemperatureAndTint, имеющими векторные входные данные?

#opengl-es #colors #ios5 #core-image

#opengl-es #Цвет #ios5 #core-image

Вопрос:

Итак, температура и оттенок основного фильтра изображения имеют два входа: нейтральный и целевой нейтральный. Однако моя самая большая проблема заключается в том, что оба они являются двухкомпонентными векторами, то есть каждый имеет два числовых ввода. Я бы ожидал, что первое будет, скажем, от 2500 до 10000. Для чего нужен вектор?

Ответ №1:

Основная цель настройки температуры и оттенков — исправить баланс белого на захваченном изображении: учесть окружающее освещение сцены и настроить цвета, чтобы изображение выглядело так, как будто оно было снято при «белом» освещении (примерно 6500 К).

Температура относится к теплоте или прохладе изображения и обычно качественно характеризуется как оранжевая или голубоватая.

Оттенок относится к отклонению в сторону зеленого или пурпурного цветов при той же температуре. Обратите внимание, что оттенок (определенный как таковой) в основном не зависит от цветовой температуры. (Взгляните на диаграмму CIE с локусом Планка и нарисованными на ней изотермами, чтобы развить свою интуицию по этому поводу. Вот один из них: http://en.wikipedia.org/wiki/File:Planckian-locus.png ).

Итак, если вы заинтересованы в настройке баланса белого (для придания изображению более реалистичного вида или в художественных целях), вы должны указать четыре различных параметра: температуру исходного изображения, оттенок точки белого, как она отображается на исходном изображении, желаемый цветтемпература выходного изображения и то, как сдвинутые оттенки «нейтральных» тонов должны отображаться в выходном изображении. Комбинация температуры и оттенка изображения зависит от окружающего освещения в сцене и реакции отображаемого материала, и как температура, так и оттенок необходимы для осмысленной характеристики баланса белого захваченного изображения.

Вот почему CITemperatureAndTint требуется два вектора: ему нужны две пары (температура, оттенок), только что описанные.

Теперь, если вы хотите создать пользовательский интерфейс для управления балансом белого, вам на самом деле не нужно предоставлять пользователю управление всеми четырьмя из этих значений. Вместо этого удерживайте второй вектор ( TargetNeutral ) на постоянном (6500, 0) и разрешите пользователю настраивать другой вектор ( Neutral ). При таком расположении пользователь будет выбирать воспринимаемую цветовую температуру и сдвиг оттенков исходного изображения. (Вместо этого вы можете сохранить Neutral вектор постоянным и позволить пользователю настраивать Target Neutral вектор; это может быть более уместно в контекстах, когда пользователь хочет художественно настроить баланс белого, но корреляция между выбранными значениями и результирующим изображением не так очевидна).

Комментарии:

1. Большое спасибо за отличное объяснение. Apple должна быть настолько описательной в своей документации.

2. Каковы диапазоны этих значений? Я новичок в обработке изображений, и мне интересно, какова область действия этих фильтров. Есть какая-нибудь документация о том, в каких измеряются «температура» и «оттенок»?

3. Температура измеряется в Кельвинах и представляет собой «температуру» источника света, смоделированную излучателем черного тела. Фильтр позволит ему варьироваться от 2000 до положительной бесконечности, но 10000 — более полезная верхняя граница. Оттенок не имеет единиц измерения и колеблется примерно от -100 (очень зеленый) до 100 (очень пурпурный). Значения за пределами этого диапазона разрешены, но они приводят к очень сильным искажениям.

Ответ №2:

@warrenm сказал очень подробно, я добавлю код для тех, кому нужно использовать его напрямую!

Температура:

 var value: CGFloat = 0  // Min: -3000, Max: 3000

return image.applyingFilter("CITemperatureAndTint", parameters: [
             "inputNeutral": CIVector.init(x: value   6500, y: 0),
             "inputTargetNeutral": CIVector.init(x: 6500, y: 0)
         ])
  

Оттенок:

 var value: CGFloat = 0  // Min: -100, Max: 100

return image.applyingFilter("CITemperatureAndTint", parameters: [
            "inputNeutral": CIVector.init(x: 6500, y: value),
            "inputTargetNeutral": CIVector.init(x: 6500, y: 0)
        ])