使用raw图工具打开AppleProRaw可以发现它是一个四通道线性rgba图像,博主用matlab写了一个处理线性rgb的simple pipe,仅供参考:
% apple pro raw
dng_file = 'D:/data/aeb/IMG_0001.dng';
% read meta
meta_info = imfinfo(dng_file);
wbc = reshape(meta_info.AsShotNeutral, [1 1 3]);
bl = meta_info.SubIFDs{1, 1}.BlackLevel(1);
wl = meta_info.SubIFDs{1, 1}.WhiteLevel(1);
tone_curve = meta_info.UnknownTags(3).Value;
tone_curve = reshape(tone_curve, [2, length(tone_curve)/2])';
% read linear rgb
im_lrgb = proraw_read(dng_file);
sz = size(im_lrgb);
% do wbc
im_wbc = single(im_lrgb)./repmat(wbc,[sz(1:2) 1]);
im_wbc = (im_wbc - bl)/wl;
% do ccm
rgb2xyz = [0.4124564 0.3575761 0.1804375
0.2126729 0.7151522 0.0721750
0.0193339 0.1191920 0.9503041];
xyz2cam = reshape(meta_info.ColorMatrix2,3,3)';
rgb2cam = xyz2cam * rgb2xyz;
rgb2cam = rgb2cam ./ repmat(sum(rgb2cam,2),1,3);
cam2rgb = rgb2cam ^ -1;
ccm = cam2rgb;
im_ccm(:,:,1) = im_wbc(:,:,1) * ccm(1,1) + im_wbc(:,:,2) * ccm(1,2) + im_wbc(:,:,3) * ccm(1,3);
im_ccm(:,:,2) = im_wbc(:,:,1) * ccm(2,1) + im_wbc(:,:,2) * ccm(2,2) + im_wbc(:,:,3) * ccm(2,3);
im_ccm(:,:,3) = im_wbc(:,:,1) * ccm(3,1) + im_wbc(:,:,2) * ccm(3,2) + im_wbc(:,:,3) * ccm(3,3);
% baseline exposure
im_srgb = im_ccm*(2^meta_info.BaselineExposure);
% do tone
im_tone = interp1(tone_curve(:,1), tone_curve(:,2), im_srgb, 'spline');
% do gamma
im_gamma = im_tone.^(1/2.2);
从proraw中读取raw,使用的是rawpy, 我们用matlab调用rawpy
function [im_wbc,meta_info]=proraw_read(dng_file)
raw = py.rawpy.imread(dng_file);
img_lrgb= uint16(raw.raw_image);
img_lrgb = img_lrgb(:,:,1:3);
meta_info = imfinfo(dng_file);
wbc = reshape(meta__info.AsShotNeutral, [1,1,3]);
bl = meta_info.SubIFD{1,1}.BlackLevel(1);
wl = meta_info.SubIFD{1,1}.WhiteLevel(1);
sz = size(im_lrgb);
im_wbc = single(img_lrgb)./repmat(wbc, [sz(1:2) 1]);
im_wbc = (im_wbc-bl)/(wl-bl);
end