Формулы, используемые в этом коде, похожи на преобразование Жюльена из RGB в YUV и обратно:
Transformation from RGB to YUV:
Y = 0.299R + 0.587G + 0.114B
U'= (B-Y)*0.565
V'= (R-Y)*0.713
Transformation from YUV to RGB:
R = Y + 1.403V'
G = Y - 0.344U' - 0.714V'
B = Y + 1.770U'
Однако формулы в вашем коде немного отличаются. Хотя обратное преобразование является одинаковым, прямое преобразование имеет дополнительный множитель 0,5 для U и V компонентов. Существует также тривиальная манипуляция с компонентом яркости
y = 255.0 - y
, который просто инвертирует яркость. Итак, что здесь происходит?
Если вы используете обычное преобразование Julien RGB-> YUV, вы получите представление для вашего цвета в виде комбинации яркости Y и двух компонентов цветового тона U и V, которые определяют цвет как показано на этом рисунке:
Однако в вашем коде вы также умножаете компоненты U и V на 0,5. Это означает, что на этой плоскости УФ вы перемещаетесь от любого данного цвета в два раза ближе к точке происхождения (0, 0). Например, если исходный цвет был A с координатами UV (-0,4, 0,3), то вы получите новый цвет B с координатами UV (-0,2, 0,15). Аналогично, цвет C (0,2, -0,3) становится цветом D (0,1, -0,15):
После этого вы меняете яркость цвета, делая темные цвета яркими, а яркие цвета темными. Это эффект вашего кода.