Раскапывая RAW: внутреннее устройство Nikon Small Raw

Чтобы упростить жизнь тем из наших читателей, которых интересуют только результаты анализа особенностей нового формата NEF S, использованного компанией Nikon для записи данных камерой Nikon D4s, мы сразу объявим сделанные нами выводы.

Выводы

  • 11 бит
  • тоновая кривая наложена
  • баланс белого наложен
  • размер файла незначительно меньше 12-bit lossy compressed
  • разрешение в 2 раза хуже 12-bit lossy compressed
  • дополнительные этапы обработки, чреватые как потерями точности, так и дополнительными проблемами при конвертации (см. Исследование 3 ниже)
  • потери точности воспроизведения цвета в тенях, то есть снижается полезный динамический диапазон  (см. Исследование 2)

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

Расшифровка формата записи изображения в NEF S и распаковка

Из информации в EXIF видно, что для FX mode

  • размер изображения Image Size составляет 2464 x 1640 пикселов,
  • само изображение записано 12122880 байтами (поле Strip Byte Counts).

> exiftool -imagewidth -imageheight -stripbytecounts D4s_NEF_S_FX.NEF

Image Width      : 2464

Image Height     : 1640

Strip Byte Counts            : 12122880

Разделив  размер изображения в байтах на его ширину и высоту в пикселах, получим, что на один пиксел изображения приходится 3 байта, или 24 бита: 12122880/2464/1640 = 3. Из спецификации камеры следует, что файл 12ти битный и несжатый. Если бы файл содержал RGB информацию, то для записи одного пиксела должно было быть использовано 12x3 = 36 бит. Следовательно, это не RGB.

Тогда можно предположить, что информация в файле записана в виде YYCbCr, т.е. для каждого пиксела задается яркостная компонента, а цветоразностные компоненты – общие для каждых 2х пикселов. В этом случае каждые 2 пиксела кодируются с помощью 12x2 битов яркости и 12x2 битов цветности, то есть 48 битов (6 байт), т.е. на один пиксел, действительно, приходится 3 байта.

Исследуем для начала черный кадр (выдержка 1/8000сек, видоискатель закрыт шторкой, объектив закрыт крышкой, диафрагма объектива закрыта максимально глубоко, до предельной  для использованного объектива f/22, Auto WB mode1).

Для определения смещения начала записи изображения в файле выполним:

> exiftool -stripoffsets Black_AutoWB1.NEF

Strip Offsets       : 813568

Откроем снимок с помощью 16тиричного редактора и, спозиционировавшись на начало изображения (813568=0xC6A00), увидим в первых 24 байтах, в которых должны содержаться 8 первых пикселов (вертикальные палочки разделяют группы по 6 байт, т.е. по 2 пиксела):

01 00 00 00 08 80 | 00 00 00 00 08 80 | 01 20 00 00 08 80 | 00 00 00 00 08 80

Если гипотеза о кодировке YYCbCr верна, то мы должны получить два близких 12ти-битных значения яркости подряд, а затем два близких к нейтрали значения цветоразностных каналов CbCr. Мы видим, что это условие соблюдается, если в файле используется следующая перестановка 4х битных полей (ниблов): n0n1 n2n3 n4n5 n6n7 n8n9 n10n11 => n3n0n1 n4n5n2 n9n6n7 n10n11n8, что, в общем, логично, так как Никон использует little-endian. Применяя такую перестановку, получаем:

001 000 800 800 | 000 000 800 800 | 001 002 800 800 | 000 000 800 800

Распаковав все изображение из файла, видим, что, в яркостной компоненте преобладают значения 0 и 1, в то время как цветовые компоненты колеблются около 0x800=2048. Это хорошо видно на гистограммах каналов, полученных после распаковки по указанной выше схеме:

Figure 1

Один из характерных способов кодирования информации в каналах Cb и Cr – кодирование дельтой от средней точки. Иными словами, полученное при анализе черного кадра значение 2048 в цветоразностных каналах соответствует нейтрали, а все что больше или меньше – представляет собой цвет, тем более насыщенный, чем выше дельта.

Для того, чтобы убедиться, что мы на правильном пути, распакуем обычный снимок, превратив имеющуюся в файле запись 2 пикселов в форме Y1Y2CbCr в последовательность Y1CbCrY2CbCr, и конвертируем YCbCr в RGB по тривиальной схеме:

R = Y + (Cr-2048)

G = Y – (Cb-2048) – (Cr-2048)

B = Y + (Cb-2048)

Получаем изображение:

 

Figure 2

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

Теперь мы знаем достаточно для того, чтобы сделать первую итерацию для поддержки формата NEF S в RawDigger’е – реализовать распаковку, показ и статистический анализ каналов яркости Y и цветности Cb и Cr.

Нормализация изображения по яркости и насыщенности

Учитывая спецификации камеры, где о формате NEF S сказано – 12-битный, можно было бы предположить, что максимум в канале яркости составит 2^12-1=4095. Однако недостаточная яркость изображения при наличии засвеченных зон свидетельствует о том, что не все 12 бит канала яркости использованы. Необходимо определить максимум в канале яркости.

Открывая полностью засвеченные кадры в RawDigger’е, убеждаемся, что максимум не достигает 4095 и зависит от установки баланса белого в камере – самое низкое значение максимума 2392 получается при установке баланса белого в 2500K, а самое высокое, 2549, – при установке 10000K. Следовательно, для записи яркости практически используется log2(2549) ≈ 11.32, чуть более 11 бит вместо полных 12.

Нормализуя канал яркости Y к 2549, получаем яркость, более приближенную к реальности:

 

Figure 3

Яркость стала ближе к ожидаемой. Насыщенность же недостаточно высока. Обычно недостаточная насыщенность – признак того, что использованный в цветоразностных каналах размах меньше предполагаемого, то есть максимальная насыщенность соответствует диапазону, меньшему, чем 12-битный 0..4095. Как уже установлено, для записи канала яркости используется менее 12 бит, что тоже является основанием усомниться в использовании всех 12 бит для цветоразностных каналов Cb и Cr.

Попробуем определить предельные значения в этих каналах.

Съемка мишени с охватом Adobe RGB (X-Rite ColorChecker Digital SG) через плотные цветоделительные фильтры с экспозицией, при которой получаются максимальные предельные значения в цветоразностных каналах, дает значения в цветоразностных каналах в диапазоне весьма незначительно шире чем 2048±1024, что тоже соответствует 11 битам.

 

Figure 4: Shot through 25 Tricolour Red, Cr channel

 

Figure 5: Shot through 47B Tricolour Blue, Cb channel

Нормализуя насыщенность к 1024, получаем:

 

Figure 6

Насыщенность существенно улучшилась. Если необходимо полностью исключить вероятность клипинга цвета, в конвертере для цветоразностных каналов можно использовать диапазон 2048±1280 (см. scYCC-nl). Насыщенность несколько снизится, но это снижение можно при необходимости компенсировать, например - цветовым профилем.

Нормализация цвета

Так как к данным YCbCr уже применены баланс белого и тоновая кривая, можно предположить, что эти данные являются промежуточными в последовательности, используемой в камере для записи JPEG. В этом случае можно попробовать вместо тривиальной формулы восстановления RGB из YCbCr использовать ту, что обычно работает при восстановлении RGB из JPEG (sYCC color space, с учетом того, что в нашем случае центральное значение не 128, а 2048):

R = Y + 1.40200*(Cr - 2048)

G = Y - 0.34414*(Cb - 2048) - 0.71414*(Cr - 2048)

B = Y + 1.77200*(Cb - 2048)

Получить формулу цветности для другого цветового пространства, например, Adobe RGB, можно, определив коэффициенты в формуле расчетом на основании координат цветности пространства или регрессией.

Посмотрим на получившееся изображение:

 

Figure 7

Цвет стал более достоверным, но в областях вылета остается пурпур.

Для того, чтобы понять причину, снимем в двух режимах – NEF 14-bit uncompressed и NEF S –  нейтрально-серую шкалу Sekonic Exposure Profile Target близко к пересвету самой светлой плашки A (самая левая в ряду, на ней стоит красный прямоугольник выборки; в паспорте мишени она обозначена как №2). Шаг шкалы составляет примерно 1/6 EV.

 

Figure 8

Запишем в таблицу получающиеся данные:

SN

Y

Cb

Cr

R

G

B

G2

A

2167.3

2053.03

2070.01

9456.02

15567.84

9980.3

15597.55

B

2084.57

2043.87

2052.01

8482.34

14623.81

9019.13

14567.09

C

1967.3

2042.36

2053.8

7508.67

12899.58

7933.75

12845.02

D

1858.41

2042.67

2053.73

6647.39

11408.01

7019.2

11366.79

E

1753.19

2044.02

2052.05

5857.83

10074

6214.68

10050.75

F

1689.2

2043.08

2052.32

5419.68

9314.95

5730.37

9295.07

G

1580.99

2042.23

2052.95

4718

8095.99

4969.32

8077.63

Видно, что в снимке в режиме NEF 14-bit uncompressed, откуда получены значения R, G, B, G2, ни один из каналов не достигает максимума (2^14-1-768 = 15615, где 768– уровень черного). Однако в каналах  Cb и Cr, полученных из снимка в режиме NEF S с теми же параметрами экспозиции, присутствует сдвиг: 2053 вместо 2042..2044 для канала Cb и 2070 вместо 2052..2054 для канала Cr.

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

SN

Y

Cb

Cr

R

G

B

G2

A

1577.31

2042.2

2052

4643.4

7980.83

4885.13

7953.5

B

1499.64

2044.4

2050.65

4166.45

7183.03

4418.2

7160.95

C

1411.97

2043.48

2052.6

3694.65

6328.99

3889.19

6307.26

D

1330.74

2044.1

2052.81

3273.2

5595.41

3444.71

5577.88

E

1252.22

2045.19

2051.74

2886.6

4942.2

3053.22

4933.94

F

1204.61

2044.66

2052

2671.84

4568.37

2817.11

4563.2

G

1124.21

2044

2052.76

2329.95

3972.55

2444.34

3967.36

Как видим, если значения raw на первой плашке на 1 EV ниже максимальных, нейтральность ее в raw не вызывает сомнений – значения цветоразностных каналов в одном ряду с остальными плашками. Нейтральность плашки A подтверждается и спектрофотометром.

На практике это означает, что нарушение линейности вызвано именно высокими значениями яркости, то есть при значениях яркости выше как минимум 2100 отмечаются искажения цвета.

Можно сделать вывод, что формат спроектирован так, что максимальное используемое значение яркости составляет 2047. Однако, так как RawDigger – не конвертер, и нам не только не следует добиваться исключительно точного тоно- и цветовоспроизведения, но и нельзя ограничивать возможности пользователей изучать немодифицированные данные, мы можем оставить несколько завышенное ограничение яркости 2549 (что поможет сохранить нейтральные детали в крайних светах), и только лишь принудительно нейтрализовать цветоразностные каналы, установив Cb и Cr в 2048 как только значения в канале яркости превышают 2047:

 

Figure 9

Пурпур в светах убран, изображение нормализовано.

Линеаризация данных

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

При записи в формате YCC яркость Y может быть записана либо линейно (то есть при изменении экспозиции в 2 раза яркость тоже меняется в 2 раза), либо нелинейно, с наложенной тоновой кривой. В первом случае линейными будут и данные RGB, во втором – данные RGB будут нелинейны.

Проверить способ записи канала яркости Y достаточно легко, например, по снимку серой шкалы Kodak Q13. По паспорту шкала имеет шаг между плашками около 1/3 EV, то есть при линейной записи канала яркости на 1 EV гистограммы должно приходиться примерно 3 пика.

Откроем снимок в RawDigger’е, выберем участок шкалы и дополнительно поставим сэмпл на поле A (самое яркое в шкале) для того, чтобы определить максимум яркости шкалы и «выровнять» начало гистограммы по этому значению:

 

Figure 10

Посмотрим на гистограмму канала яркости Y:

 

Figure 11

На гистограмме яркости (белая гистограмма) в каждой полной «ступени» содержится 6-7 пиков вместо 3-4. Следовательно, яркость записана нелинейно, с наложением тоновой кривой, сжимающей весь диапазон примерно в 2 раза.

Для восстановления линейности RGB можно просто воспользоваться гаммой ≈2 (что ограничит диапазон канала яркости расчетным Никоновским).

Если необходимо использовать более широкий диапазон значений канала яркости, то можно построить кривую линеаризации по данным из «обычного» 14-битного uncompressed NEF и данным из NEF S, сняв серую шкалу Q13 с несколькими экспозициями так, чтобы в сумме охватить от 11 до 14 ступеней (если Вы верите, что информация ниже 11 ступеней от насыщения достоверна и представляет интерес). На первом снимке значения зеленого канала для плашки A должны быть примерно на 1/6 ступени ниже насыщения, следующие снимки можно сделать с -3 EV и -6 EV (для охвата 14 ступеней понадобится еще один снимок с -9 EV). Кривая является композитной, то есть общей для всех каналов, поэтому ее можно построить для одного канала, либо как Y -> G linear, либо как G(YCC) -> G linear, и затем применить ко всем каналам RGB, полученным из YCC.

Теперь, после выполнения линеаризации, мы готовы поддержать в RawDigger’е режимы RGB для файлов типа NEF S:

 

Figure 12

Изучим еще некоторые особенности этого нового формата NEF S.

Исследование 1: влияние Picture Contol на данные изображения в NEF S

В связи с тем, что мы выявили зависимость данных в NEF S от установки баланса белого, интересно проверить, влияют ли другие установки камеры (Picture Control, выбор цветового пространства в камере – Adobe RGB vs. sRGB) на данные в NEF S.

Жестко зафиксировав параметры экспозиции и освещение, мы сняли несколько кадров X-Rite ColorChecker Digital SG с разными установками Picture Control и цветового пространства. Несмотря на очень значительную разницу во встроенных JPEG, максимальная зафиксированная разница между NEF S составила 0.175 deltaE94, из чего можно сделать вывод, что ни Picture Control, ни выбор цветового пространства не влияют на NEF S.

Исследование 2: сравнение 14-bit uncompressed NEF с NEF S с точки зрения ошибки в цвете в тенях

Мы решили проверить, насколько формат NEF S способен «удержать» цвет в тенях по сравнению с обычным uncompressed 14-bit NEF.

Для этого были сняты пары одинаково экспонированных NEF S и 14-bit uncompressed NEF, в качестве мишени использовалась X-Rite ColorChecker Digital SG. Мишень имеет диапазон около 6.5 ступеней. Первая экспозиция была в режиме ETTR (на 2/3 EV выше рекомендованной внутрикамерным экспонометром), вторая – на ступень ниже, третья – на две ступени ниже, третья – на 2 2/3 ступени ниже. Все снимки были обработаны «эталонным проявителем» – Nikon Capture NX2, после чего с помощью BabelColor PatchTool по формуле CIE94 были измерены отклонения внутри пар:

 

ETTR

ETTR -1EV

ETTR -2EV

ETTR -2 2/3EV

 

deltaE94

10th percentile:

0.05

0.07

0.09

0.11

Median (50th perc.):

0.15

0.19

0.29

0.49

90th percentile:

0.58

0.77

1.14

2.19

95th percentile:

0.71

0.85

1.3

2.44

Of all samples:

0.9

1.09

1.63

2.88

 

delta L*

10th percentile:

0.03

0.02

0

0.04

Median (50th perc.):

0.06

0.06

0.09

0.2

90th percentile:

0.41

0.3

0.57

0.61

95th percentile:

0.47

0.36

0.61

0.73

Of all samples:

0.53

0.63

0.92

0.94

 

delta a*

10th percentile:

0.02

0.07

0.08

0.08

Median (50th perc.):

0.2

0.25

0.34

0.5

90th percentile:

0.34

0.62

1.04

2.04

95th percentile:

0.5

0.73

1.11

2.27

Of all samples:

0.6

1.22

1.49

2.73

 

delta b*

10th percentile:

0.01

0.01

0.01

0.02

Median (50th perc.):

0.06

0.13

0.2

0.32

90th percentile:

0.31

0.53

0.85

1.23

95th percentile:

0.46

0.69

0.95

1.5

Of all samples:

0.81

1.24

1.6

2.16

Из таблицы видна тенденция к увеличению расхождения между 14-bit uncompressed NEF и NEF S по мере снижения экспозиции. Уже при экспозиции на 2 ступени ниже ETTR (что соответствует сцене с широтой около 8.5 EV) отклонения значимы, и они не столько в канале яркости L*, сколько в каналах цветности a* и b*. При экспозиции на 2 2/3 ступени ниже ETTR (сцена с широтой несколько менее 9 ступеней) расхождение превосходит допустимую величину в 2 deltaE.

Исследование 3: пример проблемы с балансом белого при работе с файлами типа NEF S у Adobe

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

Для того, чтобы продемонстрировать это утверждение, сделаем 3 снимка одной сцены в режиме NEF S при одном и том же освещении и с одинаковой экспозицией. Для первого снимка установим в камере баланс белого, взятый камерой, для второго – поставим в камере баланс в 2500K, для третьего – в 10000K.

Конвертируем снимки в формат dng с помощью DNG Converter 8.4 Release Candidate и откроем их в ACR CS5, установив всюду отрицательную компенсацию экспозиции -0.5 EV (для получения правильного значения в зеленом канале для плашки 1 в кадре с нормальным балансом белого) и поставив сэмплы на патчи 1, M и B:

 

Figure 13. Баланс белого, взятый камерой

 

Figure 14. Баланс белого в 2500К

 

Figure 15. Баланс белого в 10000К

Если применить значения баланса белого из снимка с правильным балансом к остальным 2 снимкам, наблюдается значительный дополнительный вылет в светах. Для его компенсации приходится скорректировать яркость движком экспозиции на величину порядка -1 EV:


 

Figure 16

 

Figure 17

Теперь значения сэмплов становятся  достаточно близкими.

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