计算恒星轮廓的 FWHM

Computing the FWHM of a star profile

我的目标是计算恒星剖面的 FWHM。

我有一张图片和其中的一颗星星作为输入。位置 (x, y) 处的每个像素都具有介于 0 和 1 之间的强度。

我的想法是计算整个数据集的标准偏差,然后使用以下公式:

f(x, y)=[1/(√(2π)σ)]exp(-[(x - X)^2 + (y - Y)^2]/2σ^2])

求解方程:

fmax/2=1/[2√(2π)σ]=[1/(√(2π)σ)]exp(-[(x - X)^2 + (y - Y)^2]/2σ^2]) =>

FWHM=2σ√(2ln2)

通过这种方法,我没有得到查看数据的预期结果。

有什么我想念的吗?还有其他建议吗?

您可能会使用插值法获得更好的结果,从而达到亚像素精度。由于您的数据介于 0-1 之间,质心的强度为 1,因此您可以通过该点提取配置文件。首先,将您的图像导入为 2D numpy 数组(如果它尚未采用那种形式)。如果您从 FITS 文件开始:

from astropy.io import fits
filename = 'your_image_file.fits'
image = fits.getdata(filename)

要提取您的个人资料并获取 FWHM:

import numpy as np
from scipy.interpolate import UnivariateSpline

def profiles(image):
    ypix, xpix = np.where(image==1)
    x = np.take(image, ypix[0], axis=0)
    y = np.take(image, xpix[0], axis=1)

    return x, y #these are the horizontal and vertical profiles through the star's centroid

def interpolate_width(axis):
    half_max = 1/2
    x = np.linspace(0, len(axis), len(axis))

    # Do the interpolation
    spline = UnivariateSpline(x, axis-half_max, s=0)
    r1, r2 = spline.roots()

    return r2-r1 #this is the FWHM along the specified axis

horizontal, vertical = profiles(image)
fwhm_x = interpolate_width(horizontal)
fwhm_y = interpolate_width(vertical)

这是假设恒星没有旋转——或者如果旋转了,您只需要沿水平轴和垂直轴的 FWHM。如果恒星相对于水平方向旋转,并且您想要沿半长轴和半短轴的 FWHM,则必须通过取由两点连接的线段来提取轮廓。然后,您可以使用 interpolate_width 函数以相同的方式获取 FWHM。有关此方法的配置文件提取部分,请参见此处:How to extract an arbitrary line of values from a numpy array?