В зависимости от распределения яркости, я думаю, что ваша проблема здесь:
if (luminance < 0.5)
{
result = (int) ((yellowTemp * luminance * 2.0) + blueTemp * (0.5 - luminance) * 2.0);
}
else
{
result = (int) (redTemp * (luminance - 0.5) * 2.0 + yellowTemp * (1.0 - luminance) * 2.0);
}
Если яркость меньше 0,5, а яркость очень мала, вы получите синий цвет.
Например, если яркость равна 0,0000001, тогда желтый будет (0,0000001 * 2,0) = 0,0000002, а синий будет ((0,5 - 0,0000001) * 2,0) = 0,99999998, что на 6 порядков больше синего, чем желтого.
Если яркость равна 0,6, то красный будет ((0,6 - 0,5) * 2,0) = 0,2, а желтый будет ((1,0 - 0,6) * 2,0) = 0,8, что должно дать вам немного ОДНАКО, если ваше распределение яркости равно всегда в хвостах, тогда, если яркость 0,9, тогда красный будет 0,8, а желтый будет 0,2. (а если яркость = 0,9999, то красный будет 0,9998, а желтый 0,0002).
Если вы проверяете распределение яркости, и оно всегда в хвостах, то есть всегда очень маленькое или очень большое, тогда вы не получите никакого желтого цвета.
С другой стороны, если ваше распределение яркости является гауссовым или логарифмически нормальным, то я бы посоветовал вам иметь ошибку в ваших вычислениях yellowTemp или redTemp.