主题:【码农天书】MATLAB利用Adobe DNG Converter解码RAW的方法
正序浏览
主题图片汇总
主题内检索
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月

提醒,本文不是给文艺青年看的,文科生请远离。

理工科的,如果对RAW、MATLAB没兴趣,也不必再往下看了。

严重欢迎码农吐槽、挑错!

照相机的RAW格式照片,充满了神秘感,解析RAW格式的照片,既能分析出照相机的一些基本性能指标,也能搞懂后期解码调整参数的理论依据,还能从根本上理解曝光、影调的关系,提高前期精确控制曝光的技术。

RAW格式照片的数据,厂商都是不公开的,目前获取RAW解码数据,多数采用dcraw的开源代码,但是dcraw的解码算法不够好,对白平衡色温计算、色彩空间转换等等,算法有些问题,解码效果不够理想。

本文采用的是Adobe的DNG数据解码,首先用Adobe DNG Converter软件把RAW转换成Adobe的DNG,再对DNG解码。Adobe DNG Converter是Adobe提供的免费转换软件,针对照相机新的RAW格式,不断升级,目前最新的版本是Ver 9.1,下载地址:
http://supportdownloads.adobe.com/thankyou.jsp?ftpID=6131&fileID=6167

Adobe的DNG数据格式,是开放协议,可以从Adobe网站下载,目前最新的版本是dng_spec_1.4.0.0.pdf,下载地址:
http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf

使用MATLAB读取DNG格式数据,可以参考下面的博客:
http://blogs_mathworks_com/steve/2011/03/08/tips-for-reading-a-camera-raw-file-into-matlab/

使用Adobe DNG Converter时,为了与MATLAB代码吻合,请设置如下首选项,“兼容性”选“自定”,“向后兼容版本”选“DNG 1.3”,“未压缩”选勾,“线性”不选勾。

读取DNG的MATLAB代码如下:
Info=imfinfo('xxx.dng');
TiffHandle=Tiff('xxx.dng'),'r');
offsets=getID(TiffHandle,'SubIFD');
setSubDirectory(TiffHandle,offsets(1));
CFA=double(read(TiffHandle));

RAW经过Adobe DNG Converter转换后的文件为'xxx.dng'。

CFA就是按马赛克格式存储的原始图像数据矩阵,假定照片的高、宽为PhotoHeight、PhotoWidth,CFA就是PhotoHeight×PhotoWidth的矩阵。

各种解码要用到的参数,在Info结构数据里面,其中Info、Info.SubIFDs{1}里面的标签对解码最为重要。

下面详述解码步骤与算法。

一、RAW数据处理

1、线性校准(Linearization)

如果存在LinearizationTable,查表将非线性RAW数据转换成线性数据。

比如Nikon D5300照相机的RAW的LinearizationTable,就存储在结构数据Info.SubIFDs{1}里面,是1×3085的数组,最小值为0,最大值16383。

原始的CFA数据,做1-3085的限幅处理,然后查表,换算成0-16383的数据。

这个LinearizationTable的存在说明,Nikon D5300的RAW数据做了压缩存储,把14bit的0-16383压缩到了1-3085,不到12bit。

2、黑色补偿(Black Subtraction)

黑色补偿值可能包括:BlackLevel、BlackLevelDeltaH、BlackLevelDeltaV。

RAW数据首先要减去黑色补偿值。如果既存在BlackLevel,又有BlackLevelDeltaH或者BlackLevelDeltaV,黑色补偿值Black是它们之和,即:
Black=BlackLevel+BlackLevelDeltaH,或者:
Black=BlackLevel+BlackLevelDeltaV。

Canon 5D的RAW,存在BlackLevelDeltaV,说明其ADC是对每行配置的。

Nikon D800E的BlackLevel=0,黑色补偿值是由ADC的特性决定的,一般来说不可能为0,如果BlackLevel=0,说明RAW数据存储前处理过了,已经做过黑色补偿。

BlackLevel一般对应马赛克的RGGB,有四个值,而BlackLevelDeltaH、BlackLevelDeltaV对应CMOS的行、列数目。

Canon 80D的RAW,ISO200时,BlackLevel=[512,512,512,512],而ISO400时,BlackLevel=[2048,2048,2048,2048]。

当BlackLevel按不同通道给出多个值时,标签BlackLevelRepeatDim指出BlackLevel的顺序,BlackLevelRepeatDim(1)、BlackLevelRepeatDim(2)分别给出BlackLevel的行数、列数。

3、RAW数据归一化

按照黑色补偿值、白色电平值WhiteLevel,将RAW数据归一化到0.0到1.0。计算公式:Xn=(X-Black)/(WhiteLevel-Black)。

低于0.0的Xn限幅为0.0,高于1.0的Xn限幅为1.0。

二、马赛克插值

MATLAB提供了一个去马赛克的Bayer插值的函数demosaic,可以直接使用,插值效果非常不错。

demosaic函数要知道马赛克的结构sensorAlignment,MATLAB在解析Info.SubIFDs{1}的时候,没能解析出CMOS的这个马赛克结构,它隐藏在标签Info.SubIFDs{1}.UnknownIDs里,ID=33421给出了马赛克的行、列数目,一般来说是[2,2],ID=33422给出对应的颜色,0-RED、1-GREEN、2-BLUE。

比如,Canon 1DXII,ID=33421为[2,2],ID=33422为[0,1,1,2],马赛克的结构sensorAlignment就是‘rggb’。

Olympus E-M1,ID=33421为[2,2],ID=33422为[2,1,1,0],sensorAlignment就是‘bggr’。

CFA矩阵经过Bayer插值后,变成真正的RGB图像:

Photo=demosaic(CFA,sensorAlignment)。

Photo是PhotoHeight×PhotoWidth×3矩阵。

三、CMOS激活区域裁剪

RAW存储的是整个CMOS的数据,而标准的RAW解码,都是取其中的一个部分,比整个CMOS稍小一点。

比如,Nikon D810,整个CMOS范围是ActiveArea=[0,0,4930,7372],照片范围是DefaultCropSize=[7360,4912],裁剪起始点是DefaultCropOrigin=[12,8],裁剪后的照片:

Photo=Photo(0+8+1:0+8+1+4912,0+12+1:0+12+1+7360,:);

四、照相机色彩空间转换到CIE XYZ(D50)色彩空间

1、标签说明

DNG的色彩空间转换比dcraw要复杂,多数照相机的转换矩阵都是依据白平衡色温内插计算出来的,而不是简单的映射关系。

使用到的标签数据如下:
AnalogBalance,
AsShotNeutral,
CalibrationIlluminant1、CalibrationIlluminant2,
ColorMatrix1、ColorMatrix2,
CameraCalibration1、CameraCalibration2,
ForwardMatrix1(50964)、ForwardMatrix2(50965),
CameraCalibrationSignature(50931)、ProfileCalibrationSignature(50932),

AnalogBalance是模拟白平衡,摄像机有的会使用,目前照相机都未使用,所以AnalogBalance=[1,1,1]。使用时AnalogBalance要转换成对角线矩阵AB,AB=[1,0,0;0,1,0;0,0,1]。

AsShotNeutral是一组R、G、B数值,是在照相机RAW的RGB空间上,拍摄时使用的白平衡的白点。比如典型的AsShotNeutral=[0.4588,1.0000,0.8678]。使用时,AsShotNeutral要转置成3×1矩阵,CameraNeutral=AsShotNeutral’。

CalibrationIlluminant1、CalibrationIlluminant2,这两组数据分别对应低色温、高色温两种情况。比较典型的情况是,CalibrationIlluminant1=17(光源Standard A),CalibrationIlluminant2=21(光源D65)。大部分的拍摄场景,光源都处在这两种光源的范围之内,就可以利用这两组光源下测量出的ColorMatrix、CameraCalibration、ForwardMatrix内插,得到对应拍摄光源色温下比较精确的数据。

ColorMatrix1、ColorMatrix2,CameraCalibration1、CameraCalibration2,ForwardMatrix1、ForwardMatrix2,都是分别对应CalibrationIlluminant1、CalibrationIlluminant2两个光源的数据,用于色彩空间转换的计算。它们都是行顺序排列的数组,可以用reshape转换成3×3矩阵。

ForwardMatrix1、ForwardMatrix2,MATLAB也没有解析出来,存储在RawInfo.UnknownTags里,需要编程读取。

ForwardMatrix1、ID=50964,ForwardMatrix2、ID=50965。

2、线性插值的算法

先来说线性插值的算法。CameraNeutral是RAW数据RGB空间上的白点,假定已知CameraNeutral对应的XYZ空间上的白点为XyzNeutral。可以算出XyzNeutral在色品图上的坐标为(x,y),根据CalibrationIlluminant1、CalibrationIlluminant2两组光源,确定其在色品图上的坐标为(x1,y1)、(x2,y2),计算出(x,y)到(x1,y1)、(x2,y2)的距离d1、d2,用W1=d2/(d1+d2)、W2=d1/(d1+d2)作为权系数,对ColorMatrix1、ColorMatrix2,CameraCalibration1、CameraCalibration2,ForwardMatrix1、ForwardMatrix2做线性内插。比如:

CM=W1×ColorMatrix1+W2×ColorMatrix2;
CC=W1×CameraCalibration1+W2×CameraCalibration2;
FM=W1×ForwardMatrix1+W2×ForwardMatrix2。

如果(x,y)不在(x1,y1)与(x2,y2)之间,而是偏在(x1,y1)的外侧,则取W1=1,W2=0,偏在(x2,y2)的外侧,则W1=0,W2=1。

上面所说的是算法原理,实际计算时,为了保正计算精度,并不是在XYZ的色品图上做的,而是在u、v均匀色品图上计算,距离使用的是Mierd,即色温的倒数×1000000,这样计算出的权系数才准确。

3、根据CameraNeutral确定权系数

有了线性插值算法做基础,现在可以来做RAW的RGB空间到XYZ空间的转换了,首先是白点转换,就是把CameraNeutral转换到XYZ空间。

因为XYZ空间的白平衡点未知,无法确定内插的权系数,无法算出CC、CM,所以,要用迭代算法确定权系数。

先假定一个XYZ空间的白平衡点,比如D50,坐标(x,y),用(x,y)计算出插值的权重因子W1、W2,计算出CC、CM,XYZ到Camera的RGB空间的转换矩阵为:

XYZtoCamera = AB×CC×CM;
CameraToXYZ=Inverse(XYZtoCamera),Inverse是矩阵求逆。

根据CameraNeutral得出XYZ空间的新白点:

XYZnew=CameraToXYZ×CameraNeutral;

判断(xnew,ynew)到(x,y)的距离,大于门限值,用(xnew,ynew)替代(x,y)继续迭代运算。

小于门限值,可以认为(xnew,ynew)就是XYZ的白平衡点XyzNeutral,根据这个白点确定的权系数W1、W2,可以计算出:

FM=W1×ForwardMatrix1+W2×ForwardMatrix2。

4、转换矩阵

下面要从CIE XYZ到CIE XYZ(D50)的转换,就是把XyzNeutral转换到D50,计算方法如下:

ReferenceNeutral=Inverse (AB×CC)×CameraNeutral;
D=Invert (AsDiagonalMatrix (ReferenceNeutral));
AsDiagonalMatrix把ReferenceNeutral向量排列成对角线矩阵。

FM=W1×ForwardMatrix1+W2×ForwardMatrix2。
CameraToXYZ_D50=FM×D×Inverse(AB×CC)。

CameraToXYZ_D50就是最终结果,能把RAW数据直接转换到CIE XYZ(D50)空间,成为通用的标准数据。

5、没有提供校准的情况

绝大部分照相机的RAW数据,都提供了上面所说的标签,支持用线性插值的方式精确进行RAW的RGB到CIE XYZ(D50)色彩空间的转换,但也有一些照相机的RAW不支持这样的校准。

Adobe的DNG标签CameraCalibrationSignature、ProfileCalibrationSignature作用就是判断照相机是否支持校准。

这两个标签MATLAB也没有解析,隐藏在RawInfo.UnknownTags里面,ID=50931、ID=50932。

这两个标签指向的都是字符串,当这两个字符串相同时,照相机RAW支持上述的校准方法,字符串不相同,或者这两个标签不全时,不支持上述的校准方法。这个字符串目前为‘com.adobe’。

没有提供校准的情况下,一般只存在ColorMatrix1、CameraCalibration1,不存在ForwardMatrix1,此时,CC=CameraCalibration1,CM=ColorMatrix1,XYZ空间的白点:

XYZtoCamera=AB×CC×CM;
XyzNeutral=Inverse (XYZtoCamera)×AsShotNeutral;
CameraToXYZ_D50=Madapt*CameraToXYZ;

上式中Madapt是BradfordAlgorithm算法矩阵,可以按下式计算:

Mbfd=[0.7328,0.4296,-0.1624;-0.7036,1.6975,0.0061;0.0030,0.0136,0.9834];
SRC=Mbfd*XyzNeutral;PCS=Mbfd*D50;
T=[ PCS(1)/SRC(1),0,0;0,PCS(2)/SRC(2),0;0,0,PCS(3)/SRC(3)];
Madapt=Mbfd\T*Mbfd;

五、HSV校准

如果DNG存在HSV映射表,要按照映射表对HSV做校正。如果存在两个映射表,要按照前面说的方式,根据权系数内插,如果只有一个映射表,直接使用,不做内插。

首先,把XYZ(D50)转换到ProPhoto RGB线性空间,再把RGB转换成HSV。

根据HSV计算出索引号,查表,找出Hue偏移量、Saturation因子、Value因子,按照H加Hue偏移量,S乘以Saturation因子,V乘以Value因子修正,最终结果,H整除360,S、V做0.0-1.0限幅。

HSV校准完毕,再根据需要,转换回ProPhoto RGB线性空间,或者XYZ(D50)空间。

MATLAB也没有解析HSV映射表的标签,HSV映射表如果有,存储在RawInfo.UnknownTags里:

ProfileHueSatMapDims、ID=50937,给出HSV校准表的分划数目,HueDivs、SaturationDivs、ValueDivs。
ProfileHueSatMapData1、ID=50938,对应低色温的HSV校准表。
ProfileHueSatMapData2、ID=50939,对应高色温的HSV校准表。

HSV校准表是V、H、S循环嵌套的方式存储的,基本单元三个数据对应H修正偏移量、S修正因子、V修正因子,最外层是ValueDivs,中间是HueDivs,最内层是SaturationDivs。一共有ValueDivs×HueDivs×SaturationDivs×3个数据。

查表算法,首先把HSV校准表变形为:
reshape(ProfileHueSatMapData,3,HueDivs×SaturationDivs×ValueDivs);

然后对H、S、V归一化处理,再分划到对应的Divs内,计算出索引值,查表,找出修正因子,按修正因子修正H、S、V。

比如:
Hn=min(floor(H/360×HueDivs),HueDivs-1);
Sn=min(floor(S×SaturationDivs),SaturationDivs-1);
Vn=min(floor(V×ValueDivs),ValueDivs-1);

索引:Index=Vn×HueDivs×SaturationDivs+Hn×SaturationDivs+Sn+1;

用Index查表,得到对应的H修正偏移量、S修正因子、V修正因子,按照H加修正偏移量,S乘以修正因子,V乘以修正因子,完成校准。

六、曝光校准

标签BaselineExposure提供照相机厂商内部的曝光偏移量,单位为EV。

大部分照相机厂商都为了保护RAW数据高光不溢出,在曝光时故意减少一点曝光量,这样高光就不容易溢出,在RAW解码时,再补偿回来。

比如,Olympus的E-M1 MarkII在ISO200时的BaselineExposure=0.81EV。

也有照相机厂商设置负值的BaselineExposure,比如,Pentax的K-1在ISO200时的BaselineExposure=-0.51EV,就是说,过曝0.51EV,RAW解码时再减回来。这样的好处是能改善阴影的信噪比,缺点是牺牲了高光的范围。

当BaselineExposure为正值时,效果就是常说的向左曝光,为负值时,就是向右曝光(ETTR)。

RAW的曝光校准算法如下:
Photo=Photo×2^BaselineExposure。

七、HSV色彩增强

标签ProfileLookTableDims、ProfileLookTableData,MATLAB也没有解析,存储在RawInfo.UnknownTags里,ID=50981、ID=50982。

与HSV校准的算法相同,不需要用权系数内插,作用是色彩增强,不再赘述。

八、影调曲线

标签ProfileToneCurvea,MATLAB也没有解析,存储在RawInfo.UnknownTags里,ID=50940。

ProfileToneCurvea是一组N个样本点,有2×N个数据,N个样本用interp1(‘spline’)插值,得到影调曲线。

影调曲线要在ProPhoto RGB的线性空间转换,具体算法如下:

Curve=reshape(ProfileToneCurve,2,N);
x=Curve(1,;
y=Curve(2,;
delta=1.0e-6;
xi=0:delta:1.0;
yi=interp1(x,y,xi,'spline');
X=round(X/delta)+1;
Y=yi(X);

不同照相机的影调曲线都大致相同,稍有一点区别。

如果RAW数据里没有ProfileToneCurvea标签,也要用一条相似的曲线转换,这个影调关系的转换必不可少。

九、Gamma校准

Gamma校准是RAW解码的最后一步,根据需要,把照片转换到sRGB、Adobe RGB空间,按照sRGB、Adobe RGB的Gamma对数据校准。

Gamma校准是sRGB、Adobe RGB标准规定好的,照做即可。

十、Opcode List Processing

Opcode List Processing是DNG协议里面最复杂的部分,包括镜头校准、坏点屏蔽、噪声处理等等,算法也十分复杂。

目前还未吃透这部分协议内容,留下以后继续折腾。

MATLAB源代码已经上传到云盘:
链接:http://pan.baidu.com/s/1mhCRO4C 密码:widv

登录后可直接显示原图
相关标签: D50 Nikon D5300 照相机 1.0
(2)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
浏览:6639 回帖:136
游客没有回帖权限
泡菜
泡网分: 0.033
主题: 0
帖子: 35
注册: 2013年7月
Chlheng 发表于 2019-04-16 13:09
感谢楼主无私奉献的代码!我从您的代码里学到了很多东西,谢谢!
不过我有个问题想请教一下。具体叙述如下:
现有多个16bit的dng文件,我已经在matlab里实现了对它们的hdr合成,得到了最终的图像x。图像x是未反马赛克的CFA数据。现希望能把x写...

不知老师是否解决了?能联系下不?987687405@qq.com,谢谢!
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
广西
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
古镇遗韵 发表于 2022-1-15 20:16
请问,Invert()函数在这里起什么作用呢?从字面意思看就是“反转”,把一个对角矩阵翻转的结果是什么呢?谢谢。


我只做标准RGGB马赛克的解码,所以我把Invert()简单当成Inverse()对待,就是矩阵求逆。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.018
主题: 0
帖子: 8
注册: 2018年10月
rivershaw 发表于 2017-5-7 15:35
D=Invert (AsDiagonalMatrix (ReferenceNeutral));
AsDiagonalMatrix把ReferenceNeutral向量排列成对角线矩阵。


请问,Invert()函数在这里起什么作用呢?从字面意思看就是“反转”,把一个对角矩阵翻转的结果是什么呢?谢谢。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
trackback 发表于 2021-10-26 10:08
非常感谢楼主大大能回复我,太荣幸了!就是看了您的帖子才刚刚自学matlab和色彩科学相关的东西,所以有些东西问起来很没技术含量。再问一下DataTable.mat里面的PlanckianLocusMired里面的uvxy等是普朗克轨迹相关数据吗?这些数据怎么得到的呢


普朗克黑体的光谱分布有固定公式,对这个光谱分布、三刺激值的乘积做积分,可以计算出黑体的XYZ颜色,得到色度坐标x、y,u、v,画出来就是普朗克黑体轨迹。

PlanckianLocusTemperature是按照色温T计算的数据,PlanckianLocusMired是按照Mired计算的数据,Mired=1e6/T。 本帖最后由 rivershaw 于 2021-10-28 04:35 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.011
主题: 0
帖子: 0
注册: 2021年1月
非常感谢楼主大大能回复我,太荣幸了!就是看了您的帖子才刚刚自学matlab和色彩科学相关的东西,所以有些东西问起来很没技术含量。再问一下DataTable.mat里面的PlanckianLocusMired里面的uvxy等是普朗克轨迹相关数据吗?这些数据怎么得到的呢
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.011
主题: 0
帖子: 0
注册: 2021年1月
非常感谢楼主大大能回复我,太荣幸了!就是看了您的帖子才刚刚自学matlab和色彩科学相关的东西,所以有些东西问起来很没技术含量。再问一下DataTable.mat里面的PlanckianLocusMired里面的uvxy等是普朗克轨迹相关数据吗?这些数据怎么得到的呢
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
trackback 发表于 2021-10-25 22:40
楼主你好,源码里权系数算法那儿没看太懂,有资料可以参考一下吗?


没有具体的资料,就是相关色温的计算方法,可以网上搜一下。

计算出白平衡点的相关色温,根据白点到SA、D65的距离(迈尔德)确定权系数。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.011
主题: 0
帖子: 0
注册: 2021年1月
楼主你好,源码里权系数算法那儿没看太懂,有资料可以参考一下吗?
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
阿雪初摄 发表于 2021-3-28 18:02
要真正看懂老师的这个帖,难度确实非同一般。通过此帖,对ACR解码DNG文件的大致流程算是有了一点了解,非常感谢老师。

有以下几个疑惑请教老师:

1、关于CameraCalibration标签,我翻了一下DNG规范,大概意思是说将参考相机空间转换到单个相机空间。相机配置文件应该都是特定于相机型号的,不可能特定于单个相机(包括其中的CameraCalibration标签),那又如何能够通过这个标签将参考相机空间转换到单个相机空间呢?烦请老师解释一下这个标签的意思。
2、关于ForwardMatrix标签。是不是通过这个标签就可以将相机空间直接转换到XYZ_D50,而不需要通过XYZ空间来中转(即Camera RGB=>XYZ=>XYZ_D50)?
3、ACR中的那些诸如曝光和色彩的用户调整,在整个DNG解码的流程中处于哪个阶段呢?


1、我也没有彻底搞清楚CameraCalibration的含义,我猜是一个针对CMOS输出的矫正,使用方法在dng协议第6章说得还是比较明白,我就是照做的。

2、对!我也是这样理解的。实际上只有白平衡白点计算时会用到XYZ。

3、你参考一下@逐色追影在https://forum.xitek.com/forum-viewthread-tid-1915969-page-1-ordertype-1-authorid-9815046.html这个帖子里说的话,曝光调整靠前(7),色彩调整靠后,应该在9、10之间。

以上意见仅供参考。

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
technical04 发表于 2021-8-27 16:32
楼主你好,我用线性的DCP文件解我的D3000的RAW文件,测量后得出的结果似乎不是sRGB的GAMMA ,是否CAMERA RAW的解码中还有其他算法参与其中?


我不是太明白你的意思,能说得更详细一点吗?从RAW还是DNG解码,怎么测量的sRGB的Gamma?

Gamma就是一个曲线变换,x、y坐标都应该用RGB的数值,不该使用EV做单位。

ToneCurve是Adobe解码时的缺省曲线,个别的RAW里面可能还包含一条ProfileToneCurve,我不知道D3000有没有。如果有,ToneCurve就不能简单置为线性,而要置成反ProfileToneCurve曲线,抵消掉ProfileToneCurve的影响。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.412
主题: 0
帖子: 64
注册: 2009年10月
楼主你好,我用线性的DCP文件解我的D3000的RAW文件,测量后得出的结果似乎不是sRGB的GAMMA ,是否CAMERA RAW的解码中还有其他算法参与其中?
登录后可直接显示原图
登录后可直接显示原图
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 43.188
主题: 21
帖子: 10985
注册: 2006年6月
搞懂了 也没文艺青年会调raw
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.009
主题: 6
帖子: 52
注册: 2008年4月
要真正看懂老师的这个帖,难度确实非同一般。通过此帖,对ACR解码DNG文件的大致流程算是有了一点了解,非常感谢老师。

有以下几个疑惑请教老师:

1、关于CameraCalibration标签,我翻了一下DNG规范,大概意思是说将参考相机空间转换到单个相机空间。相机配置文件应该都是特定于相机型号的,不可能特定于单个相机(包括其中的CameraCalibration标签),那又如何能够通过这个标签将参考相机空间转换到单个相机空间呢?烦请老师解释一下这个标签的意思。
2、关于ForwardMatrix标签。是不是通过这个标签就可以将相机空间直接转换到XYZ_D50,而不需要通过XYZ空间来中转(即Camera RGB=>XYZ=>XYZ_D50)?
3、ACR中的那些诸如曝光和色彩的用户调整,在整个DNG解码的流程中处于哪个阶段呢?
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
阿雪初摄 发表于 2021-3-18 23:47
请问老师,您这里给出的基于Bradford算法的矩阵Mbfd=[0.7328,0.4296,-0.1624;-0.7036,1.6975,0.0061;0.0030,0.0136,0.9834]是怎么来的呢?这和ICC规范中推荐的Bradford矩阵(也是您在另一帖“用photoshop做色彩管理实验”中提到的)M=[0.8951,0.2664,-0.1614;-0.7502,1.7135,0.0367;0.0389,-0.0685,1.0296]是什么关系呢?谢谢老师。


我当时对这个Bradford算法不是特别明白,随便从网上找了一个CAT02版的,后来明白了一点,就都改成ICC推荐的版本了。
http://www_brucelindbloom_com/index.html?Eqn_ChromAdapt.html 本帖最后由 rivershaw 于 2021-3-19 14:43 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.009
主题: 6
帖子: 52
注册: 2008年4月
rivershaw 发表于 2017-5-7 15:35
提醒,本文不是给文艺青年看的,文科生请远离。

理工科的,如果对RAW、MATLAB没兴趣,也不必再往下看了。

严重欢迎码农吐槽、挑错!

照相机的RAW格式照片,充满了神秘感,解析RAW格式的照片,既能分析出照相机的一些基本性能指标,也能搞懂后期解码调整参数的理论依据,还能从根本上理解曝光、影调的关系,提高前期精确控制曝光的技术。

RAW格式照片的数据,厂商都是不公开的,目前获取RAW解码数据,多数采用dcraw的开源代码,但是dcraw的解码算法不够好,对白平衡色温计算、色彩空间转换等等,算法有些问题,解码效果不够理想。

本文采用的是Adobe的DNG数据解码,首先用Adobe DNG Converter软件把RAW转换成Adobe的DNG,再对DNG解码。Adobe DNG Converter是Adobe提供的免费转换软件,针对照相机新的RAW格式,不断升级,目前最新的版本是Ver 9.1,下载地址:
http://supportdownloads.adobe.com/thankyou.jsp?ftpID=6131&fileID=6167。

Adobe的DNG数据格式,是开放协议,可以从Adobe网站下载,目前最新的版本是dng_spec_1.4.0.0.pdf,下载地址:
http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf

使用MATLAB读取DNG格式数 ...


请问老师,您这里给出的基于Bradford算法的矩阵Mbfd=[0.7328,0.4296,-0.1624;-0.7036,1.6975,0.0061;0.0030,0.0136,0.9834]是怎么来的呢?这和ICC规范中推荐的Bradford矩阵(也是您在另一帖“用photoshop做色彩管理实验”中提到的)M=[0.8951,0.2664,-0.1614;-0.7502,1.7135,0.0367;0.0389,-0.0685,1.0296]是什么关系呢?谢谢老师。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.092
主题: 0
帖子: 5
注册: 2017年12月
感谢楼主无私奉献的代码!我从您的代码里学到了很多东西,谢谢!

不过我有个问题想请教一下。具体叙述如下:
现有多个16bit的dng文件,我已经在matlab里实现了对它们的hdr合成,得到了最终的图像x。图像x是未反马赛克的CFA数据。现希望能把x写入到dng里边以供raw解码软件解码。

然而,由于hdr之后图像的动态范围非常大以致线性的16bit不足以准确记录,暗部出现了偏色死色的现象。能解决的方法有两个:1、用32bit浮点数来储存;2、依然用16bit无符号整数,但x需要加工成y,譬如y=x.^(1/gamma),把y储存到dng里。

第一个方法简单粗暴,但是占用体积。最麻烦的还是我不知道怎么在matlab里往dng里写入32bit浮点数据。
第二个方法能充分挖掘16bit的潜力,好处是体积小,而且我知道怎么实现。但棘手的是,解码raw的软件不会自动应用反函数,譬如x=y.^gamma。它直接用y来作接下来的处理,导致画面发灰和颜色错误。如果能找到dng里的一个tag,在tag里边写入一个tone curve,告诉解码的软件反函数是怎么样的,也许能解决问题。然而我所了解的tone curve都是在CFA转成XYZ(或RGB)之后再被使用的,这跟先对CFA使用tone curve再转换成XYZ不等价。

请问楼主,这应该怎么解决呢?谢谢!
(3)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
静默虚空 发表于 2018-12-2 21:26
写的很好,学习了
不知道OPCODE部分有更新吗?谢谢!


没有,太难,放弃了。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.018
主题: 2
帖子: 15
注册: 2018年10月
rivershaw 发表于 2017-5-7 15:35
提醒,本文不是给文艺青年看的,文科生请远离。

理工科的,如果对RAW、MATLAB没兴趣,也不必再往下看了。

严重欢迎码农吐槽、挑错!

照相机的RAW格式照片,充满了神秘感,解析RAW格式的照片,既能分析出照相机的一些基本性能指标,也能搞懂后期解码调整参数的理论依据,还能从根本上理解曝光、影调的关系,提高前期精确控制曝光的技术。

RAW格式照片的数据,厂商都是不公开的,目前获取RAW解码数据,多数采用dcraw的开源代码,但是dcraw的解码算法不够好,对白平衡色温计算、色彩空间转换等等,算法有些问题,解码效果不够理想。

本文采用的是Adobe的DNG数据解码,首先用Adobe DNG Converter软件把RAW转换成Adobe的DNG,再对DNG解码。Adobe DNG Converter是Adobe提供的免费转换软件,针对照相机新的RAW格式,不断升级,目前最新的版本是Ver 9.1,下载地址:
http://supportdownloads.adobe.com/thankyou.jsp?ftpID=6131&fileID=6167。

Adobe的DNG数据格式,是开放协议,可以从Adobe网站下载,目前最新的版本是dng_spec_1.4.0.0.pdf,下载地址:
http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf

使用MATLAB读取DNG格式数 ...

写的很好,学习了
不知道OPCODE部分有更新吗?谢谢!
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
passiflora 发表于 2018-10-21 12:34
大侠您好,请教一下我按照您的代码和您给的Mathworks链接的代码读取cfa全是0,一片黑的是怎么回事?


DNG转换时,格式错了,要用下面图示的。

登录后可直接显示原图
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.009
主题: 0
帖子: 9
注册: 2009年11月
大侠您好,请教一下我按照您的代码和您给的Mathworks链接的代码读取cfa全是0,一片黑的是怎么回事?
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 4.857
主题: 143
帖子: 2899
注册: 2016年11月
超级复杂,楼主辛苦了
本帖由安卓客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
xalesxin 发表于 2018-4-1 21:09
收藏


105#

rivershaw 发表于 2018-1-27 06:44
源代码的链接更新如下:

链接:https://pan.baidu.com/s/1dteBBw 密码:u9do
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 38.363
主题: 1
帖子: 1832
注册: 2004年6月
链接失效了?
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
肖邦OP9no1 发表于 2018-4-2 12:11
多码几个字啊,readme自述文件是什么鬼?


关于如何使用的readme.doc在软件包里面。

这个用起来有点麻烦,不像视窗那样容易,你得仔细看看。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
禁言中
泡网分: 3.014
主题: 68
帖子: 4109
注册: 2013年6月
rivershaw 发表于 2018-4-2 11:47
参见readme,


多码几个字啊,readme自述文件是什么鬼?
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.666
主题: 45
帖子: 6771
注册: 2007年7月
肖邦OP9no1 发表于 2018-4-2 11:10
如何用?
能写个使用说明方便一下文青和文科嘛


参见readme,
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
禁言中
泡网分: 3.014
主题: 68
帖子: 4109
注册: 2013年6月
rivershaw 发表于 2017-5-7 15:35
提醒,本文不是给文艺青年看的,文科生请远离。

理工科的,如果对RAW、MATLAB没兴趣,也不必再往下看了。

严重欢迎码农吐槽、挑错!

照相机的RAW格式照片,充满了神秘感,解析RAW格式的照片,既能分析出照相机的一些基本性能指标,也能搞懂后期解码调整参数的理论依据,还能从根本上理解曝光、影调的关系,提高前期精确控制曝光的技术。

RAW格式照片的数据,厂商都是不公开的,目前获取RAW解码数据,多数采用dcraw的开源代码,但是dcraw的解码算法不够好,对白平衡色温计算、色彩空间转换等等,算法有些问题,解码效果不够理想。

本文采用的是Adobe的DNG数据解码,首先用Adobe DNG Converter软件把RAW转换成Adobe的DNG,再对DNG解码。Adobe DNG Converter是Adobe提供的免费转换软件,针对照相机新的RAW格式,不断升级,目前最新的版本是Ver 9.1,下载地址:
http://supportdownloads.adobe.com/thankyou.jsp?ftpID=6131&fileID=6167

Adobe的DNG数据格式,是开放协议,可以从Adobe网站下载,目前最新的版本是dng_spec_1.4.0.0.pdf,下载地址:
http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf

使用MATLAB读取DNG格式数 ...


如何用?
能写个使用说明方便一下文青和文科嘛
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
禁言中
泡网分: 1.754
主题: 1
帖子: 968
注册: 2017年7月
收藏
本帖由安卓客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 28.667
主题: 1
帖子: 652
注册: 2003年1月
做个记号。常来学习。
本帖由安卓客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
回复主题: 【码农天书】MATLAB利用Adobe DNG Converter解码RAW的方法
功能受限
游客无回复权限,请登录后再试