Вычисление FWHM звездного профиля - PullRequest
0 голосов
/ 13 сентября 2018

Моя цель - вычислить 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)

При таком подходе я не получаю ожидаемый результат при просмотре данных.

Есть что-то, что я пропускаю? Любое другое предложение?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете получить лучшие результаты, используя интерполяцию, чтобы вы могли достичь точности до субпикселя.А поскольку ваши данные находятся в диапазоне 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?

...