LibRaw 0.16-Alpha1

LibRaw 0.16 получила статус "Альфа"
  • Поддержка новых камер
    • Baumer TXG14
    • Blackmagic Cinema
    • Canon EOS 70D, C500
    • Fujifilm X-M1
    • Nikon D5200
    • Olympus E-P5,E-M1
    • OmniVision OV5647 (Raspberry Pi)
    • Panasonic LF1, GX7, GF6
    • Richon GR
    • Samsung NX300, NX1100, NX2000
    • Sony RX100II, RX1R, NEX-3N
  • Новый код для поддержки Foveon, основанный на библиотеке x3f (by Roland Karlsson)
    BSD-лицензия, поэтому включен в основное дерево исходных текстов LibRaw Отсутствует интерполяция цвета (необходимая для старых камер), поэтому получить приемлемый цвет для старых камер (Sigma SD9 и SD14, Polaroid x530) скорее всего не получится. Для современных Foveon-камер можно пытаться обойтись ICC-профилем (пока его нет).
    TODO: извлечение thumbnails, быстрое завершение декодера, переход на LibRaw_memmgr для аллокаций.
    При сборке с LIBRAW_DEMOSAIC_PACK_GPL2 будет работать старый Foveon-код (из dcraw)
  • Изменения в API:
    • Новые параметры процессинга (в imgdata.params)
      • imgdata.params.no_interpolation - выключает этап интерполяции (дебайера) в вызове LibRaw::dcraw_process().
      • imgdata.params.no_auto_scale - выключает этап масштабирования данных (scale_colors() в вызове LibRaw::dcraw_process()
      • imgdata.params.sraw_ycc - запрещает преобразование YCbCr-данных файлов Canon sRAW/mRAW в RGB-формат при распаковке (LibRaw::unpack())
    • Новый код обработки Fuji X-Trans привносит следующие изменения:
      • Для файлов X-Trans значение поля imgdata.iparams.filters теперь равно 9 (было 2).
      • В массиве imgdata.iparams.xtrans[6][6] содержится цвет пикселя в блоке 6x6.
    • Новый вызов: LibRaw::setCancelFlag() - быстрая остановка декодера (LibRaw::unpack() если он работает. Для использования в многопоточных программах.
    • В интерфейсе абстрактного класса LibRaw_abstract_datastream заведующего чтением данных удален вызов make_byte_buffer(), он более не нужен.
    • Новый метод демозаики: DHT Demosaic by Anton Petrusevich Использование: imgdata.params.user_qual=11
    • Новый метод демозаики: Modified AHD Demosaic by Anton Petrusevich Использование: imgdata.params.user_qual=12
    • Новый вызов C-API: libraw_COLOR(libraw_data_t *t, int row,int col) (это LibRaw::COLOR(row,col) для пользователей C-API)
  • Удален (более) быстрый декодер LJPEG, идея которого была позаимствованна в свое время в библиотеке RawSpeed. Для быстрого декодирования используйте интеграцию RawSpeed и LibRaw
  • Исправлена ошибка декодирования некоторых файлов Canon sRAW.
  • Выключена обработка bad pixels встроенная в RawSpeed, при необходимости используется обработка, встроенная в LibRaw.
  • Имена камер Canon выдаются по таблице unique ID (т.е. 700D всегда будет 700D, даже если в EXIF написано Rebel T5i)
  • Импортированы дополнительные проверки данных из LibRaw 0.15.4
  • Поддержка сборки CMake
  • Обновлен встроенный cameras.xml (RawSpeed)

Comments

Перешел с 14.7 на новую

Вдруг перешел с 14.7 на новую версию (не меняя код). Изображения стали с пурпурным оттеком и с довольно высокими тенями. Подскажите, куда копать?
П.С.Воркфлоу: open/unpack/raw2image/subtract_black)

"Пурпурный оттенок-высокие

"Пурпурный оттенок-высокие тени" - это признак того, что черный не вычелся

1) Что за камера?
2) уровень черного сами ставите или LibRaw сама считает?

Если можно показать минимальный фрагмент кода, который работал и перестал - было бы вообще клево. Может быть в текущем мастере ошибка, ваш процессинг (unpack-raw2image-subtract_black) нигде у меня не используется.

Камера - 5d mk ii. Собственно

Камера - 5d mk ii. Собственно показать-то и нечего:

if (m_libraw.unpack() == LIBRAW_SUCCESS)
{
m_libraw.raw2image();

if (subtractBlack)
{
m_libraw.subtract_black();
}
...

Далее - нормализация

const unsigned short raw = m_libraw.imgdata.image[i]

  1. ;
  2. *p = Float(raw) / m_libraw.imgdata.color.maximum;

Ага, похоже в 0.15 и в 0.16 в

Ага, похоже в 0.15 и в 0.16 в этом месте случился разрыв в логике (т.к. subtract_black() может использоваться и изнутри dcraw_process() - он ожидает что в color.cblack[] не 0, а color.black - не использует вовсе).
Я тогда завтра это место починю.

BTW, есть вызов (как бы внутренний, потому недокументированный) LibRaw::raw2image_ex(int do_subtract_black) который объединяет в одно raw2image, subtract_black и кроппинг. С ним нужно осторожнее т.к. если вы потом, к примеру, будете dark frame вычитать, то вам нужно разделить этапы raw2image и subtract_black. Но если вы ничего такого не делаете, то raw2image_ex() будет банально быстрее чем в два приема.

Меж тем, раз уж вы дальше

Меж тем, раз уж вы дальше работаете в плавучке, то имеет смысл вычитать уровень черного для кэнонов в плавучке же. Не хотите попробовать?
Ну то есть для целых значений black/cblack это смысла не имеет, но я могу вытащить в структуру LibRaw статистику по маске (сумму черных пикселов по каналам и количество посчитанных), дальше их надо в плавучке поделить и полученное уже вычитать.
Это должно дать чуть лучшие самые глубокие тени (значения 0..3 или даже 0..7)

Значит вот:

Значит вот:
1) Вот этот вот патч правит то, что subtract_black не работает: https://github.com/LibRaw/LibRaw/commit/e8c6a3a992b0e0d48834a4a838814622...
2) А вот этот - в imgdata.color.black_stat[8] добавляет статистику по черной маске (актуально для всех Canon и небольшого числа других камер): https://github.com/LibRaw/LibRaw/commit/1bb29f2e67ed8e174232d817585700cc...

Ну и естественно если просто с github сделать git pull, то получите оба патча сразу.

Как работать с black_stat:

  1. float fblack[4];
  2. for(int color=0; color<4; color++)
  3. if(imgdata.color.black_stat[color+4] > 0) // может быть лучше не 0, а для достоверности 10 или 100
  4. fblack[color] = float(imgdata.color.black_stat[color])/float(imgdata.color.black_stat[color+4]);
  5. else
  6. fblack[color] = imgdata.color.black + imgdata.color.cblack[color];

вычитание сделал, но, кроме

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

Ну там максимальная разница с

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

А еще вопрос по сборке Cmake:

А еще вопрос по сборке Cmake: собирается только shared library. Есть объективные причины против static? :)

Я в CMake вообще ничего не

Я в CMake вообще ничего не понимаю. Мне законтрибьютили эти скрипты (протестировав), я их всосал и даже не тестировал (меня от Cmake тошнит).

Если можете сказать что там надо поменять (а еще лучше - фиганете pull request через Github) - буду благодарен.

Нет любви.

Нет любви.

Пытался использовать (как генератор проектов для Visual Studio/XCode) - резко не понравилось. Много лишнего.

Использую Qmake. Тоже не подарок, но результат устраивает (тем более, софт весь на Qt)

Вот еще вопрос: subtract

Вот еще вопрос: subtract_black() починился? В моих тестах то да, а вообще?

Ммм... Я у себя оставил

Ммм... Я у себя оставил raw2image_ex + версию с ручным вычитанием. Попробовал старый вариант - работает тоже

Еще есть ошибочка компиляции

Еще есть ошибочка компиляции под MSVS2010:
dht_demosaic.cpp(350): error C3005: 'collapse' : unexpected token encountered on OpenMP 'parallel for' directive

https://github.com/LibRaw

https://github.com/LibRaw/LibRaw/commit/abdb5d4344f2252de50021ab1bccc4f109295b76