Вы можете получить лучшие результаты, используя интерполяцию, чтобы вы могли достичь точности до субпикселя.А поскольку ваши данные находятся в диапазоне 0-1, а ваш центроид имеет интенсивность 1, вы можете извлечь профили через эту точку.Сначала импортируйте ваше изображение в виде двумерного массива, если он еще не в этой форме.Если вы начинаете с файла 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 вдоль полуоси большой и полуосновной осей, вам придется извлечь профиль, взяв отрезок линии, соединенный двумя точками.Затем вы можете получить FWHM таким же образом с помощью функции interpolate_width
.Смотрите здесь для части извлечения профиля этого подхода: Как извлечь произвольную строку значений из массива numpy?