在图像上方模拟天文物体(星体)

时间:2019-06-12 03:34:01

标签: c++ image-processing

我正在研究图像顶部的恒星。 图像是使用正态分布(均值,标准差)生成的灰度矩阵。现在,考虑到像素坐标和星形SNR,我必须将其作为点源放置在图像顶部。有什么建议我应该如何实现,以使其成为有用的模拟? 您可以建议代码示例吗?我正在用C ++开发,但是Matlab / pseudocode也会很好。 预先感谢

1 个答案:

答案 0 :(得分:2)

可以将恒星视为点源。望远镜/相机的光学系统(如果是理想的光学系统)会将Airy disk投射到成像平面(胶片,CCD,您所拥有的东西)上。因此,您应该生成一个艾里斑,并将其添加到现有的像素值中(附近的多颗恒星将具有重叠的斑,应将它们叠加在一起)。

我将简单地生成此函数并在像素坐标处对其进行采样。请注意,在离中心相对较短的距离处,Airy磁盘将真正接近零,因此您可以在该中心周围定义一个小的区域(例如7x7像素),以评估该功能。这样可以节省大量计算。

要进一步简化实现和计算成本,您可以使用高斯近似Airy磁盘。请注意,成像光学器件(包括大气)中的任何缺陷都会导致投影的点不像艾里斑,而是像高斯,因此这并不是一个很差的近似值。

使用DIPlib(我是作者),您可以通过调用dip::DrawBandlimitedPoint在图像中添加高斯点:

constexpr std::size_t N = 10;
double coordinates[N][2] = {...};
double magnitudes[N] = {...};
dip::Image image({1024,1024});
for (std::size_t ii=0; ii<N; ++ii) {
   dip::DrawBandlimitedPoint(image, {coordinates[ii][0], coordinates[ii][1]}, {magnitudes[ii]}, {1.0});
}

该函数调用中的{1.0}是高斯点的sigma。调整此值以匹配您要模拟的光学元件。该代码生成一个单精度浮点图像。您可以在适当缩放后将其转换为整数类型,例如:

image *= 10;
image.Convert(dip::DT_UINT16);

绘制Airy磁盘会更加复杂。