Я считаю, что выгодно разделять операции, так как легче увидеть, что они делают, и выяснить, как их отменить.Это ваше вычисление:
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
.Это произошло, когда X был близок к 1, а Y был близок к 0 (я проверил это со случайными значениями для XYZ в диапазоне [0,1]).
Обратите внимание, что bsxfun
обычно больше не требуется с MATLAB R2016b и новее.Вы можете просто написать ICTCP = step3 .* [720, 360, 720]
.