GalSim如何避免恒星全部光子落入单像素实现类sinc亚像素分布
GalSim点源成像位置量化问题的解决方法
你遇到的恒星位置量化问题,本质是绘制图像时跳过了像素响应卷积步骤,直接将点源流量分配到最近邻像素格点导致的,GalSim提供了完整的内置能力实现你要的效果,不需要从零开发自定义sinc PSF集成逻辑:
- 若你只需要模拟无大气、无衍射效应的理想点源,正确复现光子跨像素分布、落点落在像素间隙时的流量拆分效果:不需要额外定义PSF,只要不要在
drawImage()中指定method='no_pixel'即可。默认的method='auto'会自动完成点源与矩形像素响应的卷积,自动按照点源的实际天球位置分配跨像素流量,不会出现位置被强制量化到整数像素坐标的问题。 - 若你需要严格的sinc函数轮廓的光子分布(比如模拟理想光学系统的衍射极限响应,而非仅像素积分效应):可以直接调用GalSim内置的
galsim.Sinc类初始化对应sinc PSF,将其与点源、像素响应通过galsim.Convolve做卷积后再传入drawImage()即可,不需要自行修改drawImage()的底层集成逻辑。
最简实现参考代码:import galsim # 配置基础仿真参数 pixel_scale = 0.2 # 单位:角秒/像素 star_flux = 10000 # 组合成像轮廓:点源 + sinc PSF + 像素响应 star = galsim.DeltaFunction(flux=star_flux) # 初始化sinc PSF,可根据需求调整scale、截断半径等参数匹配仿真要求 ideal_psf = galsim.Sinc(scale=pixel_scale) pixel = galsim.Pixel(scale=pixel_scale) final_profile = galsim.Convolve([star, ideal_psf, pixel]) # 输出仿真图像 img = final_profile.drawImage(nx=128, ny=128, scale=pixel_scale) - 额外注意:如果使用光子射击(photon shooting)模式仿真光子落点,需要保证单颗星的采样光子数足够(可通过调整
drawImage()的maxN参数设置采样上限),避免光子数统计噪声掩盖跨像素的流量分布特征;不要启用shoot_accuracy等会自动简化点源轮廓、强制集中流量到单像素的优化参数。
内容的提问来源于stack exchange,提问作者galilei
相关产品推荐
相关产品推荐

