Предисловие-дисклеймер

Это мой первый пост на хабре, поэтому критика приветствуется, но камни попрошу кидать хоть и сильно, но аккуратно, по заветам Лёлика из бриллиантовой руки.

Введение

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

При этом даже когда основы фотографии уже вроде бы известны, треугольник экспозиции с его тремя углами уже понятен как свои три пять пальцев, всё-таки остаются некоторые вопросы. Например: если я зафиксирую диафрагму и буду увеличивать ISO, снижая при этом выдержку, то понятно, что шумы будут расти. Но насколько? Ведь даже имея в своём распоряжении астротрекер, мы далеко не всегда можем копить свет неограниченно. Существует ошибка установки полярной оси этого самого трекера (или в более продвинутом случае — монтировки). Есть погрешности ведения. Засветка. Облака в конце концов тоже могут налететь и испортить нам кадр, даже если монтировка отработала безупречно.

Предполагая, что читатель уже знаком с основами фотографии (а может и астрофотографии) и хочет разобраться с подбором оптимальных параметров в астросъёмке с математической точки зрения, я и буду вести повествование.

Необходимый минимум

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

  • Съёмка производится в режиме RAW, т.к. для jpg-файлов пост-обработка в виде сложения хотя и возможна, но при этом теряется львиная доля полезной информации, да и вся математическая сторона процесса остаётся за кадром (или за процессором камеры).

Определение параметров камеры

Во времена плёночной фотографии чувствительность эмульсии определялась её химическим составом и размерами зерна, именно поэтому чем выше ISO, тем явственнее на снимке проявлялся характерный гранулярный эффект. В цифровом фотоаппарате у нас есть только одна матрица. Однако тем не менее мы можем "выбирать" её чувствительность к свету. Происходит это ещё на уровне аналоговой работы с сигналом. Попадающие на фоточувствительный элемент фотоны увеличивают (или уменьшают, нам сейчас это неважно) заряд пикселя. Предположим пиксель накопил некоторое количество заряда. Дальше мы можем подать этот сигнал на аналогово-цифровой преобразователь (АЦП) и записать выданное нам значение. А можем сначала умножить наш сигнал на некую константу, и лишь после этого оцифровать. Если бы сам АЦП не шумел — не было бы никакой разницы, оцифровали мы сигнал до умножения или же после. Однако ж он-таки шумит. Поэтому, если скажем уровень этого шума находится на уровне 6 электронов, а у нас их в пикселе накопилось всего 12, то мы внесём довольно ощутимый шум в процессе оцифровки. Однако если мы предварительно "увеличим чувствительность" нашей матрицы, скажем в 4 раза, то те же 6 шумовых электронов на фоне 48 будут выделяться уже значительно меньше. Можно сказать, что в первом случае соотношение сигнал/шум (snr) был 2, а мы его увеличили до 8.

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

Ну а во-вторых — принципиально новой информации мы от такого умножения всё равно не получаем — лишь снижаем вклад шумов АЦП.

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

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

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

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

Также нам нужна будет программа, которая умеет читать, а главное — отображать RAW файлы в естественной линейной форме. Т.к. те кадры, что мы видим как итоговое изображение включают в себя целую кучу нелинейных преобразований в которые я даже не хочу сейчас углубляться. От себя могу предложить пять вариантов, четыре из которых совершенно бесплатны: Iris, Fitswork, Pixinsight, Siril, DSS. (Я пользуюсь в 90% первым из них, который хотя и поддерживает только целочисленную математику обладает широчайшим набором функций и из бесплатных, на мой взгляд — до сих пор в лидерах.)

Возможная проблема с Iris

Если ссылка не открывается — передавайте привет Роскомнадзору. ;) с его гениальным решением блокировать IP адреса без разбора...

Необходимо также не забыть, что все эти программы после открытия в них RAW файлов представляют данные "as is" — без дебайеризации и нелинейных преобразований. И если последнее — это именно то, что нам нужно, то наличие взаимно перемешанных RGGB четырёх изображений в одном — осложняет нам работу.

Фото туманности M42, также известной как Большая Туманность Ориона в линейном недебайеризованном виде.
Фото туманности M42, также известной как Большая Туманность Ориона в линейном недебайеризованном виде.

В своём любимом Iris я использую команду split_cfa z1 z2 z3 z4 чтобы разбить один кадр на четыре изображения с соответствующими именами, т.к. цветные изображения анализировать нужно поканально.

Итак, предположим мы сняли пару фотографий нашего плоского поля, вычли из них мастер-кадр тока смещения (30-40 кадров, снятых с закрытой крышкой с минимальной выдержкой и усреднённых будет вполне достаточно), разбили байеровский массив на 4 отдельных изображения, и выбрали область свободную от пыли, градиентов и прочей бяки. Какая информация теперь у нас есть, и что мы можем с ней сделать?

Как я уже говорил выше — число электронов зависит от числа упавших (и зарегистрированных) фотонов, а итоговый оцифрованный сигнал ADU (analog-to-digital units) — число фотоэлектронов, умноженное на коэффициент усиления, т.е. для двух кадров мы имеем:

\begin{array} {} N_1=ke_1 & N_2=ke_2\end{array}

Из-за наличия фотонного шума среднее значение e1, будет варьировать в пределах ± корня из e1, как и e2. Удобно найти величину этой вариации, вычтя N1 из N2, получив

d=N_1 -N_2 =k(e_1-e_2)

Т.к. в среднем N1 = N2 наша разность даст величину стандартного отклонения безо всяких смещений. По формуле для ошибки для косвенных измерений:

\Delta d=\sqrt{k^2(e_1+e_2)}=\sqrt{k(N_1+N_2)}

С другой стороны для среднего арифметического:

Av=\frac{N_1+N_2}{2}

Видно, что из последних двух уравнений можно получить нашу k:

k=\frac{(\Delta d)^2}{2Av}

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

Чем больше таких независимых пар при разной яркости монитора мы получим, тем точнее будет наша оценка гейна. А величина равная 1/k даст нам число электронов, приходящееся на единицу АЦП. Для пущего увеличения точности можно применить линейную регрессию. Поставить монитор на максимальную яркость и получить пару кадров с самой длинной выдержкой, такой, чтобы ещё не было пересвета ни в одном из каналов (ориентироваться лучше не по гистограмме фотоаппарата, а по реальным значениям, контролируя их в программе). После этого убавлять яркость монитора и продолжать делать пары экспозиций, не меняя параметров в течение всей сессии. Полученные средние отложить по оси икс, а стандартные отклонения — по игрек и определить коэффициент наклона: так мы используем МНК для решения избыточной системы уравнений для увеличения точности. Для нативного ISO должна получиться картинка вроде этой:

График для Canon 450D. ISO = 200. Gain~1
График для Canon 450D. ISO = 200. Gain~1

Зная гейн, определить число электронов, соответствующих насыщению матрицы уже не составляет труда: максимальный отсчёт делим на гейн. Соответственно полную ёмкость пиксела надо искать на минимально доступном ISO.

В принципе, можно даже обойтись всего одним кадром: измерить среднее значение пикселей, измерить дисперсию и если квадрат дисперсии совпал со средним — то мы попали пальцем в небо. Если больше в 2/4/0.5 раза — в соответственное число раз меньшее ISO соответствует единичному гейну. Однако при наличии пыли или горячих/холодных пикселей на матрице такая прикидка может выдать ошибочный результат, поэтому лучше перестраховаться.

На этом предлагаю пока остановиться и если освещаемая тема окажется интересной — то я продолжу.

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


  1. VT100
    10.08.2021 19:21

    Усиление (пропорциональное увеличение числа электронов после экспозиции, но до оцифровки) в КМОП-матрице. Я не перепутал?

    Или, всё-таки, некий усилительный кунштюк между ячейками матрицы и её АЦП?


    1. excentrisitet Автор
      10.08.2021 20:06

      Само число электронов конечно не увеличивается. Если посмотреть схему КМОП матрицы, например тут:

      http://makal47.ru/instrumentyi-fotografa/cmos-matritsa-fotoapparata

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

      Принцип работы, как его представляю, в достаточных для меня, любителя астрофотографа, терминах описан вот тут:

      https://keldysh.ru/papers/2003/prep85/prep2003_85.html

      Более глубоко в детали процессов я пока не вникал, ибо не было нужды.


  1. dcoder_mm
    10.08.2021 21:54
    +3

    На этом предлагаю пока остановиться

    Ну вот только началось и сразу кончилось. Продолжайте, конечно. Начало очень хорошее


  1. maxim_ge
    11.08.2021 13:10
    +1

    КМК неплохо было бы как-то обозначить проблему и кратко очертить общий путь решения, а потом уже разбирать детали.


    Пример проблемы. SW130650EQ5 Nikon D7000 exp 12 x 300sec.


    ISO200:
    image
    ISO800:
    image


    Т.е. при высоких ISO внезапно получаем меньше деталей.


    12 x 120сек, ИСО800, вроде бы на том же оборудовании, но короче выдержка, и вообще красота:
    image


    Ну т.е. выбор экспотройки — нетривиален.


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


    1. excentrisitet Автор
      11.08.2021 14:31

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

      А касательно стартовых фото — у меня они вызывают сейчас кучу сомнений. И основной — а точно ли Nikon отдаёт честный RAW, потому что когда шум считывания практически совсем не зависит от ISO — возникают вопросы: https://photonstophotos.net/Charts/RN_e.htm


      1. maxim_ge
        11.08.2021 15:26

        И основной — а точно ли Nikon отдаёт честный RAW, потому что когда шум считывания практически совсем не зависит от ISO — возникают вопросы: https://photonstophotos.net/Charts/RN_e.htm

        Занятно:


        А вот dxomark:


        Nikon/D7000---Measurements



  1. ghosts_in_a_box
    11.08.2021 13:44

    Добрый день!

    Тема интересная, продолжайте!

    Хотел бы добавить, что для таких измерений вообще можно снять объектив и светить монитором напрямую в матрицу (если он конечно съёмный), тогда будет минимум пятен от пыли на объективе, виньетирования и прочего. И можно провести полноценную offset + dark калибровку (а не только offset), чтоб как раз убрать те самые горячие пиксели, хотя не уверен, что они внесут какой-либо значительный вклад на малых выдержках.

    Ещё есть некоторые соображения на тему выбора ISO. Так как изменение ISO никак не влияет на количество электронов на детекторе и просто усиливает уже собранный сигнал, но уменьшает динамический диапазон, то оптимальным значением будет минимальное iso, которое позволит превысить шум ADC. Данное значение не обязательно будет единичным усилением (unity gain) и может быть как меньше (для малошумящих ADC), так и больше (для сильно шумящих). Конечно это только для случая, когда мы можем компенсировать всё длинной выдержкой, но для сильно шумящих ADC всё равно имеет смысл поднимать ISO выше единичного усиления, т.к. шум просто все съест.


    1. excentrisitet Автор
      11.08.2021 13:47

      По последнему абзацу — не всё так просто, и это я планирую рассмотреть позже. ;) Хотя unity gain и неплохой компромисс, но он тоже не святой грааль и иногда даже значительное повышение ISO бывает оправданным. Но это скорее будет в третьей части.


    1. VT100
      11.08.2021 22:13

      +1


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