星B-V颜色指数为表观RGB颜色

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (139)

什么是B-V颜色指数?

这是天文学家给一颗恒星指定的一个数字,用来表示它的明显颜色。热星(低B-V)是蓝色/紫色,而冷恒星(高B-V)是红色的,中间是白色/橙色的恒星。

初始算法

B-V呼叫开尔文

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

问题

我使用B-V颜色索引运行这个算法:1.2、1.0、0.59、0.0、-0.29。这就是我得到的输出。

为什么我得到了这个奇怪的输出?热星是蓝色的,而冷星是褐色的,并且似乎没有白色/橙色中间恒星。

更新

使用了错误的矩阵将XYZ转换为RGB。由于sRGB是Web上的默认颜色空间(或者是吗?),所以我现在使用的是正确的矩阵,后面是伽马校正函数(a = 0.055)

我现在得到了这个漂亮的彩色坡道,

但在末端仍然没有红色/紫色。

更新2

如果使用伽马值为0.5,并将B-V颜色指数的范围从4.7延长到-0.5,我会在一个极端得到红色,但仍然没有紫罗兰色。

提问于
用户回答回答于

以防其他人需要将@Spektre的方便的C++转换为python。我已经删除了一些复制(编译器无疑已经修复了)和不连续的情况。bv>=2.0和b当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)
用户回答回答于

我用表格插值代替。几年前我在某个地方找到了这张桌子:

     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. 只需在使用前插入丢失的B-V索引(线性或更好)即可。
  2. 然后用线性插值得到RGB=f(B-V);
  3. 找出表中最近的两条线,然后在它们之间插入.

社论2这是我的近似值,没有任何XYZ的东西

所以BV指数来自< -0.4 , 2.0 >

下面是我的(C++)转换代码:

//---------------------------------------------------------------------------
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); }
    }
//---------------------------------------------------------------------------

注记

这种BV颜色是定义温度照明的黑体,因此这代表了从空间相对于恒星的恒星颜色。例如,我们的太阳是白色的,但是在光线散射后,颜色从红色(近景)到黄色(接近最低点...中午)。

如果您想要在视觉上更正颜色QaS可能会有帮助:

1.大气散射

2.可见光谱RGB值

3.多光谱绘制

扫码关注云+社区