【问题标题】:How can I invert this color space transformation?如何反转这种色彩空间转换?
【发布时间】:2019-07-27 14:38:37
【问题描述】:

我想反转这个函数:

XYZ2LMSmat = [0.3593 -0.1921 0.0071; 0.6976 1.1005 0.0748; -0.0359 0.0754 0.8433];
LMS2ICTCPmat = [2048 2048 0; 6610 -13613 7003; 17933 -17390 -543]'/4096;

invEOTF = @(Lin) (((3424/4096)+(2413/128)*(max(0,Lin)/10000).^(2610/16384)) ./ ...
(1+(2392/128)*(max(0,Lin)/10000).^(2610/16384))).^(2523/32);

ICTCP = bsxfun(@times, invEOTF(XYZ * XYZ2LMSmat) * LMS2ICTCPmat, [720, 360, 720]);

此脚本从 XYZ 转换为 ICtCp 颜色空间。输入 (XYZ) 采用 N x 3 (rgb) 矩阵的格式,该矩阵乘以 3x3 变换矩阵 XYZ2LMSmatLMS2ICTCPmat

我想写相反的:从 ICtCp 到 XYZ。

我有invEOTF函数的反函数,即:

EOTF = @(PQ) (max(PQ.^(32/2523)-(3424/4096),0) ./ ... ((2413/128)-(2392/128)*PQ.^(32/2523))).^(16384/2610)*10000; 

Here is the reference for this code,更详细(文档末尾的 Matlab 代码)。

我不确定应该使用 bsxfun 的哪个标志以及如何安排矩阵求逆。

【问题讨论】:

    标签: matlab colors


    【解决方案1】:

    我发现拆分操作是有益的,它可以更轻松地查看它们的操作并找出如何扭转它们。这是你的计算:

    step1 = XYZ * XYZ2LMSmat;
    step2 = invEOTF(step1);
    step3 = step2 * LMS2ICTCPmat;
    ICTCP = bsxfun(@times, step3, [720, 360, 720]);
    

    我们现在可以颠倒这些步骤:

    step3_back = bsxfun(@times, ICTCP, 1./[720, 360, 720]);
    step2_back = step3_back / LMS2ICTCPmat;
    step1_back = EOTF(step2_back);
    XYZ_back = step1_back / XYZ2LMSmat;
    

    如果XYZ_back不等于XYZ,我们可以比较step3step3_backstep2step2_back,以及step1step1_back,找出哪里出错了.

    我注意到,step2_back 为零,step1_back 不匹配 step1。这发生在step1 为负数的地方。 step1_back 保持为零。这是由于在EOTF 中通过max 显式剪辑。这发生在 X 接近 1 且 Y 接近 0 时(我用 [0,1] 范围内 XYZ 的随机值对此进行了测试)。


    请注意 bsxfun 通常不再需要 MATLAB R2016b 和更新版本。你可以直接写ICTCP = step3 .* [720, 360, 720]

    【讨论】:

    • Amazing Cris,感谢您帮助我,这让我很开心!