如何实现星图质心亚像素级位移,以测试2D高斯拟合质心算法?
实现亚像素级质心位移测试的方法
嘿,我来帮你搞定亚像素级质心位移的测试问题!其实核心思路很简单:直接生成以亚像素坐标为中心的模拟星图,而不是先做像素级位移再调整。这样你就能精准控制真实质心的亚像素位置,再和centroid_2dg的计算结果对比了。
下面是具体的实现步骤和代码示例:
1. 生成亚像素中心的模拟星图
我们可以用2D高斯函数直接生成以亚像素坐标为中心的星图,每个像素的亮度值由这个亚像素中心的高斯分布计算而来。如果需要更贴近真实天文观测,还可以添加噪声。
代码示例
import numpy as np from photutils.centroids import centroid_2dg import matplotlib.pyplot as plt # 自定义亚像素级的真实质心(比如x=10.4,y=8.7) true_centroid = (10.4, 8.7) sigma = 2.0 # 高斯半宽,模拟星点的扩散程度 amplitude = 100 # 星点峰值亮度 # 创建像素网格(这里用20x20的图像,你可以根据需求调整大小) x_pixels = np.arange(20) y_pixels = np.arange(20) X, Y = np.meshgrid(x_pixels, y_pixels) # 生成2D高斯星图 gaussian_img = amplitude * np.exp( -((X - true_centroid[0])**2 / (2 * sigma**2) + (Y - true_centroid[1])**2 / (2 * sigma**2)) ) # 添加高斯噪声,模拟真实观测的噪声 noisy_img = gaussian_img + np.random.normal(0, 2, gaussian_img.shape)
2. 用centroid_2dg计算质心并对比
接下来就可以用你熟悉的centroid_2dg计算模拟图的质心,和预设的真实亚像素质心做对比:
# 计算质心 measured_centroid = centroid_2dg(noisy_img) # 输出对比结果 print(f"真实亚像素质心: ({true_centroid[0]:.3f}, {true_centroid[1]:.3f})") print(f"算法计算质心: ({measured_centroid[0]:.3f}, {measured_centroid[1]:.3f})") print(f"误差: ({abs(true_centroid[0]-measured_centroid[0]):.3f}, {abs(true_centroid[1]-measured_centroid[1]):.3f})") # 可视化对比 plt.imshow(noisy_img, origin='lower', cmap='viridis') plt.scatter(true_centroid[0], true_centroid[1], c='red', marker='x', s=100, label='真实质心') plt.scatter(measured_centroid[0], measured_centroid[1], c='blue', marker='o', s=80, label='计算质心') plt.legend() plt.colorbar(label='亮度') plt.show()
3. 进阶:用PSF模型生成更真实的星图
如果需要模拟更接近真实天文观测的点扩散函数(PSF),可以用photutils自带的PSF模型来生成,比如GaussianPSF:
from photutils.psf import GaussianPSF # 创建高斯PSF模型 psf = GaussianPSF(sigma=sigma) # 生成以亚像素为中心的星图 psf_img = psf.render((20, 20), center=true_centroid) # 添加噪声后再测试 noisy_psf_img = psf_img + np.random.normal(0, 0.5, psf_img.shape)
这种方式生成的星图更符合真实望远镜的成像效果,测试结果会更有参考价值。
关键原理
亚像素级的质心位移本质上是星点的亮度分布中心落在像素之间的位置,所以直接让高斯分布的中心为浮点数(亚像素坐标),就能自然模拟这种情况,不需要对整像素图像做插值位移——后者反而可能引入额外误差,影响测试结果。
内容的提问来源于stack exchange,提问作者Cristina PM




