В блоге:

2014-02-04

dcraw и SRW

С SRW-файлами NX-серии до Samsung NX300 была достаточно понятная ситуация: данные там занимали фиксированный объем.

Например, смотрю SRW с Samsung NX10. Данные (4704x3124 пикселов) занимают один и тот же объем: 22042944 байта. Т.е. ровно по 12 бит на пиксел (4704*3124*12/8=22042944). Остальное - это метаданные + очень маленькая картинка (160x120) + JPEG-картинка для просмотра (4592x3056), но с большим сжатием. Эту картинку, например, умеет показывать FastStone ImageViewer. И именно эта картинка определяет "плавание" размера SRW-файла.

Для NX20 похожая история. Данные (5632x3720 пикселов) занимают 31426560 байтов, те же 12 бит на пиксел (5632*3720*12/8=31426560). А размер файла изменяется в большей степени в зависимости от встроенной JPEG-картинки (5472x3648), как и на NX10.

С NX300 другая история. Даже при непродолжительной эксплуатации заметил, что SRW стали даже меньше, чем у NX10. Очевидно, что применяется какое-то сжатие.

Решил посмотреть, какого рода сжатие. В dcraw поддержка NX300 появилась в версии 9.18, поэтому можно посмотреть алгоритм (см. свежий dcraw.c). Разжатие осуществляется в процедуре samsung_load_raw. Навскидку видно, что там используется дельта-кодирование (разностное сжатие, т.е. записывается не само значение, а разница с одним из предыдущих). Но сама разность целочисленная и может иметь разную битность для хранения (битность динамически меняется), поэтому нельзя однозначно сказать, используется ли сжатие с потерями, или битность данных подбирается для каждого блока для исключения потерей. Т.е. наличие потерь определяется алгоритмом сжатия, используемым в камере, а не разжатия. Но, с другой стороны, в строке нет опорных значений (только в начале строке вычисления начинаются со 128), поэтому при недостаточной битности разности будет набегать сильная погрешность, которую нужно периодически как-то компенсировать. Для сравнения можно посмотреть кодирование с потерями на камерах Sony - там разность, но она с коэффициентом и есть опорные значения.



И еще момент для размышления относительно NX300. В dcraw в исходниках зашиты матрицы цветовых коэффициентов для некоторых камер (с комментарием All matrices are from Adobe DNG Converter unless otherwise noted). Есть и матрицы для Samsung NX, которые по значениям делятся на три группы (в каждой группе одинаковые значения):

1. NX5, NX10, NX11, NX100.
2. NX20, NX200, NX210, NX1000, NX1100.
3. NX300, NX2000, EK-GN120 (Galaxy NX).

С первым двумя группами понятно. Это совсем разные матрицы. А вот вторая и третья группа: считается, то там одинаковые (или с незначительными изменениями) матрицы. А вот dcraw считает, что цветопередача у этих групп отличается.


Еще по этой теме:

3 комментария:

  1. http://www.dxomark.com/Cameras/Compare/Side-by-side/Samsung-NX-300-versus-Samsung-NX-20___851_802
    есть отличия. особенно по шумам.

    ОтветитьУдалить
    Ответы
    1. Предпочитаю такие вещи проверять лично или на основании объективных данных. Эти данные не могу назвать объективными (те же исходники dcraw дают гораздо больше пищи для размышления).

      Удалить
  2. М-да... дельта-модуляция хорошо подходит для одномерной информации, например, звука, при достаточной частоте дискретизации и качественной пост-фильтрации при обратном преобразовании.
    А в изображениях, мне кажется, неправильно её применять. Те "костыли" в виде цены дельты и мгновенных значений помогают избежать потерь, но, по-моему, оно того не стоит. Ух, ностальгия, аж про RLE и PCX-формат вспомнил! :-D
    Беспотерьная реализация wavelet (например, lossless jpeg2000), как мне видится, намного лучше. Единственный минус - нужно побольше ресурсов для вычислений (заточка DSP под формат). =)

    Спасибо за исследование. Очень познавательно!

    ОтветитьУдалить

Архив блога