计算恒星轮廓的 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?
我的目标是计算恒星剖面的 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?