OpenColorIO и Krita: обработка и рисование HDR изображений

Изображениями с широким динамическим диапазоном уже никого не удивишь. Наверное каждый хотя бы раз в своей жизни пробовал создать HDR фотографию. Однако мало кто знает, что в индустрии кино эта технология используется уже больше десяти лет, и все рабочие процессы конвейера, начиная от создания текстур и заканчивая рендерингом готовой сцены, тесно связаны с работой в линейных цветовых пространствах, представленных числами с плавающей запятой.

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

Что такое OpenColorIO?


OpenColorIO (OCIO) — это библиотека, обеспечивающая работу с цветом в индустрии кино. В частности, она использовалась при создании фильмов Человек-паук 2 (2004) и Алиса в стране чудес (2010). OpenColorIO предназначена для преобразования всех цветовых пространств, которые встречаются по ходу продвижения изображения по конвейеру.

Пример. Текстурировщик создал текстуру в цветовом пространстве sRGB, 8-бит на канал. При движении дальше по конвейеру текстура попадает к моделлеру, который, чтобы наложить ее на модель, переводит ее в линейный RGB, 16-бит с плавающей запятой. Рендеринг сцены происходит опять же в линейном RGB, 32-бит с плавающей запятой, и конечный результат переводится обратно в sRGB8, чтобы его можно было показать на стандартном мониторе.

Для размышлений на досуге
Почему перед наложением текстуры на модель и, в частности, перед генерацией мипмапов (MIP-пирамиды) текстура должна быть переведена в линейное цветовое пространство? Чем грозит sRGB?

Очевидно, что все эти преобразования должны как-то описываться. Более того, желательно, чтобы они описывались централизованно, ведь над одним фильмом может работать не просто несколько человек, а несколько команд или даже компаний, в каждой из которых свои правила и стандарты. Эту задачу как раз и решает OpenColorIO.

Все параметры рабочего процесса в OpenColorIO определяет т.н. кофигурация, которая обычно представляет собой просто каталог с текстовым файлом config.ocio и файлами таблиц преобразования цвета (look-up table, LUT). В файле конфигурации описываются все преобразования между цветовыми пространствами, использующимися в конвейере. Так что чтобы обеспечить единообразную работу с цветом для всех исполнителей, будет достаточно разослать им эту конфигурацию и попросить прописать путь к ней в переменной окружения $OCIO. Все поддерживающие OCIO приложения прочитают эту переменную и автоматически будут использовать правильные настройки.

Примеры конфигураций можно найти на официальном сайте.

Почему не ICC?


Многие, вероятно, уже задались вопросом, зачем нужен этот OpenColorIO, когда есть механизм ICC-профилей, стандартизированный Международным Консорциумом по Цвету?
Много-много технических подробностей для интересующихся
Да, действительно, ICC-профили решают похожую задачу. Они тоже описывают, как преобразовать цвет из пространства А в пространство Б. Но у них есть одна особенность: все связи в них осуществляются через абсолютные пространства L*a*b или CIE XYZ. Это было сделано специально. При использовании ICC-профилей пользователь хочет, чтобы на всех устройствах вывода его изображение выглядело одинаково. Причем доступа к самим устройствам у пользователя, скорее всего, нет. Они могут находиться на другом конце улицы (города, страны или земного шара), но изображение все-равно должно выглядеть одинаково. В таком случае без привязки к эталонным цветовым пространствам не обойтись.

В случае же с процессом создания кино все выглядит несколько по-другому. Задача связать разные устройства вывода отходит на второй план (с профилированием мониторов в профессиональной студии уж как-нибудь да справятся), однако появляется новое требование: преобразования должны проходить без потерь. Более того, для них должны существовать обратные преобразования, которые также не приводят к искажениям. Действительно, рассмотрим простой пример. После сканирования с пленки мы получаем файл в логарифмическом цветовом пространстве, затем преобразуем его в линейное, чтобы выполнить композитинг, а после, чтобы отобразить на мониторе применяем обратное преобразование с показателем степени 2.2. Очевидно, что при таких преобразованиях, погрешности в светах на 1 бит (244<->255) после применения степенной функции приведут к хорошо заметным артефактам при просмотре.

Здесь на сцену и выходит OpenColorIO с его централизацией. Все цветовые пространства, с которыми будут работать на каждом этапе создания фильма проектируются до старта работ. Преобразования между ними выбираются взаимно однозначными так, чтобы изображение могло без потерь передвигаться как вдоль конвейера, так и в обратную сторону. Эти преобразования задаются напрямую, без использования привязок к эталонным пространствам L*a*b или CIE XYZ, которые моментально привнесли бы множество проблем (как минимум, постоянная конвертация значения белой точки туда-обратно, для L*a*b и CIE XYZ она определена стандартом — D50). Так что преобразования в OpenColorIO получаются проще и зачастую описываются простыми математическими выражениями.

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

В какой-то степени OpenColorIO принадлежит более низкому уровню абстракций, нежели ICC, примерно как ассемблер находится ниже языков высокого уровня. Точно так же художник, используя OpenColoIO, получает гораздо больше возможностей, недоступных в высокоуровневых инструментах. Конечно, ценою больших знаний и некоторого усложнения используемых концепций.

Scene-referred vs. output-referred workflow


Большинство людей привыкли считать, что ICC-профили и вся эта затея с менеджментом цвета нужна лишь для того, чтобы правильно вывести файл на принтер (минилаб, типографию). В целом, они правы. Такой рабочий процесс, когда файл готовится к конкретному устройству вывода обычно называют устройство-ориентированным (output-referred workflow). Однако что делать, если ваша картинка будет в итоге выведена на множество носителей? К примеру, сцена из фильма будет выведена как минимум на монитор, проектор и пленку. У каждого из устройств свои характеристики, своя гамма и свой динамический диапазон. Какое рабочее пространство выбрать и как с ним работать?

Чтобы решить эту проблему, при создании фильмов пошли другим путем. Вся работа происходит в линейном RGB пространстве с неограниченным динамическим диапазоном (значения RGB каналов могут легко превышать 1.0). Рендеринг, генерация спецэффектов, все происходит в этом искусственном пространстве, и лишь на финальной стадии проекта, когда нужно вывести изображение на конкретное устройство, его приводят к стандартному диапазону 0.0...1.0 (сжимают или обрезают) и отправляют на устройство. Такой рабочий процесс называется сцено-ориентированным (scene-referred).

Возможности Криты по работе с цветом


Крита поддерживает работу как в устройство-ориентированным, так и сцено-ориентированном рабочем процессе. При этом поддерживается работа как с ICC-профилями, так и с глобальными настройками OpenColorIO. Далее рассмотри оба варианта настройки Криты.

Подключение данных о калибрации и профилировании монитора к Крите (ICC-профиль)

При отключенном OCIO или если OCIO работает в режиме Internal, для рендеринга изображения на экране Крита использует ICC-профиль, указанный в настройках (или полученный от X-сервера). Чтобы получить точное воспроизведение цветов, необходимо выполнить несколько несложных шагов:

  1. Откалибровать монитор и построить его профиль. Под Linux это можно сделать с помощью dispcalGUI (проверено с X-Rite i1Display 2) На выходе будет получен ICC-профиль.
  2. Загрузить VCGT-tag (Video Card Gamma Table), хранящийся в ICC профиле, в LUT видеокарты. Под Linux это можно сделать программами xcalib или dispwin. Под Windows достаточно выбрать его в системных настройках. На этом этапе монитор станет откалиброванным, но данные профилирования еще не будут активны.
  3. Выбрать профиль монитора в настройках Криты: Preferences->Color Management.

Теперь цвет всех изображений будет отображаться корректно.

Создание конфигурации OpenColorIO с данными о профиле монитора

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

Работа с OpenColorIO несколько сложнее, чем с ICC, т.к. нужно явно создавать преобразование для каждого входного цветового пространства, которое мы будем использовать. Создадим преобразование, которое бы конвертировало цвета из sRGB в пространство монитора.

Для этого нам нужно создать 3D LUT таблицу этого преобразования. В dispcalGUI выбираем Tools->Create 3D LUT, в качестве исходного пространства выберем sRGB, в качестве целевого — ICC-профиль монитора. Полученный файл сохраняем в подкаталог luts тестовой конфигурации под именем srgb_to_monitor.3dl. Теперь, при активации этой конфигурации, цветовое пространство изображения будет преобразовываться в пространство монитора средствами OpenColorIO. Если активен режим openGL, то все вычисления будут проходить на GPU.

Рисование HDR изображений в Крите


Обычный монитор явно не является HDR устройством, поэтому для отображения на экране и редактирования файла с широким динамическим диапазоном используются специальные уловки. Художник, работая с произведением, может выбирать, с какой частью диапазона он хочет работать в данный момент. Для этого у него имеются настройки Экспозиции и Гамма-коррекции, которые применяются только при рендеринге на дисплее и никак не влияют на данные, хранящиеся в файле. Изменение экспозиции сжимает или наоборот растягивает диапазон, а изменение значения гаммы, меняет крутизну кривой преобразования. Изменять текущее значение экспозиции можно простым жестом: для этого достаточно зажать клавишу 'Y' и потянуть мышью за холст. Экспозиция будет меняться динамически. Аналогичный жест можно назначить и для изменения гаммы.

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

Таким образом, Крита позволяет рисовать изображение, никак не задумываясь о текущем значении экспозиции. Просто меняем текущий диапазон жестом и рисуем.

Бонус для дочитавших до конца:

HDR пейзаж от Wolthera van Hövell tot Westerflier


HDR сцена от Timothée Giet


Вместо заключения


В этой статье я попытался рассказать, какие методы работы с изображениями используют в индустрии кино и какой функционал по поддержке этих процессов предлагает Крита.
Этот функционал был добавлен в основную ветку совсем недавно и многие вещи требуют улучшения в плане удобства работы для пользователя. Мы работаем над этим и принимаем любые пожелания по этому поводу.
  • +25
  • 6.8k
  • 8
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 8

    0
    Спасибо за пост!

    А есть какие-либо ещё альтернативы?
    (Я полный профан в этой области, но мне очень любопытно :) )

    И вопрос по немного вбок: как много ресурсов «едят» профессиональные редакторы? Например ваша Крита?
      +2
      В полиграфии альтернативы ICC, кажется, нет. В киноиндустрии все сложно. Насколько я знаю, форматы Cineon и DPX имеют собственное описание цветовых пространств, а большинство видеоприложений до появления OpenColorIO реализовали работу с цветом самостоятельно.

      Крита ест столько, сколько дадите. В конфиге по умолчанию прописано, что 50% RAM, больше не брать и сбрасывать на диск. Это было сделано целенаправленно, чтобы быстрее работало. Сейчас мы это как раз обсуждаем, думаем, как бы это поменять, т.к. люди такого поведения часто пугаются.

        0
        У меня дешёвенький слабенький asus atom T101 MT
        market.yandex.ru/forums?modelid=7802346&hid=91013&clid=703
        Профит в развароте экрана + возможность ввода с экрана.

        Винда глючит ужасно. Снёс её к чёрту, поставил Xubuntu. Перестала глючить и даже позволяет рисовать в гимпе…
        Вот думаю, потянет ли что-то посерьёзнее.

        Мне не для дела — так побаловаться и сестрёнку порадовать.

        Поэтому и спрашиваю у вас как у спеца, имеет ли хотябы теоретический смысл пошаманить в настройках линукса?
        Или профредакторы и даже любительские настолько мощные, что надо машинку брать посерьёзнее…
          0
          Ну по хорошему, конечно, да. Но можете поставить Криту Лайм. В моем старом посте описано как:

          dimula73.blogspot.ru/2013/05/krita-lime-ppa-always-fresh-versions.html

          Большие и сложные кисти могут немного подтормаживать, а так работать должно вполне.
      0
      Если я правильно понимаю к этому можно прикрутить грамотный тонмэпинг и получать привлекательную картинку, особенно для дешевых мониторов.
        +1
        Формально, да. Единственная проблема с точки зрения технологичности, что тонмэппинг меняет даже те цвета, которые укладываются в диапазон, а это может не понравиться художникам.

        Плюс чисто технически, мне кажется (могу ошибаться), тонмэппинг зависит от распределения цветов всего изображения. Т.е. при изменении одного пиксела, меняется преобразование для всего изображения, и его нужно пересчитывать. Для пользователя это может выглядеть примерно так: изменил кусок в правом углу, в результате поменялась яркость области в левом углу.

        У нас был такой случай, когда мы случайно разрешили использование фильтра «Autocontrast» в фильтрующих слоях, под которыми можно рисовать…

        А про дешевые мониторы… Теоретически, Relative Colorimetric должен делать как раз именно это… :)
        0
        А эта библиотека вообще жива?
        http://opencolorio.org/ChangeLog.html
          0
          У разработчиков библиотеки сейчас какие-то проблемы, однако это не мешает пользователям. Ее используют практически везде. Насколько я понимаю, даже современный ACES-workflow на ней построен.

        Only users with full accounts can post comments. Log in, please.