Кажется, что собственный инструмент nikons и фотошоп имеют возможность открыть изображение, как оно было снято.
но с использованием процессора libraws dcraw я не могу понять это.
вот моя реализация.
CV_EXPORTS_W int load_image(const char * path, cv::Mat & output)
{LibRaw RawProcessor;
int ret;
#define imgD RawProcessor.imgdata
imgD.params.use_camera_wb = 1;
imgD.params.use_auto_wb = 0;
if ((ret = RawProcessor.open_file(path)) != LIBRAW_SUCCESS)
{
fprintf(stderr, path, libraw_strerror(ret));
return -1;
}
if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS)
{
return -1;
}
int check = RawProcessor.dcraw_process();
libraw_processed_image_t *image_ptr = RawProcessor.dcraw_make_mem_image(&check);
output = cv::Mat(cv::Size(image_ptr->width, image_ptr->height), CV_8UC3, image_ptr->data, cv::Mat::AUTO_STEP);
cv::cvtColor(output, output, 4);
}
Обновлен с изображением, чтобы показать, о чем я говорю:
Изображения как-то нормализуются. Если исходное изображение содержит большую область светлого матриала, общее изображение становится более темным. Я хочу иметь возможность просто читать необработанные данные изображений и нормализовать или обрабатывать их по-своему в opencv.
Основываясь на комментариях, я настроил яркость, но теперь проблема заключается в цветовых значениях пикселей, которые лучше всего увидеть здесь:
Изображение слева — результат libraw, а справа — viewnx.
Кажется, что в изображении libraw есть некоторые цвета шума.
Необработанные данные хранятся в массиве LibRaw :: rawdata.raw_image []. Эти значения «максимально возможны» без чёрного вычитания и / или де-байеровской (демозаики).
Для доступа к этим данным вам нужно вызвать LibRaw :: open_file () и LibRaw :: unpack.
Также вы можете исключить некоторые шаги из обработки данных в LibRaw :: dcraw_process ():
imgdata.params.no_interpolation=1 disables demosaic
imgdata.params.no_auto_scale=1 disables scaling from camera maximum to 64k
imgdata.params.no_auto_bright=1 disables auto brighten
Других решений пока нет …