Как я могу инвертировать это преобразование цветового пространства? - PullRequest
1 голос
/ 06 марта 2019

У меня есть эта функция, которую я пытаюсь инвертировать:

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 на 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; 

Вот ссылка для этого кода , которая более подробно описана (код Matlab найден в конце документа).

Я не уверен, какой флаг для bsxfun мне следует использовать и как организовать инверсию матриц.

1 Ответ

0 голосов
/ 06 марта 2019

Я считаю, что выгодно разделять операции, так как легче увидеть, что они делают, и выяснить, как их отменить.Это ваше вычисление:

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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...