我正在尝试反转此功能:
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变换矩阵XYZ2LMSmat
和LMS2ICTCPmat
。
我正在尝试写相反的东西:从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
的哪个标志以及如何安排矩阵求逆。
答案 0 :(得分:0)
我发现拆分操作是有好处的,它使查看它们的操作并弄清楚如何扭转它们变得更加容易。这是您的计算:
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;
如果step3
为step3_back
,则可以将step2
与step2_back
,step1
与step1_back
以及XYZ_back
与XYZ
进行比较不等于step2_back
,以找出问题出在哪里。
我注意到step1_back
为零时,step1
与step1
不匹配。在step1_back
为负的情况下会发生这种情况。 max
保持为零。这是由于EOTF
中的bsxfun
被显式剪切所致。当X接近1且Y接近0时,就会发生这种情况(我使用XYZ的随机值在[0,1]范围内对此进行了测试)。
请注意,对于MATLAB R2016b及更高版本,通常不再需要ICTCP = step3 .* [720, 360, 720]
。您只需编写.tl-postShare{text-align:right;}
.tl-postShare ul{display:inline-block;}
.tl-postShare ul li{margin:0;}
.tl-tagnShare{position:relative;overflow:hidden;line-height:45px;margin-top:25px;}
.tl-postShare .tl-social-icons.icon-circle .fa{margin-right:7px}
.tl-postShare h6{display:inline-block;font-size:15px;margin:0 10px 0 0;line-height:35px;}
。