FFmpeg | Удобная цветокоррекция с помощью LUT
от aNNiMON
В статье про цветокоррекцию мы узнали, что ffmpeg обладаем богатыми возможностями цветокоррекции. Однако на практике подбирать значения долго, даже если использовать ffplay.
Есть и другой способ цветокоррекции — Color Lookup Table или LUT.
LUT представляет собой файл, в котором в таблицу записаны значения исходных и результирующих цветов. Фильтр будет брать цвета из видео, искать соответствующий новый цвет в таблице цветов и записывать его в результирующее видео.
LUT используется не только в ffmpeg, но и во всех уважающих себя графических и видеоредакторах, поэтому эти файлы широко распространены и имеют расширение *.3ds (After Effects), *.cube (самый распространённый), *.dat (DaVinci Resolve) и другие. Основная проблема в том, что LUT платные и дорогие, но есть и бесплатные, хоть на многих сайтах и требуют регистрацию. Сэкономлю вам время
https://www.shutterstock.com/blog/free-luts-for-log-footage
Чтобы применить LUT используется фильтр lut3d:
Внимательно следите, что фильтр не изменил формат пикселей с yuv420 на yuv444 (не распознаётся браузерами). Чтобы это исправить, добавьте -pix_fmt yuv420p
Пример. Видео от Whizbhagz из Pexels. До:
После:
Свой LUT в Photoshop
Однако, для ваших нужд под рукой может не оказаться подходящего LUT файла. В таком случае, его можно сделать самим. Нам потребуется скриншот видео:
Открываем изображение и, используя Adjustment Layers, доводим до приемлемого вида

Например, добавить побольше синего и немного затемнить, чтобы было ощущение глубины океана.

Экспортируем File -> Export -> Color Lookup Tables, выбираем разрешение (чем выше, тем точнее цветопередача, но и файл больше) и сохраняем.


Получился такой файл
deepocean.cube.gz
Применяем:
Было так:
Свой LUT в G'mic (Krita/GIMP)
В G'mic всё ещё проще, поскольку ему не нужны специальные корректирующие слои. Открываем изображение, дублируем слой и ему изменяем цвета любыми доступными плагинами. Например, в этот раз я хочу всем цветам снизить насыщенность, но цвета рыбки (оранжевый и голубой) оставить. Да и оранжевый можно превратить в красный. Этого можно добиться при помощи Conditional Hue/Saturation фильтра (в Krita его вроде бы нет).
Теперь генерируем LUT.
Сразу же убедитесь, что у нас всего 2 слоя и что активен нижний слой.

Идём в Filter - Start G'MIC Qt

И ищем там CLUT From After - Before Layers. Указываем параметры и обязательно внизу Input Layers: Active and above.

Сохраняем файл.
fishaccent.cube.gz
Применяем:
Было так:
Также LUT можно сгенерировать без редакторов, при помощи скрипта https://github.com/EinExperte/lutcraft
Есть и другой способ цветокоррекции — Color Lookup Table или LUT.

LUT представляет собой файл, в котором в таблицу записаны значения исходных и результирующих цветов. Фильтр будет брать цвета из видео, искать соответствующий новый цвет в таблице цветов и записывать его в результирующее видео.
LUT используется не только в ffmpeg, но и во всех уважающих себя графических и видеоредакторах, поэтому эти файлы широко распространены и имеют расширение *.3ds (After Effects), *.cube (самый распространённый), *.dat (DaVinci Resolve) и другие. Основная проблема в том, что LUT платные и дорогие, но есть и бесплатные, хоть на многих сайтах и требуют регистрацию. Сэкономлю вам время

Чтобы применить LUT используется фильтр lut3d:
- ffmpeg -i input.mp4 -vf lut3d=filename.cube result.mp4
- ffmpeg -i input.mp4 -vf lut3d=filename.cube -pix_fmt yuv420p result.mp4
Пример. Видео от Whizbhagz из Pexels. До:
После:
- ffmpeg -i input.mp4 -vf lut3d=OrangeAndBlue.cube result.mp4
Свой LUT в Photoshop
Однако, для ваших нужд под рукой может не оказаться подходящего LUT файла. В таком случае, его можно сделать самим. Нам потребуется скриншот видео:
- ffmpeg -ss 4 -i input.mp4 -frames:v 1 img.jpg
Открываем изображение и, используя Adjustment Layers, доводим до приемлемого вида

Например, добавить побольше синего и немного затемнить, чтобы было ощущение глубины океана.

Экспортируем File -> Export -> Color Lookup Tables, выбираем разрешение (чем выше, тем точнее цветопередача, но и файл больше) и сохраняем.


Получился такой файл

Применяем:
- ffmpeg -i input.mp4 -vf lut3d=deepocean.cube lut_deepocean.mp4
Было так:
Свой LUT в G'mic (Krita/GIMP)
В G'mic всё ещё проще, поскольку ему не нужны специальные корректирующие слои. Открываем изображение, дублируем слой и ему изменяем цвета любыми доступными плагинами. Например, в этот раз я хочу всем цветам снизить насыщенность, но цвета рыбки (оранжевый и голубой) оставить. Да и оранжевый можно превратить в красный. Этого можно добиться при помощи Conditional Hue/Saturation фильтра (в Krita его вроде бы нет).
Теперь генерируем LUT.
Сразу же убедитесь, что у нас всего 2 слоя и что активен нижний слой.

Идём в Filter - Start G'MIC Qt

И ищем там CLUT From After - Before Layers. Указываем параметры и обязательно внизу Input Layers: Active and above.

Сохраняем файл.

Применяем:
- ffmpeg -i input.mp4 -vf lut3d=fishaccent.cube lut_fishaccent.mp4
Было так:
Также LUT можно сгенерировать без редакторов, при помощи скрипта https://github.com/EinExperte/lutcraft