Вот фотография новогодней ёлки в том виде, в котором видит матрица камеры:

Данные матрицы с 14-битными значениями АЦП, преобразованными в значения 0-255 RGB.
Данные матрицы с 14-битными значениями АЦП, преобразованными в значения 0-255 RGB.

Она даже не чёрно-белая, а серо-серая.

Причина этого в том, что хотя аналогово-цифровой преобразователь (АЦП) камеры теоретически способен выдавать значения от 0 до 16382, данные не покрывают весь этот диапазон:

Гистограмма сырого изображения
Гистограмма сырого изображения

Реальный диапазон значений АЦП приблизительно равен от 2110 до 13600. Давайте представим эти значения в изображении в виде чёрного и белого:

Vnew = (Vold - Black)/(White - Black)

Прогресс
Прогресс

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

В цветной камере на матрицу наложена сетка перемежающихся цветовых фильтров:

Давайте раскрасим каждый пиксель в цвет того фильтра, через который он виден:

Наложение фильтра Байера
Наложение фильтра Байера

Эта версия более цветная, но каждый пиксель имеет лишь одну треть от своего RGB-цвета.

Чтобы исправить это, я просто усреднил значения каждого пикселя с его соседями:

Устраняем эффект мозаики
Устраняем эффект мозаики

Если применить этот процесс ко всему фото, свет получит цвет:

Дерево без мозаики
Дерево без мозаики

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

Есть и ещё одна менее очевидная причина этого:

Истинный линейный градиент
Истинный линейный градиент

Наше восприятие яркости нелинейно.

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

Градиент sRGB
Градиент sRGB

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

Обе эти проблемы можно решить, применив к каждому цветовому каналу нелинейную кривую, чтобы сделать тёмные области более яркими… но в итоге получается не очень:

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

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

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

… а вот изображение с ослабленным зелёным, чтобы он соответствовал остальным каналам:

… и снова применяем кривую:

Наконец-то мы получили неплохое фото.

Но на самом деле, это самый минимум: я не выполнял никакой калибровки цветов, баланс белого неидеален, точки чёрного слишком высоко, на изображении много шума, который нужно подчистить…

Кроме того, применение кривой к каждому цветовому каналу непроизвольно привело к снижению насыщенности ярких участков. Этот эффект выглядит вполне неплохо (и именно его мы привыкли ожидать от плёнки), но из-за него звезда стала менее жёлтой. Можно выделить светлоту и применить к ней кривую, сохранив при этом цвет. Само по себе это превратило бы светодиодную гирлянду в перенасыщенный хаос, но если объединить оба способа, то можно получить красивые результаты.

Вот для сравнения фотография, которую сгенерировала моя камера из тех же данных:

Изображение JPEG «из камеры»
Изображение JPEG «из камеры»

Фотография явно далеко «не оригинальная»: чтобы достаточно точно отразить, как объект выглядит на самом деле, нужен приличный объём вычислений.

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

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

Комментарии (35)


  1. ManulVRN
    30.12.2025 07:41

    Елка, конечно, хороша (сарказм). За статью спасибо.


    1. GidraVydra
      30.12.2025 07:41

      А что не так с елкой?


      1. evalazarev
        30.12.2025 07:41

        Для кого-то не канон, уверена, что не нравится то, что у неё слишком редкие ветки и иголки, не пышная - да, но зато достаточно ровная и симметричная


        1. patyupin
          30.12.2025 07:41

          У меня отец брал и вставлял добавочные ветки в ствол чтобы нарастить пышноту ёлки.


      1. Astroscope
        30.12.2025 07:41

        А что не так с елкой?

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


    1. Toxygen
      30.12.2025 07:41

      Не скажу точно какое дерево на фото, но настоящая елка примерно так и выглядит. Не такая пышная как пихта к примеру.


      1. Einherjar
        30.12.2025 07:41

        но настоящая елка примерно так и выглядит

        Примерно так как в статье выглядят настоящие елки когда их где то к середине февраля-марта вниз к подъездам выносят.

        настоящая елка изначально выглядит примерно так


    1. kkuznetzov
      30.12.2025 07:41

      Это ёлка без применения фильтров.


    1. nnutts
      30.12.2025 07:41

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


  1. wtigga
    30.12.2025 07:41

    Спасибо. Первый раз вижу доступное объяснение всех шагов "проявки" цифровой фотографии от начала до конца.


  1. Onofrash
    30.12.2025 07:41

    Хм, всё ясно, матрица имеет зелёный цвет
    ну в фильме в принципе так и было


  1. gotch
    30.12.2025 07:41

    Вот фотография новогодней ёлки в том виде, в котором видит матрица камеры

    Данные матрицы с 14-битными значениями АЦП, преобразованными в значения 0-255 RGB.

    16384 -> 255*255*255 <> 16 581 375? Что-то это всё разводом отдаёт.

    (АЦП) камеры теоретически способен выдавать значения от 0 до 16382

    Реальный диапазон значений АЦП приблизительно равен от 2110 до 136000.


    1. buinovb
      30.12.2025 07:41

      Данные матрицы с 14-битными значениями АЦП, преобразованными в значения 0-255 RGB.

      Думаю, что конвертировал в оттенки серого для показа.

      Реальный диапазон значений АЦП приблизительно равен от 2110 до 136000.

      Просто лишний нолик в 136000, исходя из изображения.


      1. gotch
        30.12.2025 07:41

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


        1. luchinkinkos
          30.12.2025 07:41

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


          1. gotch
            30.12.2025 07:41

            Это понятно, а противоречивое колдовство с цифрами - сомнительно.


            1. luchinkinkos
              30.12.2025 07:41

              Так 14 бит, которые выдает матрица это по сути значение одного цвета. После усреднения получаем, что пиксель - 42 бита, по 14 на компоненту. Далее происходит дискретизация и получается 8 бит на компоненту.


              1. AiR_WiZArD
                30.12.2025 07:41

                И то 14 бит это разрядность АЦП, уровень шумов уменьшает полезный сигнал до 6-10 бит в зависимости от усиления и выдержки


  1. kostoms
    30.12.2025 07:41

    Главное - никогда не обрабатывать фотки описанным способом. И не нужен никакой "приличный объём вычислений" - просто надо иметь цветовые профили для своей камеры и объектива.


    1. VictorDmitriev
      30.12.2025 07:41

      1. Никто так и не обрабатывает. Это простой и доступный пример для непосвящённых.

      2. Цветовые профили для камеры и линзы ЧУТЬ-ЧУТЬ ускоряют процесс. Основное время - решить, в каком положении оставить примерно десяток умолчальных параметров.


  1. Hrr_2
    30.12.2025 07:41

    Я думал результат будет выглядеть привычно, а он темнющий, так что исходник недалеко ушел


  1. gliderman
    30.12.2025 07:41

    А это после двух запросов к квену - 2 минуты работы
    А это после двух запросов к квену - 2 минуты работы

    И теперь это можно делать просто двумя запросами - получено из первого фото


    1. anaxita
      30.12.2025 07:41

      И это эквивалентно тому что в посте? Вам бы к окулисту


    1. ArtyomOchkin
      30.12.2025 07:41

      Qwen неплох для кодирования, но обработка RAW с его помощью - весьма странная затея. Вам бы действительно к окулисту сходить, сгенерированный вариант постобработки даже не близок к реальности, к которой ближе всего jpeg.


  1. Astroscope
    30.12.2025 07:41

    воссоздать восприятие человека сложно

    На самом деле это и не требуется. Требуется максимальная линейность передачи. Учитывать особенности восприятия важно во всех тех случаях, когда возникают неустранимые искажения или используется сжатие с потерями - очевидный смысл в том, чтобы неизбежные в реальности объективные искажения и потери были субъективно незаметными вовсе или заметными лишь в незначительной, не раздражающей мере. А идеал - абсолютная линейность, но никак не воссоздание человеческого восприятия. Тогда изображение будет восприниматься как неотличимое от настоящего. Собственно говоря, со звуком ровно та же ситуация в принципе.


    1. edo1h
      30.12.2025 07:41

      уверены насчёт линейности? логарифмическая шкала не лучше ли будет?


      1. Astroscope
        30.12.2025 07:41

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


      1. ahabreader
        30.12.2025 07:41

        Линейность нужна между концами цепочки преобразований (свет перед камерой свет от экрана). А внутри что угодно.

        На самом деле не совсем линейность, потому что system gamma (aka OOTF) учитывает окружающее освещение. В сцене вокруг камеры солнечный день, в офисе яркий искусственный свет, а вокруг телевизора приглушённый свет, в кинотеатре так совсем темнота. И вот один исходник в зависимости от освещения показывают с EOTF-гаммой 2.2 или 2.4 или 2.6.

        А если вспомнить про баланс белого, то уже не не совсем.

        Со звуком похожие сложности. У наших ушей АЧХ меняется вместе с громкостью звука. Если что-то изначально звучало на 80 дБ, то во избежание искажений надо проигрывать на 80 дБ (или делать тонкомпенсацию).

        Но конечная цель-то сделать красиво... это художественные инструменты, а не измерительные. Так что вся эта интересная теория не так уж важна.


  1. Vsevo10d
    30.12.2025 07:41

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


    1. Astroscope
      30.12.2025 07:41

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


      1. ahabreader
        30.12.2025 07:41

        Недавно внезапно вспомнили, что привычный вид Нептуна взят с фото в ложных цветах по зелёному и оранжевому каналам, а реальный цвет у него примерно как у Урана.


    1. Javian
      30.12.2025 07:41

      Вы бы статьей обвалили продажи любительских телескопов :)


      1. Vsevo10d
        30.12.2025 07:41

        Да вряд ли, на них цены и так заградительные для завороженных фотками из гугла лохов, но при этом есть свой шарм увидеть в хороший любительский рефлектор тот же Сатурн, для людей шарящих, чтобы создать маленькую нишу. А вот над распространенными комментариями под фотками (не)живой ткани, покрашенной каким-нибудь DAPI и на пару рецепторов, что мол как же прекрасна природа, как красиво это выглядит – остается только снисходительно усмехаться.


        1. Astroscope
          30.12.2025 07:41

          есть свой шарм увидеть в хороший любительский рефлектор тот же Сатурн

          Конечно, и оно того стоит, но только мало кто из начинающих отдает себе отчет в том, что увиденное будет, ну, размером поменьше ногтя мизинца на расстоянии вытянутой руки желтоватое пятно, а в случае начального уровня (читай апертуры) оптики - так и вовсе размером со спичечную головку, вокруг которой знаменитое кольцо скорее угадывается, чем реально различается*. И все это плывет в восходящих потоках. Это невероятно захватывающе для любителей и очень уныло в сравнении со снимками с реально больших телескопов, с орбитальных телескопов, и особенно с космических аппаратов, летавших в сторону Сатурна.

          * мелким шрифтом

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


    1. kostoms
      30.12.2025 07:41

      Кажется, в бложике у автора и об этом заметка есть: https://maurycyz.com/misc/cc/