Правдоподобная реконструкция Инстаграм-подобных фильтров

Original author: Александр Карпинский
  • Translation

Существует куча софта, который позволяет пользователям применять различные цветовые фильтры к своим фотография. Пионером в этом деле был Инстаграм и иногда хочется сделать в своем приложении уже знакомые пользователям фильтры. И я хочу представить набор утилит, который позволит в полу-автоматическом режиме очень точно воспроизводить цветовые фильтры из других приложений в своём приложении.


https://github.com/homm/color-filters-reconstruction


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


Для примера, одно из следующих изображений было получено с применением фильтра Clarendon на оригинальном изображении в самом Инстаграме, а другое с помощью наложения восстановленного фильтра. Попробуйте угадать, какое восстановлено.



Для сравнения, это результат применения того же фильтра из коммерческого набора «Инстаграм-подобных фильтров», который вы без труда сможете нагуглить:



Данный фильтр с натяжкой можно назвать похожим на оригинальный.


Как это работает


Метод основан на трехмерных цветовых таблицах поиска (3D color LUT) и их двумерном представлении — изображениях Халда. Основная идея очень простая — образец изображения Халда с равномерным распределением цвета обрабатывается с помощью исходного фильтра, цветовые трансформации которого требуется воспроизвести. Обработанное таким образом изображение Халда может быть использовано для очень точной аппроксимации цветовых трансформаций исходного фильтра.


Полученное изображение Халда может быть использовано в целом ряде программ и библиотек, таких как GraphicsMagick или Photoshop. Также его можно использовать в приложениях для macOS и iOS с помощью библиотеки CocoaLUT. Кроме того, изображение Халда может быть конвертировано в формат 3D LUT куба, который очень распространен в приложениях для обработки видео. И небольшой спойлер: поддержка 3D color LUT появится в следующей версии Pillow 5.2 для Питона.


Ограничения


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


Тем не менее, на мой взгляд, этот метод максимально правдоподобно восстанавливает 32 из 40 инстаграмовских фильтров (если не считать виньетирование, наложить которое не представляет труда уже после обработки) и с переменным успехом позволяет добиться чего-то похожего для оставшихся восьми.


Требования


Для генерации и конвертирования изображений Халда вам понадобится интерпретатор Питона с pip.


$ git clone https://github.com/homm/color-filters-reconstruction.git
$ cd color-filters-reconstruction
$ pip install -r requirements.txt 

После получения изображений Халда, вам уже не понадобится никакой софт из этого репозитория. Зато понадобится какая-либо библиотека, которая умеет их применять. Это может быть GraphicsMagick, которая имеет биндинги для большинства популярных языков, включая Python, Ruby, PHP, JavaScript™, а также интерфейс командной строки.


Руководство


  1. Для начала вам потребуется создать единичное изображение. Просто выполните:


    $ ./bin/generate.py

    Вы увидите файл с названием hald.5.png. Число в имени файла — это квадратный корень из размера таблицы поиска. То есть 5 означает, что файл содержит таблицу размером 25×25×25 элементов.




    Этот файл немного отличается от привычного представления изображений Халда. В нем таблица реплицирована 4 раза и добавлены отступы. Кроме того, каждая ячейка таблицы занимает не один пиксель, а квадрат 8×8 пикселей. Всё это сделано, чтобы противостоять различным искажениям, как самого исходного фильтра, так и сжатия JPEG.


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




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


  3. Сконвертируйте изображение с фильтром в настоящее изображение Халда:


    $ ./bin/convert.py raw/1.Clarendon.jpg halds/

    Здесь halds/ — директория, куда попадёт полученный фильтр.



  4. Вы великолепны! Полученный фильтр сразу же можно применять к любым другим изображениям.


    $ gm convert sample.jpg -hald-clut halds/1.Clarendon.png out.jpeg



Дополнительные советы


Хотя настройки по умолчанию в большинстве случаев позволяют получить высококачественные фильтры Халда, бывают ситуации, когда этого недостаточно.


Некоторые нежелательные эффекты могу появляться, если исходный фильтр имеет сильные искажения на локальном уровне или заметные градиенты в центре изображения. Самый заметный неприятный эффект — одноцветные полоски. Вот, например, оригинальное изображение и изображение, полученное после обработки восстановленным фильтром Hudson, в котором наиболее заметны эти проблемы:


# Создать изображение Халда из обработанной Инстаграмом картинки
$ ./bin/convert.py raw/15.Hudson.jpg halds/
# Применить изображение Халда к другому изображению
$ gm convert girl.jpg -hald-clut halds/15.Hudson.png girl.15.jpg


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


Если вы внимательнее посмотрите на единичное изображение с примененным фильтром Hudson, вы заметите, что оно довольно шумное. И это является источником проблемы.




К счастью, можно попросить утилиту convert.py применить трехмерное Гауссово размытие к таблице поиска во время конвертации, что уменьшит шум. Для этого нужно поставить пакет SciPy (входит в поставку macOS по умолчанию).


# Следующую строку нужно выполнить только один раз
$ pip install scipy
$ ./bin/convert.py raw/15.Hudson.jpg halds/ --smooth 1.5
$ gm convert girl.jpg -hald-clut halds/15.Hudson.png girl.15.fixed.jpg


Как видите, все неприятные эффекты ушли. Вы можете найти другие опции у convert.py, выполнив ./bin/convert.py --help.


Удачи с обратной инженерией!

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

More
Ads

Comments 32

    –15
    Людям нравятся фильтры из Инстаграма
    Никогда не пользовался Инстаграм, ЧЯДН?
      +2
      Не пользуетесь Инстаграмом.
        +7

        Прогуливали уроки по элементарной логике?

          +5
          держите нас в курсе
          –6
          Никогда не понимал инстаграм. Они же страшные все. Ну раз, ну два, но когда в ленте таких фоток куча, это же уродство по цветам. Ну не можешь сразу фотать нормально или лень обрабатывать фотографии, ну не фотай.
            +1
            Отличный подход. Было бы здорово еще иметь возможность отобразить изменения на RGB кривых.
              +2

              В общем случае это невозможно. RGB кривые — это три одномерных графика, а 3D LUT — трехмерный.

                –2
                Ну да, это я что-то не подумал… Да и к тому же это перевод. :/
                  +1

                  Это перевод моей же статьи ) Вот так хитро

              –13
              я не понимаю… ну, и как мне это использовать? что означает этот набор файлов на гитхабе?
              почему нельзя показать результат Вашей работы в виде готовых пресетов для того же фотошопа, которые можно было бы закинуть в папку 3DLUTs фотошопа. (справедливости ради их и так на рынке хоть попой кушай — и бесплатных и сильно платных. только у меня их под тысячу разных пресетов). хотел посмотреть, чем ваши лучше.

              да минусуйте, безразлично.
                –8
                а… так тут вопрос про карму… карма — это правильно. что ж, — и вам того же и вас туда же.
                  +2
                  ну, и как мне это использовать?

                  В статье есть как минимум исчерпывающий пример с GraphicsMagick и список другого ПО, которое может использовать изображения Халда.


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

                  Еще раз погуглил, в статье всё же неточность — Фотошоп нативно понимает не изображения Халда, а 3D cube файлы. Но сконвертировать одно в другое не составит труда.


                  хотел посмотреть, чем ваши лучше.

                  Мои лучше тем, что это в принципе единственные известные мне фильтры, правдоподобно воспроизводящие фильтры из Инстаграма.

                  +3
                  Давно не общался с Инстаграм но ЕМНИП идея была не просто в банальном преобразовании цветового пространства, а в раздельной обработке яркости и цвета, ради маскировки дерьмища типичного для камер мобильных устройств. А фотохyйдожества, это так побочный эффект.
                  Вы можете смоделировать преобразование цветового пространства и тупо применять эту модель, но результат будет несколько отличным, да и не лучший это образец для моделирования.
                  Грубо говоря, применяя статистические методы мы можем побороться за контраст чб картинки при её сведении из цветовых каналов, а потом раскрасить сильно усреднённым и разогнанным оригинальным цветом.
                  Шумы из хромы перейдут в люму, но это воспринимается не как говно, а как фильм-грэйн, народу нравится, модно типа плёнка…
                  … а если шума нет, его можно добавить, тут тоже всё интересно, но я не уверен что всё это было реализовано на практике
                    +1
                    идея была в раздельной обработке яркости и цвета

                    Не имеет значение, насколько сложные преобразования происходят внутри, если значение выходного пикселя зависит только от входного, это преобразование отлично захватывается с помощью израобжений Халда. Для инстаграма это верно для 32 из 40 фильтров.


                    но результат будет несколько отличным

                    Вы говорите так, будто нужно проверить работает ли этот подход. Между тем всё уже проверно, он работает.

                      0
                      Я в начале делаю оговорку о том что не знаю о состоянии проекта сейчас, а просто помню к чему оно всё затевалось, какие вопросы задавались, какие ответы выдавались…
                      … в моей гипотезе-же значение выходного пиксела, сильно зависит от значения соседей и статистических свойств каналов всего изображения, однако я не настаиваю что инстаграм сейчас работает именно так, но именно так работают фотохудожники и кинематографисты когда ДД исходника мал, ну и\или в художественных целях.
                      So, если кто решит пилить свой инстаграм, пользы с моего комментария ему будет больше, чем от поста, ибо к чему приведёт тупое преобразование цветового пространства jpeg-а или видео с мобильной камеры? Это-же передискретизация, передискретизации, дискретного по самое не балуйся изображения, да ещё с цветным песочком :-)
                      Пиксел в пиксел можно гонять когда мы имеем дело с исходным и\или усреднённым значением, но усреднённым это уже про несколько пикселов…
                  • UFO just landed and posted this here
                      0

                      Когда-то делал цветовое преобразование по образцу: берём исходную картинку, берём эталон, для обеих считаем среднее значение цвета и "тензор моментов инерции" цвета (типа <(r-r0)(g-g0)>), и находим матрицу преобразования цвета, чтобы после домножения векторов (r-r0,g-g0,b-b0) на эту матрицу тензор для исходной картинки привёлся к эталонному.
                      Так вот, очень интересный эффект на пейзажах: если взять дневное фото и привести к цветам ночного (или наоборот) — оно на первый взгляд воспринимается как ночное/дневное, но чувствуется какая-то неправильность. И только подумав — понимаешь, что небо светлое, хотя должно быть тёмным (или наоборот).

                        0

                        Покажите пожалуйста пример.

                          0

                          Увы, под рукой ни кода, ни картинок: это делалось лет 10 назад (если не больше) для прошлой работы (была подзадача — унификация изображений для последующей обработки). Но если охота поэкспериментировать — вспомню математику (она там несложная, вроде умножить одну матрицу моментов на обратную к другой и итеративным методом вычислить корень, а потом просто вектора (r,g,b) всех точек умножаются на результат)

                          0
                          Получается что-то вроде картины «Империя света» или того самого платья? Кажется была публикация на такую тему, но не вспомню чья.
                            0
                            Коллеги, раз зашёл такой разговор, может быть кто-то из вас в курсе, есть ли хорошо сделаннные аналоги фильтров Instagram для Photoshop (особенно не самого свежего) или хотя бы GIMP-а?

                            А то некоторое время назад я задавался подобным вопросом, искал, находил что-то в духе «30 Photoshop actions для обработки ваших фото в стиле Инстаграм» от индусов, но результат был средненьким.

                            Я в целом достаточно спокойно отношусь к инстаграмовской обработке — у большинства их фильтров результат весьма специфичен, но вот пара-тройка действительно интересных фильтров у них есть.
                              0

                              Очень странно, что вы задаете этот вопрос под статьёй, в которой подробно описано как хорошо сделать аналоги фильтров Instagram, в том числе для Фотошопа. Вы хотя бы намекните, чем описанное тут решение вас не устроило?

                                0
                                чем описанное тут решение вас не устроило?
                                Видимо, увы мне, но идеи описанные в статье я как-то даже не рассматривал в качестве решения.

                                Должен признаться, что мои навыки в области Фотошопа весьма ограничены и сходу я не представляю как описанные здесь идеи применить самостоятельно.

                                Разумеется, я прочитал статью и посмотрел ссылки в начале. Единственное, что мне видится возможным как-то использовать — это каким-то образом перенести в GIMP описанные в статье на practicepython.org шаги.

                                Уточню, чтобы было понятнее что я имел в виду в своём вопросе: в ФШ я, разумеется, смогу установить плагин и использовать имеющиеся там пресеты, настраивая доступные в них параметры обработки. Также я смогу добавить готовый экшен и до определённой степени отредактировать параметры используемых в нём инструментов (шагов).

                                В статье же используются Python, Node.js и CSS. Даже если я настрою необходимую среду, сгенерирую изображения Халда, пропущу их через фильтр и потом получу некий результат анализа работы фильтра, я очень вряд ли смогу самостоятельно перенести этот результат в ФШ. А если и смогу, то скорее всего, объём необходимого для этого времени будет за гранью разумного.
                                  0
                                  Разумеется, я прочитал статью и посмотрел ссылки в начале.

                                  Ссылки в начале — примеры неудачных попыток воспроизвести инстаграмовские фильтры. Ни в одной из них не добились какого-то боле-менее правдоподобного сходства.


                                  я очень вряд ли смогу самостоятельно перенести этот результат в ФШ

                                  https://github.com/mikeboers/LUT-Convert
                                  https://filtergrade.com/use-3d-luts-photoshop/

                              0
                              Простите мне мое невежество, я с интересом прочитал статью и даже целый день ставил себе все всевозможные приложения, упомянутые в вашей статье. Я в программировании 0 абсолютный. Даже ниже нуля. Но вот у меня вопрос. У вас в папке «halds» лежат халды. Правильно ли я понимаю что я могу уже конкретно эти ваши файлы взять и конвертировать в CUBE, для использования в фотошоп? Если верно, то я это проделал. Результаты где-то ближе, где-то так себе (сравнивал на одной и той же картинке в инстаграмм на смартфоне и в фотошоп с применнением одноименного cube). Помогите, пожалуйста, разобраться. Весь путь, описанный в статье, пройти я не могу (очень пытался, но слишком мало у меня знаний). Спасибо.
                                0
                                Правильно ли я понимаю что я могу уже конкретно эти ваши файлы взять и конвертировать в CUBE

                                Правильно.


                                Результаты где-то ближе, где-то так себе

                                Первые шесть фильтров восстанавливаются очень точно, практически неотличимо, пример в самом начале статьи. Hudson, например, чуть хуже, потому что в нем кроме цвета, сверху еще накладывается текстура.


                                Я сейчас нашёл машину с фотошопом и проверил, преобразовав Халды в кубы этой утилитой: https://github.com/mikeboers/LUT-Convert. Результаты для первых шести фильтров 1 в 1.


                                Навскидку, проблема может быть в следующих местах:


                                1. Вы что-то напутали и смотрите не на те фильтры, которые применяете в фотошопе.
                                2. Вы проверяли фото с цветовым профилем и фотошоп и инстаграм по-разному их интерпртировали.
                                  0
                                  Еще раз, спасибо вам большое! У меня получилось практически все…
                                  Один момент хотел бы прояснить… у вас исходный файл 2800х2800
                                  Инстаграм максимум выдает 1400х1400 и соответственно такой файл из него выходит.
                                  Как поступали вы дальше? Увеличивали в фотошоп? как вы получили 2800х2800 из инстаграмма?

                                  Я увеличил 1400 до 1800 (clarendon) далее все конертировал по инструкции и в финале в фотошопе я вижу небольшую разницу между вашей версией этого фильтра и своей (у вас чуть насыщенее красные тона).

                                  Спасибо!
                                    0
                                    Инстаграм максимум выдает 1400х1400 и соответственно такой файл из него выходит

                                    У меня до 4096x4096 выдает. Возможно зависит от девайса или платформы, у меня iPhone 7.

                                      0
                                      А как вы это сделали? я и на айфон и на самсунг посмотрел. Нет нигде настроек разрешения и сохранения. Я ему скармливаю 2800х2800 он после публикации сам сохраняет фото 1400х1400. Как вы это сделали?
                                        0

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

                                          +1
                                          Оказалось проблема в формате png, перевел в jpg перед тем как скормить инстаграму и на выходе разрешение не изменилось.

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