第三章 星表与星图:从数据到图像
做星光敏感器,说白了就是让卫星「看星星认路」。但卫星怎么知道天上哪颗星是哪颗?这就得靠星表和星图了。我刚开始接触这个领域时,觉得星表不就是一堆坐标数据嘛,后来踩了不少坑才明白——星表选不对,整个导航算法都得翻车。
3.1 星表的概念
星表,你可以理解成一本「星星户口本」。它记录了恒星的各项属性,比如位置、亮度、运动速度等等。对于星光敏感器来说,我们最关心的是两样东西:恒星的位置和恒星的星等。
位置决定了星点在图像上的坐标,星等则决定了它亮不亮。嗯,这里要注意——星表里的位置不是一成不变的。因为恒星本身在运动,地球也在动,所以星表都有个「历元」的概念,比如 J2000.0 就是指公元2000年1月1日那天的数据。
3.2 常用星表:HIPPARCOS 与 Tycho-2
市面上星表很多,但做航天导航,我个人最常用的是这两个:
3.2.1 HIPPARCOS 星表
HIPPARCOS 是欧洲航天局的一个卫星项目,专门测量恒星位置。它的精度有多高?我记得数据是 1 毫角秒左右。什么概念?相当于你在北京看上海的一颗芝麻,还能分清它的左右。
不过 HIPPARCOS 有个问题——它只收录了约 12 万颗恒星。对于大多数星光敏感器来说,12 万颗其实够用了。但如果你做的是高精度、大视场的敏感器,可能还需要更密的星表。
| 属性 | HIPPARCOS | Tycho-2 |
|---|---|---|
| 恒星数量 | 约 118,000 | 约 250 万 |
| 位置精度 | ~1 mas | ~7 mas |
| 星等范围 | 亮于 12.4 等 | 亮于 11.5 等 |
| 适用场景 | 高精度导航 | 大视场、快速匹配 |
3.2.2 Tycho-2 星表
Tycho-2 是 HIPPARCOS 的「小弟」,但它收录的恒星数量是大哥的 20 倍。为什么?因为 Tycho-2 用了更简单的测量方法,精度虽然差一些,但胜在星多。
我在项目中遇到过一个问题:用 HIPPARCOS 做星图匹配时,视场边缘经常找不到足够多的星。后来换成 Tycho-2,问题就解决了。你想想看,视场里多出几颗暗星,匹配成功率能提高不少。
3.3 星图生成原理
星图生成,就是把星表里的数据「画」到图像上。这个过程看起来简单,但有几个坑要注意。
首先,你得把天球坐标(赤经、赤纬)转换成图像坐标(像素行、列)。这涉及到坐标旋转、投影变换。我习惯用 球面投影模型,说白了就是把天球上的点投影到相机的像平面上。
其次,星点的亮度怎么模拟?不能直接拿星等来画,因为星等是对数尺度。实际图像上,星点是一个高斯分布的光斑,中心亮、边缘暗。我曾经直接用星等值画圆点,结果仿真出来的星图跟真实图像完全对不上。
# 星点生成示例(Python)
import numpy as np
def generate_star(image, x, y, magnitude, psf_sigma=1.5):
"""
在图像上生成一个星点
:param image: 背景图像
:param x, y: 星点中心坐标(亚像素精度)
:param magnitude: 星等
:param psf_sigma: 点扩散函数宽度
"""
# 星等转强度(线性尺度)
intensity = 10 ** (-0.4 * magnitude)
# 生成高斯光斑
size = int(3 * psf_sigma)
xx, yy = np.meshgrid(range(-size, size+1), range(-size, size+1))
gaussian = np.exp(-((xx)**2 + (yy)**2) / (2 * psf_sigma**2))
gaussian = gaussian / gaussian.sum() * intensity
# 叠加到图像上
x0, y0 = int(x), int(y)
image[y0-size:y0+size+1, x0-size:x0+size+1] += gaussian
3.4 星等与星点提取
星等,是衡量恒星亮度的指标。数值越小越亮,比如天狼星是 -1.46 等,北极星是 2.0 等。星光敏感器一般能探测到 6~8 等的恒星。
星点提取,就是从图像里把星点找出来。常用的方法是 质心法:
- 先对图像做阈值分割,找出亮斑区域
- 对每个亮斑,计算其质心坐标
- 根据质心处的灰度值,估算星等
质心法的公式很简单:
x_c = sum(x * I(x,y)) / sum(I(x,y))
y_c = sum(y * I(x,y)) / sum(I(x,y))
但实际用起来,坑不少。比如背景不均匀怎么办?星点太密重叠了怎么办?我踩过最深的一个坑是——星点饱和了。饱和后的星点,质心会偏向一边,导致定位误差。后来我加了一个「饱和检测」步骤,一旦发现星点中心灰度超过阈值,就用边缘像素重新计算质心。
3.5 知识体系总览
下面这张图,是我自己总结的星表与星图的核心逻辑。你可以把它当作本章的「地图」:
这张图把本章的核心流程串起来了:从星表数据出发,经过坐标变换和光斑模拟生成星图,最后通过质心法提取出星点坐标和星等。每一步都有坑,但每一步也都有对应的工程技巧。
好了,星表与星图这部分就聊到这儿。下一章我们会深入星图匹配算法,到时候再细聊怎么把提取出来的星点跟星表里的星星对上号。