6

似乎尼康自己的工具和photoshop可以选择在拍摄时打开图像。

但是使用 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 图像中似乎有一些噪点颜色。

4

1 回答 1

5

原始数据存储在 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
于 2014-03-14T11:32:11.530 回答