似乎nikons拥有自己的工具,而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);
}
Run Code Online (Sandbox Code Playgroud)
更新了图像以显示我在说什么:图像正在以某种方式进行标准化.如果原始图像包含大面积的光照,则整个图像变得更暗.我希望能够只读取原始图像数据并在opencv中以我自己的方式规范化或处理它.

基于评论,我调整了亮度,但现在问题是像素颜色值,这里最好看到:

左边的图像是libraw的结果,右边的图像是viewnx.libraw图像中似乎有一些噪音颜色.
我尝试使用LibRaw读取NEF文件,然后将其放在cv :: Mat中。NEF文件将数据存储为12位,这意味着我需要16位,因此我应该像这样使用CV_16UC4:
Mat img1(height, width, CV_16UC4);
Run Code Online (Sandbox Code Playgroud)
Libraw将数据存储为ushort * [4],所以我认为这应该可行:
for (i = 0; i < iwidth*height; i++) {
img1.data[4*i+1] = Processor.imgdata.image[i][0];
img1.data[4*i+2] = Processor.imgdata.image[i][1];
img1.data[4*i+3] = Processor.imgdata.image[i][2];
img1.data[4*i+4] = Processor.imgdata.image[i][3];
}
Run Code Online (Sandbox Code Playgroud)
我还会收到一个构建错误,因为将发生ushort到uchar转换,因此数据可能会丢失,这是有道理的,但是,如何将比uchar大的数据放入数据中?
我正在编写 python 脚本,我需要从原始照片文件(例如 .CR2)中获取 exif 信息。
我发现 Python Rawkit提供了这样做的能力。
with Raw(filename=image_path) as raw:
print raw.metadata
Metadata(aperture=-1.2095638073643314e+38, timestamp=4273602232L,
shutter=-1.1962713245823862e+38, flash=True,
focal_length=-1.2228562901462766e+38, height=3753,
iso=-1.182978841800441e+38,
make='Canon', model='EOS 5D Mark II',
orientation=0, width=5634)
Run Code Online (Sandbox Code Playgroud)
但我有点困惑,如何读取这些值?。例如,我期待像100/200/400这样的iso值,但什么是-1.182978841800441e+38?
我的问题不是针对iso的,也针对快门、光圈……
我检查了libraw和 rawkit doc,但无法找到如何读取/转换这种值。
文档中的这部分不是很详细:
float iso_speed;
ISO sensitivity.
float shutter;
Shutter speed.
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解如何阅读这些值吗?
谢谢
[更新]
正如neo所建议的,我将使用ExifRead。事实上,这是一个更好的选择,我正在编写一个 python 脚本。使用 ExifRead 不需要额外的 C 库依赖项。
我能够打开佳能原始文件并解析 Exif,但不幸的是遇到了错误的光圈值:
EXIF ApertureValue (Ratio): 3
# My photo was taken in 2.8 (maybe a rounded value on …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 RawPy 模块在 Python 中读取原始图像并对其进行去马赛克。不幸的是,该模块不提供简单的去马赛克方法,而是提供完整的后处理函数,该函数不适合我的情况,因为我想保留浮点图像,而不是使用 8 位 uint。我也不想应用伽马或任何其他后处理,所以我最终手动对它们进行去马赛克。当我使用已加载 dng 图像的 RawPy 对象的raw_pattern方法时,我得到以下结果:
In[23] : raw_image.raw_pattern
Out[23]: array([[0, 1],
[3, 2]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
但 Adobe 的 DNG 文档说
Digital Negative Specification
September 2012
CFAPlaneColor
...
Value
See below
Default
0, 1, 2 (red, green, blue)
Run Code Online (Sandbox Code Playgroud)
我很困惑这3从哪里来?如果有另一种方法对原始图像进行去马赛克也很合适,因为我很容易替换项目的这一部分。
谢谢提前!