Думаю, правильно так:
По идее, это как раз простое смешивание цветов.real_Red = (Red*R11 + Green*R12 + Blue*R13) / (R11+R12+R13)
real_Green = (Red*R21 + Green*R22 + Blue*R23) / (R21+R22+R23)
real_Blue = (Red*R31 + Green*R32 + Blue*R33) / (R31+R32+R33)
Коэффициенты матрицы нормированы.
Переполнения не будет ни при каких входных RGB.
Потери точности тоже не будет.
С математической точки зрения - все отлично.
Что и показано на частном случае здесь:
Но если pulsar имел в виду
real_Red' = (Red*R11 + Green*R12 + Blue*R13) / (#FF+#FF+#FF)
то это неправильно. Переполнения конечно не будет, но мы получим "ослабление" цвета.
Например, real_Red' = (#FF*#FF + 0 + 0) / #2FD = #55.
А чтобы формула стала совсем идеальной, можно перед делением к числителю добавить половину знаменателя, то есть округлить результат по правилам математики.
Итого:Что касается оригинальной формулы:Sr = (R11+R12+R13);
real_Red = (Red*R11 + Green*R12 + Blue*R13 + Sr/2) / Sr;
Sg = (R21+R22+R23);
real_Green = (Red*R21 + Green*R22 + Blue*R23 + Sg/2) / Sg;
Sb = (R31+R32+R33);
real_Blue = (Red*R31 + Green*R32 + Blue*R33 + Sb/2) / Sb;
Возможно, он все-таки нормировал коэффициенты матрицы перед использованием, просто в комментах этого не указал.
Например, так:
R11 = R11*#100/(R11+R12+R13)
На это сможет ответить тот, кто разбирался в исходниках.





Ответить с цитированием
