Настал небольшой отпуск и я решил посмотреть наконец несколько фильмов. В процессе просмотра меня посетило ощущение, что в современных фильмах что-то не так, что раньше трава была зеленее и тому подобное. Больше всего выделялось то, что на экране большую часть времени очень мало цветов (как правило, вообще два, оранжевый и голубовато-зелёный).
Я в таких своих наблюдениях оказался совсем не одинок, вот, например, критическая статья о злоупотреблении этими вашими Голливудами оранжевым и голубовато-зелёным. Однако, одиночные кадры - это не серьёзно для доказательства. Тут нужен научный подход. Как астроном-любитель я знаю, что информацию о цвете чего-либо принято сравнивать в виде спектра.
Хочется получить такой вот примерно "спектр" для целого видео. Осталось придумать, как это сделать.
Идея
Упрощённо, видео есть последовательность изображений. Каждое изображение - массив RGB значений цветов пикселей. Можно заметить, что в спектре есть две оси: цвет (или длина волны) по горизонтали и уровень сигнала по вертикали. Значит, необходимо превратить трёхмерный (RGB) цвет в одномерный. И тут на помощь приходит цветовая модель HSL, где для цвета есть только одно измерение - Hue, в дополнение к Saturation и Lightness.
Теперь, для каждого пикселя видео и соответствующего ему значения "чистого цвета" (Hue) нужно определить вес чистого цвета на основе значений Saturation и Lightness. В случае с Saturation всё понятно и просто - вес должен быть пропорционален насыщенности цвета. С Lightness немножко сложнее: значения 0% и 100% будут соответствовать чёрному и белому цветам вне зависимости от значения Hue, поэтому максимальный вес (1) должен быть для значения Lightness = 50%, снижаясь "по краям" до 0, так как совсем светлые и совсем тёмные оттенки должны иметь меньший вес. Таким образом, можно вывести формулу уровня цветового сигнала:
W (S, L) = S * (0.52 - (0.5 - L)2) / 0.52
Это значение W (weight) будет численной мерой, показывающей, насколько данный цвет выглядит ярким и выраженным. Далее, для получения спектра достаточно сложить все полученные из пикселей веса (W). Стоит отдельно заметить то, что полученный "вес выразительности" цвета всё-таки субъективен, так как зависимость от яркости (L) может быть иной, например линейной. Или какой-нибудь ещё. Но я считаю свой вариант довольно честным.
Реализация
Осталось реализовать всё это в коде и я решил сделать это на Golang. К счастью, все необходимые биндинги для превращения видео в отдельные кадры, конвертации RGB в HSL и прочего уже доступны. Исходное видео конвертируется в кадры с разрешением 256х144, то есть ~37 килопикселей. Чтобы избежать слишком задумчивого переваривания при скармливании больших видеофайлов код может пропускать промежуточные кадры, чтобы не превысить лимит количества обрабатываемых кадров (хард код 2712 на данный момент). То есть любое видео будет ограничено более-менее равномерной выборкой из 100 миллионов пикселей. Для цветовой статистики вроде бы должно быть достаточно. Есть небольшая проблема, что не все промежуточные кадры одинаково полезны могут быть успешно сконвертированы. Судя по всему это происходит при попадании на не-ключевые кадры. Это может немного уменьшать выборку из-за ошибок.
Изначально это была консольная утилита, получающая на вход имя видеофайла и сохраняющая файл спектра в файл с тем же именем плюс расширение ".svg". Позже я также добавил простейший web-cервис и форму для upload видео файла в газоанализатор для получения "спектра". Сервис раздеплоен временно-бесплатно в первом попавшемся облаке, так что желающие могут попробовать немножко поэкспериментировать: https://moviespectrum.azurewebsites.net/.
На размер загружаемого видеофайла стоит ограничение 128 Мб, поэтому рекомендуется использовать не самое лучшее разрешение, тем более что оно слабо влияет на цветовую статистику и видео всё равно конвертируется в кадры 256х144 перед обработкой.
В облаке сервис работает на минимальных ресурсах и никак не приспособлен для масштабирования, так что если он вдруг приляжет вследствие хабраэффекта или по какой другой причине, то вы всегда можете собрать его из безисходников и запустить локально, например в докере: https://github.com/akurilov/moviespectrum
Также сначала была идея прикрутить это всё к тытубу, чтобы пользователь мог просто кинуть ссылку на видео, однако из-за инцидента с youtube-dl я решил не рисковать и отпилить всю подобную функциональность. Даже вспомнилось Unix-заклинание "один инструмент = одна функция" в качестве оправдания. Так что теперь придётся сначала скачать видео, а потом уже скармливать его.
Результаты
Возьмём в качестве baseline пару олдскульных фильмов и посмотрим на их "спектры".
1991 - Терминатор 2:
1994 - Форрест Гамп:
Теперь возьмём фильмы посвежее и сравним:
1999 - Матрица aka 50 оттенков зелёного, если не считать фиолетового артефакта:
2003 - Властелин колец:
2005 - Город грехов. В качестве малоцветного baseline:
2007 - Трансформеры. Очень малоцветный фильм, не считая фиолетового артефакта:
2009 - Аватар:
2013 - Обливион:
2019 - Джокер. Всё почти в красном цвете, но есть немножно зеленовато-голубого.
Выводы вы можете сделать самостоятельно. На мой взгляд, есть тенденция к обеднению цветов со временем.
Finesse
Это ведь общеизвестный стилистический приём в цветокоррекции, когда берутся 2 противоположных (в спектре) цвета и цвета в изображении подводят к ним. Это один из приёмов для превращения обычного видео в кино. Ещё со временем соотношение сторон изображение становится всё более вытянутым, но разве всё это делает фильмы хуже?
akurilov Автор
Да, оранжевый чтобы лица показывать и, соответственно, противоположный голубой для контраста. И никаких вам тут красных, синих, фиолетовых
Biga
Нетолерантно как-то. Фиолетовые цвета важны.
ivvi
#VioletColorsMatter
Stinkynnov
Teal&Orange — король цветокора, да.
В 2013 гражданин анализировал частоту цветов в 3 сотнях трейлеров
lair
Тут еще важно понимать, что трейлер — не фильм.
Stinkynnov
Без сомнения.
Но с большой долей вероятности в трейлере будет вытяжка из всего разнообразия сцен фильма.
lair
Совершенно не обязательно. У (хорошего) трейлера есть своя драматургия, и в него берут те сцены, которые этой драматургии (и замыслу) соответствуют (а те, которые не соответствуют — выбрасывают). И если мы хотим сделать трейлер про то, как все мрачно, то он может быть весь мрачный, даже если в фильме есть и противоположная точка зрения.
Вас же не удивляет, что в трейлерах музыка не совпадает с фильмом?
akurilov Автор
Тут тоже есть фиолетовый артифакт. Ровно на 120 градусов от него отстоят зелёный и красные пики. Интересно, что это за фигулина такая?
sumanai
В общем-то да, когда на моём 16:9 мониторе от фильма остаётся амбразура. Я уж молчу про свой старый 16:10, ИМХО, идеальная пропорция, но новых таких не делают.
lair
Ну вы просто по высоте умещайте и все. Будет то же самое, что и раньше.
sumanai
Будет обрезанная картинка. Плюс несоответствие по пикселям, более мыльная картинка.
lair
Ну тогда ой, просто возьмите монитор побольше. Works every time.
Кстати, внезапно, релизы для домашнего просмотра вполне себе бывают 16:9, даже если фильм был 23:10.
sumanai
До сих пор смотрю на свой 31 дюймовый как на слишком большой ))
Ладно, хоть аниме сериалы все 16:9, можно не заморачиваться.
lair
Если у вас получается амбразура, значит, он все еще недостаточно большой (или вы сидите недостаточно близко). У меня вот такой проблемы нет, но у меня экран раза в три побольше.
sumanai
Амбразура это условно. Я купил большую площадь экрана, а в итоге какой-нибудь новомодный фильм 40:1 использует 5% его площади ради непонятно чего, ибо 16:9 очень даже хорошее соотношение.
lair
Это оно для вас хорошее. А для авторского замысла — нет. У автора совершенно нет цели, чтобы вам было удобно знакомиться с его произведением на вашем экране.
sumanai
Думаю, кино вытянутое совершенно не из-за авторского замысла.
lair
Оно не всегда вытянутое из-за авторского замысла. Но тот факт, что в 2019 снимают кино с пропорциями 1.19:1, должен наводить на мысли, что замысел тоже может быть задействован.
sumanai
Факт того, что всё кино вытянуто более чем на 16:9 наталкивает на мысль, что это связано с кинотеатрами и прочими камерами. Ибо всегда мог бы найтись автор, которому хочется квадратного кино, но его почему-то не снимают.
lair
Подождите, я же вам только что привел пример фильма, который ближе к квадрату, чем "телевизионный" 4:3, и даже чем 5:4.
sumanai
На момент ответа там было 1:19:1, я и не распарсил.
lair
Окей, теперь распарсили. И что же делать с этим примером?
sumanai
Исключение только подтверждает правило ))
lair
Ну под этим соусом можно любой пример отвергнуть.
Boring.
tcapb1
На самом деле как раз сейчас всё больше контента снимается в пропорциях 16:9 или около (для кино это 1.85:1). Youtube, стриминговые платформы, сериалы. Как ни странно — цифровой IMAX туда же. Да и традиционное кино далеко не всё снимается для широких экранов. Я на своём мониторе 21:9 гораздо чаще вижу чёрные полосы по бокам, чем не вижу.
lair
Цифровой IMAX, если я ничего не путаю, это широкоэкранный фильм плюс допконтент сверху и снизу. Т.е. все важное — в середине, а не на весь экран.
Это часто вопрос не того, как снято, а того, как выпустили релиз, который вы смотрите. Мы вот недавно на Okko решили посмотреть Ford v Ferrari, и он там идет в 16:9, хотя он вполне себе киношного формата (и есть релизы с 23:10).
sumanai
Всегда качаю с рутрекера оригинальные релизы ))
lair
Оригинальные — это которые для проекции в кинотеатре? А где вы их берете?
sumanai
Не, просто блюреи. Для стриминговых сервисов, как вы выше указали, картинку вполне могут порезать.
lair
Вот блюреи тоже иногда бывают 16:9. Патамучта.
Tyusha
Бекмамбетов в интервью Дудю говорил, что возможно жанр кино будущего — вертикальный кадр, чтобы смотреть его на смартфоне в естественном его положении.
Kyubey
Это вы случайно не про фильм «Маяк»?
Да, действительно снимают такое и сейчас. Жаль только, что мало.
lair
Да, это я о нем.
nidalee
В основном потому что «так принято», аргументы те же, что и против HFR (фильмов с высокой частотой кадров) — так «более кинематографично».
Плюс оборудование близко к краю картинки сверху и снизу. Фильмы, где его нет, бывают и без полей — open matte.
V1RuS
вообще-то делают, но моделей мало и они небольшие (до 1920х1200, до 24 дюймов).
sumanai
Вот именно с такого я и ушёл на 4к 31 дюйм, и там уже даже близко ничего похожего нет. Впрочем, выиграл даже по высоте с учётом масштабирования в 150%, так что относительно доволен.
apxi
Да. Все становится двухуветнвм. Тоже заметил что многие фильмы стали какими то серыми.