Вычисление fwhm звездного профиля

Моя цель - вычислить 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
0
633
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Точно. Я поступил примерно так же, как вы описали. Спасибо

rcolombari 24.09.2018 14:21

Другие вопросы по теме