Блог Chobial

Создание плёночных стилей: расчёт имитаций по снимкам

·

Встроенные плёнки Chobial не подбирались на глаз и не скачивались в виде готовых LUT. Каждая из них была математически рассчитана по реальным фотографиям: один файл RAW с камеры Fujifilm проявлялся прямо в камере дважды — нейтрально и с имитацией плёнки, а затем разница измерялась в цветовом пространстве CIELAB. Принцип формулируется просто. Но большая часть этой статьи посвящена тому, как этот процесс даёт сбои.

Методика разрабатывалась на камере Fujifilm X-T30 III в сентябре 2026 года, и приведённые ниже цифры получены на этом этапе. Позже большинство плёнок были пересчитаны тем же методом на камере X100VI по серии из 31 кадра.

1. Получение парных кадров

Краткая суть: снять одну сцену, проявить её дважды внутри той же камеры — нейтрально и с нужным стилем, а затем математически вычислить разницу.

Ключевое слово здесь — проявить. Камеры Fujifilm умеют перепроявлять файлы RAF прямо на карте памяти, поэтому мы сняли серию кадров в RAW, а затем многократно проявляли один и тот же файл: один раз с профилем Provia со стандартными настройками в качестве нейтрального эталона, и один раз с каждой имитацией — также с заводскими параметрами. «Цвет 0», «Света 0», «Тени 0», зерно отключено, Color Chrome выключен, без сдвига баланса белого. Одинаковые исходные данные матрицы, одинаковая экспозиция и баланс белого: меняется исключительно стиль. Десять минут работы с камерой заменяют сотню тестовых вылазок, полностью исключая любые побочные факторы.

Стандартные настройки принципиально важны. Оставьте регулятор светов рецепта на −1 — и вы измерите имитацию вместе со своим рецептом, намертво зашив его в плёнку. Четыре наших профиля — в стиле Gold, Kodachrome, Ektachrome и Chobial Vintage (на базе рецепта Classic Negative) — были намеренно рассчитаны по рецептам, а не по стандартным профилям. Это было осознанным решением, а не случайностью.

Связывайте пары кадров сравнением пикселей, а не по именам файлов. Мы сопоставляли компактные сигнатуры яркости по четырём ориентациям. Имена файлов могут обмануть, пиксели — никогда.

2. Что фотографировать: главное ограничение метода

Пять вечерних кадров в парке и кафе покрыли всего 5.8% цветового куба 33×33×33. У двух третей их пикселей цветовая насыщенность CIELAB (C*) была ниже 8, то есть они были практически серыми. Бирюзовый, фиолетовый и пурпурный оттенки составили 0.12%, 0.03% и 0.01% от общего числа пикселей. Параметр, за которым нет данных, примет любое значение в угоду соседям: одна из первых итераций расчёта выдала поворот оттенка пурпурного на 58 градусов при практическом отсутствии пурпурного в кадре.

Вывод: снимайте цветовую шкалу (ColorChecker). Один кадр 24-польной мишени содержит больше полезной цветовой информации, чем все пять тех сцен вместе взятых, причём покрывает именно те цвета, которых нет в обычном сюжете. Если мишени нет под рукой, обязательно включайте в кадр при дневном свете насыщенное синее небо, красные и бирюзовые объекты, листву, кожу и белый эталон.

3. Сравнивайте с нейтралью камеры, а не со своей

Очевидный соблазн — взять исходный RAW, проявить его собственным нейтральным алгоритмом и рассчитать переход от него к имитации Fujifilm. Но это замеряет две вещи сразу: саму имитацию и все отличия нашего RAW-движка от алгоритмов Fujifilm. Вторая составляющая вполне реальна, но она принадлежит именно той камере. Перенесите её в профиль — и вы примените поправку сенсора Fujifilm к смартфону iPhone, чья нейтральная проявка устроена совершенно иначе.

Ошибка проявилась мгновенно: расчёт Provia относительно нашего нейтрального RAW выдал масштаб насыщенности 0.98 и повороты оттенков до 17 градусов — нейтраль спорила с нейтралью. Ту же погрешность унаследовала каждая имитация. Когда мы перешли к расчёту «Provia к имитации», где оба кадра сформированы процессором камеры, погрешность исчезла, а средняя ошибка на имитациях сразу упала с 3.7–5.2 ΔE до 1.3–3.5.

Кроме того, это даёт идеальный тест: рассчитайте Provia относительно Provia. Ответ обязан быть строго ΔE 0.000, масштаб цветности 1.0000, поворот оттенка 0.00. Это единственный случай с заранее известным результатом, и его проверка сразу помогла выявить реальную ошибку в коде.

4. Из чего состоит плёнка

Цветовая модель плёнки выстраивается по слоям в том же порядке, в каком их применяет приложение: сначала тоновые кривые, затем цвет.

Сначала кривые — по нейтральным тонам

Мастер-кривая, а также кривые красного и синего каналов строятся по околонейтральным пикселям (C* ниже 8). Они занимают больше половины площади кадра — десятки тысяч точек на корзину яркости против пары сотен для редких оттенков, что делает их самым надёжным источником данных.

Кривые несут в себе тональность плёнки и её оттенок на нейтральных серых тонах. Второй пункт важнее, чем кажется: модель цвета, работающая простым масштабированием насыщенности, бессильна на серых участках — у серого нет цветности, а ноль, умноженный на любое число, остаётся нулём. Некоторое время наши плёнки Chrome и Negative выглядели одинаково именно по этой причине: на большей части площади кадра коррекция не применялась вовсе, тогда как Fujifilm закладывает индивидуальный характер каждой имитации именно туда.

Поучительная ошибка. В первой версии распределение по корзинам яркости велось по уровню серого всего пикселя. Но околонейтральный пиксель не является идеально нейтральным. Медианные значения красного, зелёного и синего в корзине несли собственный случайный паразитный оттенок этой группы пикселей, и кривая накладывала этот оттенок сама на себя. Тест «Provia к Provia» выдал ошибку ΔE 1.4 вместо 0. Стоило распределять каждый канал по его собственному значению (как и работает наложение поканальной кривой), как контрольный расчёт вернул идеальный ноль.

Ещё одна ловушка: кривые красного и синего каналов должны рассчитываться относительно выхода мастер-кривой, а не исходного входа, поскольку общая тоновая кривая применяется первой и передаёт им свой результат.

Затем цвет, подогнанный сквозь кривые

Инвертируйте действие кривых на целевом изображении и оптимизируйте цветовой слой по оставшейся разнице. Попытка настраивать цвет параллельно с кривыми дважды учитывает влияние, которое кривые уже оказали на цветопередачу. На стиле Classic Negative это приводило к повороту синего цвета на +24 градуса там, где камера поворачивает его лишь на +11 градусов.

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

Обеим частям необходима регуляризация (ridge penalty), подтягивающая параметры к нейтрали. Оттенок, по которому нет данных в выборке, должен оставаться нетронутым. Тоновым слагаемым регуляризация нужна по другой причине: контраст средних тонов, точка чёрного и светов практически коллинеарны, и без штрафа алгоритм выдавал чудовищный контраст 2.2, скомпенсированный подъёмом теней на +59.

Черно-белое — отдельная задача

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

Тональность монохрома нельзя описать тремя коэффициентами. В чёрно-белой фотографии тон — это и есть вся суть плёнки, а длинное пологое плечо в тенях на треть динамического диапазона — как раз то, что усредняет упрощённая модель. На синтетической тестовой паре по пятиточечной кривой модель из трёх параметров определила веса каналов с точностью до четвёртого знака, но ошиблась по тону на 1.94 L*. Подгонка полноценной кривой снизила ошибку до 0.16.

5. Оценка результатов

Метрика — значение ΔE по реальным пикселям. А не пара контрольных точек «памятных цветов» вроде цвета неба, кожи и листвы. Три синтетические точки не отражают распределение, где две трети пикселей близки к нейтрали, и забракуют профиль ровно на тех участках, где он стал точнее. Наш негативный профиль снизил общую ошибку с 3.67 до 1.47 ΔE, тогда как три контрольные точки показали формальное ухудшение.

Разбивайте ошибку по диапазонам насыщенности. Изменение, улучшающее общую картину, но ломающее насыщенные цвета, недопустимо. Перерасчёт Classic Negative улучшил показатели во всех трёх диапазонах, что позволило выпустить его в релиз:

ДиапазонБыло (ΔE)Стало (ΔE)
Околонейтральный2.930.88
Умеренный цвет4.091.65
Насыщенный5.783.64

Сравнивайте профили между собой, а не только с оригиналом камеры. Поводом к переработке Negative стала жалоба пользователей: «Chrome и Negative выглядят одинаково». Чтобы проверить это, измерьте расстояние между двумя имитациями камеры (2.2–5.0 ΔE на наших тестах) и сравните с расстоянием между нашими профилями. Каждый профиль в отдельности может казаться точным, сливаясь при этом в один визуальный образ.

Сверяйтесь там, где данных мало. Камерные профили Adobe отстоят на шаг от оригинальной камеры, но поддаются точному измерению. Для Classic Negative они совпали с нашими кадрами в точке перехода тепла в холод (L* 46 против наших 47), в оттенке светов (44° против 44.6°) и в соотношении тёплых и холодных тонов примерно 2:1. Большинство публикаций о симуляциях плёнки носят чисто субъективный характер. Считайте любое утверждение фольклором, пока оно не подтверждено замерами. Например, «пурпурные света» Classic Negative, часто описываемые в статьях, на замерах нейтральных тонов оказываются янтарными с оттенком 44°.

6. Релиз профилей

Правила, которых мы строго придерживаемся:

Как оценить результат в Chobial

Продуктом этого процесса стали все встроенные плёнки — от Chobial Standard до Chobial B&W. Чтобы оценить их работу:

  1. Зарядите встроенную плёнку в камеру: она активна в видоискателе в реальном времени; удерживайте экран для просмотра сцены без неё.
  2. Откройте любое готовое фото, выберите инструмент Плёнка и переключайтесь между плёнками: кадр каждый раз перепроявляется заново из своего RAW (Проявить заново).
  3. Удерживайте кнопку Сравнить, чтобы увидеть чистую проявку, или коснитесь её для вызова ползунка до/после.
  4. Чтобы изменить профиль, создайте на его основе новую плёнку: Плёнки › + › Новая плёнка › Основа. Встроенные плёнки редактировать нельзя, но их копии поддаются любой настройке (Создание своей плёнки).

7. Что ещё предстоит улучшить

Ни один из этих шагов не делает профиль абсолютно идентичным камере. Но он создаёт профиль, отличия которого мы знаем и можем точно описать математически — в отличие от стилей, подобранных наугад. Цветовую часть любой плёнки можно экспортировать в виде файла .cube LUT для проверки в сторонних редакторах (создание LUT на iPhone), а плёночное зерно имеет собственную выверенную математическую кривую, о которой рассказано в статье о том, почему цифровое зерно выглядит фальшиво.

Fujifilm, Provia, Classic Chrome и Classic Negative являются товарными знаками FUJIFILM Corporation. Kodak, Gold, Kodachrome и Ektachrome являются товарными знаками Eastman Kodak Company. Chobial не связан ни с одной из этих компаний.

Вопросы

Можно ли рассчитать имитацию плёнки по фотографиям?

Да, если съёмка строго контролируется. Проявите один и тот же файл RAW в камере дважды — нейтрально и с имитацией плёнки: разница между ними и есть искомый стиль. Случайные фотографии, снятые в разные дни, смешивают стиль с экспозицией, балансом белого и сценой.

Почему бы просто не использовать LUT с имитацией плёнки?

Таблица LUT, рассчитанная по нескольким фотографиям, точна лишь там, где в кадре были соответствующие цвета, и ничего не знает об остальном цветовом кубе. Наши тестовые кадры покрыли всего 5.8% куба 33 точки. Компактная математическая модель с физическими параметрами деградирует мягче, чем LUT с тысячами узлов.

Плёнки Chobial в точности совпадают с имитациями Fujifilm?

Нет. Это наши собственные плёнки, рассчитанные по проявкам камеры Fujifilm и адаптированные под проявку RAW на iPhone. Они очень близки на измеренных кадрах, и мы открыто публикуем все расхождения.

Можно ли создать свою плёнку таким же способом?

Не через автоматический алгоритм в приложении. Но вы можете собрать плёнку вручную с помощью аналогичных инструментов (кривые, микшер цветов, раздельное тонирование); см. руководство «Создание своей плёнки».