tabla hexadecimales colores codigo colors dart rgb astronomy

colors - hexadecimales - rgb to hex



Índice de color Star BV a color RGB aparente (8)

Estoy tratando de convertir el índice de color BV de una estrella a un color RGB aparente. Además de buscar tablas y rampas de color, parece que no hay un algoritmo conocido para hacer esto.

¿Qué es un índice de color BV?

Es un número que los astrónomos asignan a una estrella para indicar su color aparente. Las estrellas calientes (bajo BV) son azules / púrpuras y las estrellas frías (alto BV) son rojas con esas estrellas blancas / naranjas en medio.

Algoritmo inicial

BV a Kelvin

var t = 4600 * ((1 / ((0.92 * bv) + 1.7)) +(1 / ((0.92 * bv) + 0.62)) );

Kelvin a xyY

Si modelas una estrella como un cuerpo negro, entonces puedes usar una aproximación numérica del locus planckiano para calcular las coordenadas xy (cromaticidad 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 a 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 a RGB

var 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;

Pregunta

Corrí este algoritmo con los índices de color BV: 1.2, 1.0, 0.59, 0.0, -0.29. Esto es lo que obtuve como salida.

¿Por qué obtuve esta salida extraña? Las estrellas calientes son azuladas, pero las frías son de color marrón y no parecen haber estrellas intermedias blancas / anaranjadas.

Actualizar

Siguiendo un comentario de Ozan , parecía que estaba usando una matriz incorrecta para convertir XYZ a RGB. Dado que sRGB es el espacio de color predeterminado en la web (¿o sí?), Ahora estoy usando la matriz correcta seguida de una función de corrección gamma ( a = 0.055 ).

Ahora tengo esta bonita rampa de color,

pero todavía no hay rojo / violeta en las extremidades.

Manifestación

También hay un fiddle ahora con el que puedes jugar.

Actualización 2

Si utilizo un gamma de 0.5 y amplía el rango de los índices de color de BV de 4.7 a -0.5, obtengo rojo en un extremo pero aún no violeta. Aquí está el fiddle actualizado.


Usted pidió un algoritmo, obtendrá uno.

Investigué este tema cuando estaba renderizando los datos de la base de datos HYG en Python3.5, con Pyglet y MongoDB. Estoy contento con el aspecto de mis estrellas en mi protector de armas. Los colores se pueden encontrar en la parte inferior de esta respuesta.

1. Índice de color (BV) a temperatura (K)

Esta es la función que utilicé en los datos BV (ci) de la base de datos HYG . En este ejemplo, ci es un valor BV de una lista que estoy ejecutando.

temp = 4600 * (1 / (0.92 * ci + 1.7) + 1 / (0.92 * ci + 0.62))

2. Consigue una mesa grande.

Tomé este y te sugiero que lo hagas también. Seleccione la columna de temperatura y la columna de valores RGB o rgb como referencia

3. Preprocesar los datos.

A partir de los datos de la tabla rgb, generé tres listas ordenadas (n = 391) (mi método: limpieza y selección con software de hoja de cálculo y un editor de texto capaz de tener millones de cursores a la vez, luego importé el archivo resultante separado por comas por mongoDB así que podría trabajar fácilmente con las listas de valores en python a través del envoltorio pymongo, sin demasiado desorden en el archivo de script). El beneficio del método que presentaré es que puede extraer datos de color de otras tablas que podrían usar CMYK o HSV y adaptarse en consecuencia. Incluso se podría hacer una referencia cruzada. Sin embargo, debería terminar con las listas que se ven así en la tabla (s) RGB que sugerí;

reds = [255, 255, ... , 155, 155] greens = [56, 71, ..., 188,188] blues = [0, 0, ..., 255, 255] """ this temps list is also (n=391) and corresponds to the table values.""" temps = [] for i in range(1000,40100,100): temps.append(i)

Después de esto, apliqué un poco de suavizado gaussiano a estas listas (ayuda a obtener mejores polinomios, ya que elimina algunas fluctuaciones), después de lo cual apliqué el método polyfit() (regresión polinomial) del paquete numpy a la temperatura Valores con respecto a los valores R, G y B :

colors = [reds,greens,blues] """ you can tweak the degree value to see if you can get better coeffs. """ def smoothListGaussian2(myarray, degree=3): myarray = np.pad(myarray, (degree-1,degree-1), mode=''edge'') window=degree*2-1 weight=np.arange(-degree+1, degree)/window weight = np.exp(-(16*weight**2)) weight /= sum(weight) smoothed = np.convolve(myarray, weight, mode=''valid'') return smoothed i=0 for color in colors: color = smoothListGaussian2(color) x = np.array(temps) y = np.array(color) names = ["reds","greens","blues"] """ raise/lower the k value (third one) in c """ z = np.polyfit(x, y, 20) f = np.poly1d(z) #plt.plot(x,f(x),str(names[i][0]+"-")) print("%sPoly = " % names[i], z) i += 1 plt.show()

Eso le da (n) los coeficientes (a) para polinomios de forma:

.

Ahora que lo pienso, probablemente podría usar Polyfit para obtener los coeficientes para convertir el CI directamente a RGB ... y omitir el CI al paso de conversión de temperatura , pero al convertir a temperatura primero, la relación entre la temperatura y la elección. El espacio de color es más claro.

4. El algoritmo real: conecta los valores de temperatura en los polinomios RGB

Como dije antes, puedes usar otros datos espectrales y otros espacios de color para ajustar curvas polinómicas, este paso aún sería el mismo (con ligeras modificaciones)

De todos modos, aquí está el código simple completo que usé (también, esto es con k = 20 polinomios):

import numpy as np redco = [ 1.62098281e-82, -5.03110845e-77, 6.66758278e-72, -4.71441850e-67, 1.66429493e-62, -1.50701672e-59, -2.42533006e-53, 8.42586475e-49, 7.94816523e-45, -1.68655179e-39, 7.25404556e-35, -1.85559350e-30, 3.23793430e-26, -4.00670131e-22, 3.53445102e-18, -2.19200432e-14, 9.27939743e-11, -2.56131914e-07, 4.29917840e-04, -3.88866019e-01, 3.97307766e+02] greenco = [ 1.21775217e-82, -3.79265302e-77, 5.04300808e-72, -3.57741292e-67, 1.26763387e-62, -1.28724846e-59, -1.84618419e-53, 6.43113038e-49, 6.05135293e-45, -1.28642374e-39, 5.52273817e-35, -1.40682723e-30, 2.43659251e-26, -2.97762151e-22, 2.57295370e-18, -1.54137817e-14, 6.14141996e-11, -1.50922703e-07, 1.90667190e-04, -1.23973583e-02,-1.33464366e+01] blueco = [ 2.17374683e-82, -6.82574350e-77, 9.17262316e-72, -6.60390151e-67, 2.40324203e-62, -5.77694976e-59, -3.42234361e-53, 1.26662864e-48, 8.75794575e-45, -2.45089758e-39, 1.10698770e-34, -2.95752654e-30, 5.41656027e-26, -7.10396545e-22, 6.74083578e-18, -4.59335728e-14, 2.20051751e-10, -7.14068799e-07, 1.46622559e-03, -1.60740964e+00, 6.85200095e+02] redco = np.poly1d(redco) greenco = np.poly1d(greenco) blueco = np.poly1d(blueco) def temp2rgb(temp): red = 0 green = 0 blue = 0 """ since all lists have to have equal length, this is ok.""" red = redco(temp) green = greenco(temp) blue = blueco(temp) print(red,green,blue) if round(red) > 255: red = 255 elif red < 0: red = 0 if round(green) > 255: green = 255 elif green < 0: green = 0 if round(blue) > 255: blue = 255 elif blue < 0: blue = 0 color = (int(red), int(green), int(blue)) print(color) return color

Ah, y algunas más notas e imágenes ...

La escala de temperatura de cuerpo negro OBAFGKM de mis polinomios:

La gráfica para RGB [0-255] sobre temp [0-40000K],

  • + : datos de la tabla
  • curvas: ajuste polinomial Un zoom en los valores de menor fidelidad:

Aquí está el púrpura

Como puede ver, hay algunas desviaciones, pero a simple vista no se nota y si realmente quiere mejorarlo (no lo hago), tiene otras opciones:

  1. Divida las listas donde el valor verde es más alto y vea si obtiene mejores polinomios para las nuevas partes izquierda y derecha de las listas. Un poco como esto:

  1. Escriba reglas de excepción (tal vez un simple k = 2 o k = 3 poli) para los valores en esta ventana de menor fidelidad.
  2. Intente con otros algoritmos de suavizado antes de polyfit ().
  3. Prueba otras fuentes o espacios de color.

También estoy contento con el rendimiento general de mis polinomios. Cuando estoy cargando los ~ 120000 objetos estrella de mi plantilla con al menos 18 vértices de color cada uno, solo me toma unos segundos, para mi sorpresa. Sin embargo, hay margen de mejora. Para una visión más realista (en lugar de simplemente correr con la radiación de luz del cuerpo negro), podría agregar lentes gravitacionales, efectos atmosféricos, doppler relativista, etc.

Ah, y el PURPLE , como prometió.

Algunos otros enlaces útiles:


¿Por qué no hay violeta o azul profundo? La temperatura de color infinita, antes de ser menos azulada por nuestra atmósfera, tiene 1931 coordenadas CIE de X = .240, y = .234.

El espectro de un cuerpo negro a temperatura de color infinita tiene una distribución de potencia espectral, en potencia por unidad de longitud de onda de ancho de banda, que es inversamente proporcional a la longitud de onda a la cuarta potencia. A 700 nm, esto es 10.7% tan grande como a 400 nm.


Como corrección al código de @paddyg, que no me funcionó (especialmente para el color con bv <0.4): aquí está la misma versión exacta del código C ++ de @Spektre, en Python:

def bv2rgb(bv): if bv < -0.40: bv = -0.40 if bv > 2.00: bv = 2.00 r = 0.0 g = 0.0 b = 0.0 if -0.40 <= bv<0.00: t=(bv+0.40)/(0.00+0.40) r=0.61+(0.11*t)+(0.1*t*t) elif 0.00 <= bv<0.40: t=(bv-0.00)/(0.40-0.00) r=0.83+(0.17*t) elif 0.40 <= bv<2.10: t=(bv-0.40)/(2.10-0.40) r=1.00 if -0.40 <= bv<0.00: t=(bv+0.40)/(0.00+0.40) g=0.70+(0.07*t)+(0.1*t*t) elif 0.00 <= bv<0.40: t=(bv-0.00)/(0.40-0.00) g=0.87+(0.11*t) elif 0.40 <= bv<1.60: t=(bv-0.40)/(1.60-0.40) g=0.98-(0.16*t) elif 1.60 <= bv<2.00: t=(bv-1.60)/(2.00-1.60) g=0.82-(0.5*t*t) if -0.40 <= bv<0.40: t=(bv+0.40)/(0.40+0.40) b=1.00 elif 0.40 <= bv<1.50: t=(bv-0.40)/(1.50-0.40) b=1.00-(0.47*t)+(0.1*t*t) elif 1.50 <= bv<1.94: t=(bv-1.50)/(1.94-1.50) b=0.63-(0.6*t*t) return (r, g, b)


En caso de que alguien más necesite convertir el práctico C ++ de @Spektre a python. He eliminado parte de la duplicación (que el compilador sin duda habría solucionado) y las discontinuidades para g cuando bv>=2.0 y b cuando 1.94<bv<1.9509

def bv2rgb(bv): if bv < -0.4: bv = -0.4 if bv > 2.0: bv = 2.0 if bv >= -0.40 and bv < 0.00: t = (bv + 0.40) / (0.00 + 0.40) r = 0.61 + 0.11 * t + 0.1 * t * t g = 0.70 + 0.07 * t + 0.1 * t * t b = 1.0 elif bv >= 0.00 and bv < 0.40: t = (bv - 0.00) / (0.40 - 0.00) r = 0.83 + (0.17 * t) g = 0.87 + (0.11 * t) b = 1.0 elif bv >= 0.40 and bv < 1.60: t = (bv - 0.40) / (1.60 - 0.40) r = 1.0 g = 0.98 - 0.16 * t else: t = (bv - 1.60) / (2.00 - 1.60) r = 1.0 g = 0.82 - 0.5 * t * t if bv >= 0.40 and bv < 1.50: t = (bv - 0.40) / (1.50 - 0.40) b = 1.00 - 0.47 * t + 0.1 * t * t elif bv >= 1.50 and bv < 1.951: t = (bv - 1.50) / (1.94 - 1.50) b = 0.63 - 0.6 * t * t else: b = 0.0 return (r, g, b)


En respuesta a la pregunta ¿por qué no violeta? : Creo que la respuesta es que las estrellas no son ese color. O más bien, no se representan ese color cuando tomamos fotografías de ellos. Los colores producidos en este hilo para varias temperaturas / valores de BV me parecen bastante precisos. Tome esta foto que tomé de Albireo en Cygnus: https://www.flickr.com/photos/30974264@N02/6939409750/in/photolist-bB54th-bzdhKG Albireo A (izquierda) es una estrella tipo K con un BV de 1.074 y Alberio B (derecha) es una estrella tipo B con un BV de -0.06. Mirando los colores en las tablas de arriba para esos valores de BV, diría que hay una correlación bastante fuerte con la imagen. Además, no olvide que, incluso para las estrellas muy calientes, todavía habrá algo de salida en longitudes de onda más largas, lo que tenderá a desaturar el "azul". La radiación del cuerpo negro es de amplio espectro.


Respuesta de @ Spektre en Swift 3.0:

private func bv2ToRGB(for bv: CGFloat, logging: Bool = false) -> Color { var bv = bv var t: CGFloat = 0 var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 if bv < -0.4 { bv = -0.4} if bv > 2.0 { bv = 2.0} switch bv { case -0.4 ... 0.0: t = (bv+0.40)/(0.00+0.40) r = 0.61+(0.11*t)+(0.1*t*t) case 0.0 ... 0.4: t = (bv-0.00)/(0.40-0.00) r = 0.83+(0.17*t) case 0.4 ... 2.1: t = (bv-0.40)/(2.10-0.40) r = 1.00 default: break } switch bv { case -0.4 ... 0.0: t = (bv+0.40)/(0.00+0.40) g = 0.70 + (0.07*t)+(0.1*t*t) case 0.0 ... 0.4: t = (bv-0.00)/(0.40-0.00) g = 0.87 + (0.11*t) case 0.4 ... 1.6: t = (bv-0.40)/(1.60-0.40) g = 0.98 - (0.16*t) case 1.6 ... 2.0: t = (bv-1.60)/(2.00-1.60) g = 0.82 - (0.5*t*t) default: break } switch bv { case -0.4 ... 0.4: t = (bv+0.40)/(0.40+0.40) b = 1.0 case 0.4 ... 1.5: t = (bv-0.40)/(1.50-0.40) b = 1.00 - (0.47*t)+(0.1*t*t) case 1.5 ... 1.94: t = (bv-1.50)/(1.94-1.50) b = 0.63 - (0.6*t*t) default: break } #if os(OSX) return NSColor(calibratedRed: r, green: g, blue: b, alpha: 1.0) #else return UIColor(red: r, green: g, blue: b, alpha: 1.0) #endif }


También basado en la lista ( http://www.vendian.org/mncharity/dir3/blackbody/UnstableURLs/bbr_color.html ) la siguiente función usa kotlin para obtener un color para una temperatura basada en la escala de 2deg:

fun getColorForTemp(temp: Int) = when (temp) { in 0..1000 -> -52480 in 1000..1100 -> -52480 in 1100..1200 -> -47872 in 1200..1300 -> -44544 in 1300..1400 -> -41728 in 1400..1500 -> -39424 in 1500..1600 -> -37120 in 1600..1700 -> -35328 in 1700..1800 -> -33792 in 1800..1900 -> -32256 in 1900..2000 -> -30976 in 2000..2100 -> -29429 in 2100..2200 -> -28131 in 2200..2300 -> -26583 in 2300..2400 -> -25293 in 2400..2500 -> -24004 in 2500..2600 -> -22971 in 2600..2700 -> -21939 in 2700..2800 -> -20908 in 2800..2900 -> -19877 in 2900..3000 -> -18846 in 3000..3100 -> -18071 in 3100..3200 -> -17041 in 3200..3300 -> -16266 in 3300..3400 -> -15492 in 3400..3500 -> -14718 in 3500..3600 -> -13945 in 3600..3700 -> -13427 in 3700..3800 -> -12654 in 3800..3900 -> -12137 in 3900..4000 -> -11364 in 4000..4100 -> -10847 in 4100..4200 -> -10330 in 4200..4300 -> -9813 in 4300..4400 -> -9297 in 4400..4500 -> -8780 in 4500..4600 -> -8264 in 4600..4700 -> -7748 in 4700..4800 -> -7488 in 4800..4900 -> -6972 in 4900..5000 -> -6712 in 5000..5100 -> -6196 in 5100..5200 -> -5936 in 5200..5300 -> -5421 in 5300..5400 -> -5161 in 5400..5500 -> -4646 in 5500..5600 -> -4386 in 5600..5700 -> -4127 in 5700..5800 -> -3868 in 5800..5900 -> -3609 in 5900..6000 -> -3094 in 6000..6100 -> -2835 in 6100..6200 -> -2576 in 6200..6300 -> -2317 in 6300..6400 -> -2059 in 6400..6500 -> -1800 in 6500..6600 -> -1541 in 6600..6700 -> -1539 in 6700..6800 -> -66817 in 6800..6900 -> -198401 in 6900..7000 -> -329729 in 7000..7100 -> -526849 in 7100..7200 -> -658177 in 7200..7300 -> -789505 in 7300..7400 -> -921089 in 7400..7500 -> -1052417 in 7500..7600 -> -1118209 in 7600..7700 -> -1249537 in 7700..7800 -> -1380865 in 7800..7900 -> -1446657 in 7900..8000 -> -1578241 in 8000..8100 -> -1709569 in 8100..8200 -> -1775105 in 8200..8300 -> -1840897 in 8300..8400 -> -1972225 in 8400..8500 -> -2038017 in 8500..8600 -> -2103809 in 8600..8700 -> -2235137 in 8700..8800 -> -2300929 in 8800..8900 -> -2366721 in 8900..9000 -> -2432257 in 9000..9100 -> -2498049 in 9100..9200 -> -2563841 in 9200..9300 -> -2629633 in 9300..9400 -> -2695169 in 9400..9500 -> -2760961 in 9500..9600 -> -2826753 in 9600..9700 -> -2892289 in 9700..9800 -> -2958081 in 9800..9900 -> -3023617 in 9900..10000 -> -3089409 in 10000..10200 -> -3155201 in 10200..10300 -> -3220993 in 10300..10400 -> -3286529 in 10400..10600 -> -3352321 in 10600..10700 -> -3418113 in 10700..10800 -> -3483649 in 10800..10900 -> -3483905 in 10900..11000 -> -3549441 in 11000..11200 -> -3615233 in 11200..11300 -> -3681025 in 11300..11500 -> -3746561 in 11500..11700 -> -3812353 in 11700..11900 -> -3878145 in 11900..12000 -> -3943681 in 12000..12100 -> -3943937 in 12100..12200 -> -4009473 in 12200..12300 -> -4009729 in 12300..12500 -> -4075265 in 12500..12700 -> -4141057 in 12700..12800 -> -4206593 in 12800..12900 -> -4206849 in 12900..13200 -> -4272385 in 13200..13400 -> -4338177 in 13400..13500 -> -4403713 in 13500..13700 -> -4403969 in 13700..13900 -> -4469505 in 13900..14000 -> -4469761 in 14000..14300 -> -4535297 in 14300..14600 -> -4601089 in 14600..14700 -> -4666625 in 14700..15000 -> -4666881 in 15000..15200 -> -4732417 in 15200..15300 -> -4732673 in 15300..15700 -> -4798209 in 15700..16100 -> -4864001 in 16100..16200 -> -4929537 in 16200..16500 -> -4929793 in 16500..16800 -> -4995329 in 16800..17000 -> -4995585 in 17000..17400 -> -5061121 in 17400..17500 -> -5061377 in 17500..18000 -> -5126913 in 18000..18100 -> -5192449 in 18100..18600 -> -5192705 in 18600..18800 -> -5258241 in 18800..19200 -> -5258497 in 19200..19700 -> -5324033 in 19700..19900 -> -5324289 in 19900..20600 -> -5389825 in 20600..20700 -> -5390081 in 20700..21500 -> -5455617 in 21500..21700 -> -5521153 in 21700..22400 -> -5521409 in 22400..22800 -> -5586945 in 22800..23400 -> -5587201 in 23400..24200 -> -5652737 in 24200..24500 -> -5652993 in 24500..25700 -> -5718529 in 25700..27100 -> -5784321 in 27100..27400 -> -5849857 in 27400..28700 -> -5850113 in 28700..29500 -> -5915649 in 29500..30600 -> -5915905 in 30600..32000 -> -5981441 in 32000..32700 -> -5981697 in 32700..35000 -> -6047233 in 35000..35200 -> -6047489 in 35200..38300 -> -6113025 in 38300..38600 -> -6178561 in 38600..40000 -> -6178817 else -> -6178817 }


Yo uso la interpolación de tablas en su lugar. Hace algunos años encontré esta mesa en algún lugar:

type r g b rrggbb B-V O5(V) 155 176 255 #9bb0ff -0.32 blue O6(V) 162 184 255 #a2b8ff O7(V) 157 177 255 #9db1ff O8(V) 157 177 255 #9db1ff O9(V) 154 178 255 #9ab2ff O9.5(V) 164 186 255 #a4baff B0(V) 156 178 255 #9cb2ff B0.5(V) 167 188 255 #a7bcff B1(V) 160 182 255 #a0b6ff B2(V) 160 180 255 #a0b4ff B3(V) 165 185 255 #a5b9ff B4(V) 164 184 255 #a4b8ff B5(V) 170 191 255 #aabfff B6(V) 172 189 255 #acbdff B7(V) 173 191 255 #adbfff B8(V) 177 195 255 #b1c3ff B9(V) 181 198 255 #b5c6ff A0(V) 185 201 255 #b9c9ff 0.00 White A1(V) 181 199 255 #b5c7ff A2(V) 187 203 255 #bbcbff A3(V) 191 207 255 #bfcfff A5(V) 202 215 255 #cad7ff A6(V) 199 212 255 #c7d4ff A7(V) 200 213 255 #c8d5ff A8(V) 213 222 255 #d5deff A9(V) 219 224 255 #dbe0ff F0(V) 224 229 255 #e0e5ff 0.31 yellowish F2(V) 236 239 255 #ecefff F4(V) 224 226 255 #e0e2ff F5(V) 248 247 255 #f8f7ff F6(V) 244 241 255 #f4f1ff F7(V) 246 243 255 #f6f3ff 0.50 F8(V) 255 247 252 #fff7fc F9(V) 255 247 252 #fff7fc G0(V) 255 248 252 #fff8fc 0.59 Yellow G1(V) 255 247 248 #fff7f8 G2(V) 255 245 242 #fff5f2 G4(V) 255 241 229 #fff1e5 G5(V) 255 244 234 #fff4ea G6(V) 255 244 235 #fff4eb G7(V) 255 244 235 #fff4eb G8(V) 255 237 222 #ffedde G9(V) 255 239 221 #ffefdd K0(V) 255 238 221 #ffeedd 0.82 Orange K1(V) 255 224 188 #ffe0bc K2(V) 255 227 196 #ffe3c4 K3(V) 255 222 195 #ffdec3 K4(V) 255 216 181 #ffd8b5 K5(V) 255 210 161 #ffd2a1 K7(V) 255 199 142 #ffc78e K8(V) 255 209 174 #ffd1ae M0(V) 255 195 139 #ffc38b 1.41 red M1(V) 255 204 142 #ffcc8e M2(V) 255 196 131 #ffc483 M3(V) 255 206 129 #ffce81 M4(V) 255 201 127 #ffc97f M5(V) 255 204 111 #ffcc6f M6(V) 255 195 112 #ffc370 M8(V) 255 198 109 #ffc66d 2.00

  1. simplemente interpolar los índices BV faltantes (linealmente o mejor) antes de usar
  2. luego use la interpolación lineal para obtener RGB = f (BV);
  3. encuentra las dos líneas más cercanas en la tabla e interpola entre ellas ...

[edit1] heh, casualmente, he encontrado this (información original que mencioné antes)

[edit2] aquí está mi aproximación sin ningún elemento XYZ

Así que el índice BV es de < -0.4 , 2.0 >

Aquí está el código mío (C ++) para la conversión:

//--------------------------------------------------------------------------- void bv2rgb(double &r,double &g,double &b,double bv) // RGB <0,1> <- BV <-0.4,+2.0> [-] { double t; r=0.0; g=0.0; b=0.0; if (bv<-0.4) bv=-0.4; if (bv> 2.0) bv= 2.0; if ((bv>=-0.40)&&(bv<0.00)) { t=(bv+0.40)/(0.00+0.40); r=0.61+(0.11*t)+(0.1*t*t); } else if ((bv>= 0.00)&&(bv<0.40)) { t=(bv-0.00)/(0.40-0.00); r=0.83+(0.17*t) ; } else if ((bv>= 0.40)&&(bv<2.10)) { t=(bv-0.40)/(2.10-0.40); r=1.00 ; } if ((bv>=-0.40)&&(bv<0.00)) { t=(bv+0.40)/(0.00+0.40); g=0.70+(0.07*t)+(0.1*t*t); } else if ((bv>= 0.00)&&(bv<0.40)) { t=(bv-0.00)/(0.40-0.00); g=0.87+(0.11*t) ; } else if ((bv>= 0.40)&&(bv<1.60)) { t=(bv-0.40)/(1.60-0.40); g=0.98-(0.16*t) ; } else if ((bv>= 1.60)&&(bv<2.00)) { t=(bv-1.60)/(2.00-1.60); g=0.82 -(0.5*t*t); } if ((bv>=-0.40)&&(bv<0.40)) { t=(bv+0.40)/(0.40+0.40); b=1.00 ; } else if ((bv>= 0.40)&&(bv<1.50)) { t=(bv-0.40)/(1.50-0.40); b=1.00-(0.47*t)+(0.1*t*t); } else if ((bv>= 1.50)&&(bv<1.94)) { t=(bv-1.50)/(1.94-1.50); b=0.63 -(0.6*t*t); } } //---------------------------------------------------------------------------

[Notas]

Este color BV es cuerpo negro de iluminación de temperatura definida, por lo que representa el color de la estrella visto desde el espacio en relación con la estrella. Para obtener colores visualmente correctos, debe agregar los efectos de dispersión atmosférica de nuestra atmósfera y el efecto Doppler para cortar rápidamente las estrellas. por ejemplo, nuestro Sol es ''Blanco'', pero después de la dispersión de la luz, el color varía de rojo (cerca del horizonte) a amarillo (cerca del nadir ... mediodía)

En caso de que desee corregir visualmente el color, estos controles de calidad pueden ayudar:

  • Dispersión atmosférica
  • Valores RGB del espectro visible
  • representación multi espectral