Galsim.GSObject.draw()的GalSim自动图像大小行为

时间:2014-03-29 19:07:48

标签: galsim

我注意到可以在没有image关键字的情况下调用GSObject.draw。文档说如果image = None,则返回自动调整大小的图像。这个自动尺寸究竟是如何确定的?它是否确保在图像中保留一小部分星系的通量,如果是这样的话,是什么分数?

1 个答案:

答案 0 :(得分:1)

是。总结是它试图获得至少99.5%的通量。

每个原子对象都有一个内部属性stepk,它是在傅里叶图像中使用的网格大小。这是基于真实空间图像,包括至少99.5%的通量,以避免FFT中的混叠。

然后,当您组合对象(使用Add,Convolve等)或转换它们(剪切,dliate等)时,stepk的值将保持最新的配置文件,有时在准确的公式时会有启发式过于笨拙,但我们通常试图在保守派方面犯错误。

然后当您使用image=None绘制最终对象时,它使用最终的stepk值来计算带有N = 2pi * wmult / (scale * stepk)的图章大小,其中scale是图像的像素比例,其中您通常会明确指定(im = obj.draw(scale=pixel_scale)),而wmult是一个可选参数,其工作就是这样 - 制作比默认情况下更大的图像。

然后将此N向上舍入为2^k3 * 2^k。这有助于提高后续FFT的效率。

如果要更改99.5%的值,也可以使用GSParams类。它是参数alias_threshold。实际上,1-alias_threshold。默认的alias_threshold是5e-3,但如果您想要执行以下操作,则可以降低此值:

gsparams = galsim.GSParams(alias_threshold=1.e-3)
gal = galsim.Sersic(..., gsparams=gsparams)
psf = galsim.Kolmogorov(..., gsparams=gsparams)
pix = galsim.Pixel(..., gsparams=gsparams)
conv = galsim.Convolve([gal,psf,pix])
im = conv.draw(scale=pixel_scale)