Цветовой индекс Star B-V до видимого цвета RGB
Я пытаюсь преобразовать звездуB-V цветовой индекс в видимый цвет RGB. Помимо просмотра таблиц и цветовых шкал, кажется, что для этого не существует хорошо известного алгоритма.
Что такое цветовой индекс B-V?Это число, которое астрономы присваивают звезде, чтобы указать ее видимый цвет. Горячие звезды (низкий B-V) - синие / фиолетовые, а холодные звезды (высокий B-V) - красные с этими белыми / оранжевыми звездами между ними.
Исходный алгоритмB-V в Кельвинvar t = 4600 * ((1 / ((0.92 * bv) + 1.7)) +(1 / ((0.92 * bv) + 0.62)) );
Кельвин в xyYЕсли вы моделируете звезду как черное тело, то вы можете использовать числовое приближениеПланковский локус вычислить координаты xy (цветность CIE)
// t to xyY
var x, y = 0;
if (t>=1667 && t<=4000) {
x = ((-0.2661239 * Math.pow(10,9)) / Math.pow(t,3)) + ((-0.2343580 * Math.pow(10,6)) / Math.pow(t,2)) + ((0.8776956 * Math.pow(10,3)) / t) + 0.179910;
} else if (t > 4000 && t <= 25000) {
x = ((-3.0258469 * Math.pow(10,9)) / Math.pow(t,3)) + ((2.1070379 * Math.pow(10,6)) / Math.pow(t,2)) + ((0.2226347 * Math.pow(10,3)) / t) + 0.240390;
}
if (t >= 1667 && t <= 2222) {
y = -1.1063814 * Math.pow(x,3) - 1.34811020 * Math.pow(x,2) + 2.18555832 * x - 0.20219683;
} else if (t > 2222 && t <= 4000) {
y = -0.9549476 * Math.pow(x,3) - 1.37418593 * Math.pow(x,2) + 2.09137015 * x - 0.16748867;
} else if (t > 4000 && t <= 25000) {
y = 3.0817580 * Math.pow(x,3) - 5.87338670 * Math.pow(x,2) + 3.75112997 * x - 0.37001483;
}
от xyY до XYZ (Y = 1)// xyY to XYZ, Y = 1
var Y = (y == 0)? 0 : 1;
var X = (y == 0)? 0 : (x * Y) / y;
var Z = (y == 0)? 0 : ((1 - x - y) * Y) / y;
XYZ в RGBvar r = 0.41847 * X - 0.15866 * Y - 0.082835 * Z;
var g = -0.091169 * X + 0.25243 * Y + 0.015708 * Z;
var b = 0.00092090 * X - 0.0025498 * Y + 0.17860 * Z;
ВопросЯ запустил этот алгоритм с цветовыми индексами B-V: 1,2, 1,0, 0,59, 0,0, -0,29. Это то, что я получил в качестве вывода.
Почему я получил этот странный вывод? Горячие звезды голубоватые, а холодные коричневатые, и промежуточных звезд белого / оранжевого цвета не существует.
ОбновитьПосле комментарияОзанказалось, что я использовал неправильную матрицу для преобразования XYZ в RGB. Так как sRGB является цветовым пространством по умолчанию в сети (или это так?), Я сейчас использую правильную матрицу, за которой следует функция гамма-коррекции (a = 0.055
).
Теперь я получаю эту красивую цветную рампу,
но все еще нет красного / фиолетового на конечностях.
демонстрацияТам также естьиграть на скрипке Теперь, когда вы можете играть с.
Обновление 2Если использовать гамму 0,5 и расширить диапазон цветовых индексов B-V до уровня от 4,7 до -0,5, я получу красный в одном крайнем случае, но все равно не буду фиолетовым. Вот обновленныйиграть на скрипке.