代码改变世界

DCDM-X’Y’Z’转RGB的研究

2018-04-26 15:54  那么像你  阅读(145)  评论(0)    收藏  举报

经过研究发现对于DCDM-X’Y’Z’转RGB会分两个步骤 

1、 DCDM-X’Y’Z’转XYZXYZ为线性归一值,即取值在[0,1],而DCDM-X’Y’Z’(一下简称X’Y’Z’)可以认为是XYZ的一种编码方式。

2、 XYZRGBRGB为线性归一值。

一 DCDM-X’Y’Z’转XYZ

对于X’Y’Z’与XYZ之间的转换方式,可以认为是X’Y’Z’对XYZ进行编码的过程,X’Y’Z’对XYZ的编码公式为

 

 

其中k=48.0(白光亮度),INT表示取整数.

XYZX’Y’Z’的解码公式为

 

L=48.0(白光亮度)

这两个公式是现在研究的唯一公式,没有再找到其他的转换公式。

二 XYZRGB

XYZRGB转换时都是线性,现在研究发现都是归一值

XYZ RGB之间的转换现在找到了多个公式,现在主要研究了ImageMagicITU-R BT.709规范)、OpencvSMPTE431-2规范;

 

1、 ImageMagic的转换公式:

 

RGB->XYZ

 

X = 0.41239558896741421610 * R + 0.35758343076371481710 * G + 0.18049264738170157350 * B;

 

Y = 0.21258623078559555160 * R + 0.71517030370341084990 * G + 0.07220049864333622685 * B;

 

Z = 0.01929721549174694484 * R + 0.11918386458084853180 * G + 0.95049712513157976600 * B;

 

XYZ->RGB

 

R = 3.2406 * X - 1.5372 * Y - 0.4986 * Z;

 

G = -0.9689 * X + 1.8758 * Y + 0.0415 * Z;

 

B = 0.0557 * X - 0.2040 * Y + 1.0570 * Z;

 

2、 OpenCv的转换公式

 

RGB->XYZ

 

X = 0.412453 * R + 0.357580 * G + 0.180423 * B;

 

Y = 0.212671 * R + 0.715160 * G + 0.072169 * B;

 

Z = 0.019334 * R + 0.119193 * G + 0.950227 * B;

 

XYZ->RGB

 

R = 3.240479 * X - 1.537150 * Y - 0.498535 * Z;

 

G = -0.969256 * X + 1.875991 * Y + 0.041556 * Z;

 

B = 0.055648 * X - 0.204043 * Y + 1.057311 * Z;

 

3、 SMPTE431-2规范的转换公式----论文《数字电影色彩处理》

 

RGB->XYZ

 

X = 0.4451698156 *R + 0.2771344092 * G + 0.1722826698 * B;

 

Y = 0.2094916779 * R + 0.7215952542 * G + 0.0689130679 * B;

 

Z = 0.0000000000 * R + 0.0470605601 * G + 0.9073553944 * B;

 

XYZ->RGB

 

R = 2.7253940305 * X - 1.0180030062 * Y - 0.4401631952 * Z;

 

G = -0.7951680258 * X + 1.6897320548 * Y + 0.0226471906 * Z;

 

B = 0.0412418914 * X - 0.0876390192 * Y + 1.1009293786 * Z;

 

 

 

这三种方式得出的RGB值都是线性归一值,也就是我们常用的LinerRGB)颜色空间。

 

得出的值,还需要进行编码。即将线性的归一值转为RGB值或SRGB

 1ImageMagic
if (R > 0.0031306684425005883)
{
R = 1.055 * Math.Pow(R, 1 / 2.4) - 0.055;
}
else
{
R = 12.92 * R;
}
R’ =65535*R
RXYZRGB得出的RGB的归一值
R’ 为图片在16bit下的编码值。 GB的编码值也可以用上述公式。
2、 论文《数字电影色彩处理》 中介绍的公式
R’ = (int)Math.Round( Math.Pow(R, 1 / 2.6) * 65535.0 );
RXYZRGB得出的RGB的归一值
R’ 为图片在16bit下的编码值。 GB的编码值也可以用上述公式。

3、 论文《DCI 数字电影编解码系统》(其 XYZ RGB 用的公式与 ImageMagic 一致)
LXYZRGB得出的RGB的线性归一值, L’ 为转换的非线性值;


LD’ 为图片在n-bit下的编码值。

 三 转换尝试和验证
重点研究了 ImageMagic、 论文《数字电影色彩处理》、 论文《DCI 数字电影编解码系统》 的
流程和公式
1、 首先将 DCDM-X’Y’Z’Tif 转成 RGB png, ImageMagic 和论文《数字电影色彩处理》
中介绍的公式得出的 RGB-png 会有明显区别,看上去论文《数字电影色彩处理》 得出的
RGB-png 比较明亮,比较适合绘制深度图。
2、 然后将 RGB-png 逆过程转换得出 DCDM-X’Y’Z’TifImageMagic、 论文《数字电影色
彩处理》得出的 DCDM-X’Y’Z’Tif 和原始的 DCDM-X’Y’Z’Tif 进行比较得出差值图片,
人眼看上去都没有差别。
用程序得出每个像素的通道值差值,进行比较
论文《数字电影色彩处理》还原的 DCDM-X’Y’Z’Tif 明显更好,查看得出最大差值为 16bit
下的 114,转为 8bit 0.44,也就是说在 255 满色阶下,一个色阶的差值都不到。
ImageMagic 得出的差值会有很少的较大差值,最大差值为 16bit 10135, 转为 8bit 39
论文《DCI 数字电影编解码系统》 得出的最大差值与 ImageMagic 一致。
相比较而言, ImageMagic 和论文《数字电影色彩处理》 都可以得出看上去正常的 rgb 图片,
也可以很少损失的还原成 DCDM-X’Y’Z’-Tif,但是论文《数字电影色彩处理》 的流程和公
式更好。
综合得出论文《数字电影色彩处理》转换得出的 RGB 图片看上去比较适合绘制,而且返回
DCDM-X’Y’Z’的误差较小。