Телескопы покупают здесь


A A A A Автор Тема: Алгоритм выделения звёзд на снимке  (Прочитано 1347 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн krussh

  • *****
  • Сообщений: 2 460
  • Благодарностей: 112
  • http://www.soulfulbits.com/
    • Сообщения от krussh
Re: Алгоритм выделения звёзд на снимке
« Ответ #20 : 05 Окт 2017 [08:50:48] »
описание алгоритма.
Необходимо выделить точки в которых интенсивность превышает уровень шума в N раз по отношению к амплитуде шума.

В общем случае в изображении содержатся: ток смещения (bias), темновой ток, фон неба. Им соответствуют шумы: считывания, темновой шум, пуассоновский шум неба. Шумы суммируются. Кроме того, на некалиброванных кадрах есть горячие пиксели. Шум темнового тока и фона неба - пуассоновские, стандартное отклонение (сигма) = корню из среднего.

Решаем задачу для простого случая: изображения без вычитания дарков, на кадре нет туманностей = фон неба примерно постоянный по кадру. Этого вполне достаточно для большинства случаев. Относительно быстрый.

Применяем мягкий медианный фильтр для удаления горячих пикселей.
Data = filters.median_filter(Data, size=2, origin=0, mode= 'reflect')

Находим медианное среднее для кадра = приличная оценка среднего фона. Корень квадратный из этого значения дает сильно завышенную оценку уровня шума (так как мы не вычли ток смещения = bias)
##Poisson statistics
    Bckgrnd_median = np.median(Data)
    print('Median background=', Bckgrnd_median)             #good background level estimate
    RMS_median = np.sqrt(Bckgrnd_median)
    print('Poisson noise=', RMS_median)

берем пиксели со значениями среднее+-3*оценка шума:
hist_l = Bckgrnd_median-3*RMS_median                    #low boundaries for histigram
hist_h = Bckgrnd_median+3*RMS_median                    #high boundaries for histigram

строим гистограмму, ищем пик гистограммы и вариацию (ширину распределения) исходя из предположения о нормальном (гауссовом) распределении.
Gauss = lambda x, A, B, C, D: A*np.exp(-(x-B)**2/(2*C*C))+D #model for Gauss distribution of background
p0 = np.array([max(counts), Bckgrnd_hist, 3, min(counts)]) 
    #fit Gauss
    try:
        popt, pcov = curve_fit(Gauss, bins, counts, p0, ftol=0.1, maxfev=10000)
        print('Background mode=', popt[1])                          #fitted maximum of histogram
        print('RMS =', popt[2])                                     #fitted RMS of histogram
        Noise = popt[2]
##        plt.plot(bins, counts)
##        plt.plot(bins, Gauss(bins, *popt), color='green')
##        plt.vlines(Bckgrnd_hist, 0, max(hist[0]), color='blue')
##        plt.vlines(popt[1], 0, max(hist[0]), color='red')
##        plt.show()
строчки в комментариях - визуализация результата

popt[1] - средний уровень фона (dias+темновой+небо)
popt[2] - амплитуда шума (сигма)

звездами считаем все, что имеет интенсивность выше среднего уровня фона+амплитуда шума*пороговое значение SN
Data_Peaks = Data - (popt[1] + SN*popt[2])
detected_peaks = Data_Peaks>0

дальше нужно/можно проверить размеры найденных деталей, интенсивность, положение (не слишком близко к краю)
работает не без проблем: на очень ярких звездах находит лучи, в тесных парах не разделяет звезды.

Сложности начинаются если на изображении много горячих пикселей и медианный фильтр с ними не справляется.
Особая [----] если фон неба сильно переменный (туманности). Тогда нужно оценивать фон неба локально в каждой точке. Можно сделать это используя медианный фильтр с шириной ядра больше, чем размеры звезд (это я использую иногда, медленно работает!). Можно попробовать минимальный (ищет минимум) фильтр. Можно оценивать в узлах сетки и интерполировать (так делает SExtractor и Photutils).





Оффлайн mo

  • *****
  • Сообщений: 17 500
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Re: Алгоритм выделения звёзд на снимке
« Ответ #21 : 05 Окт 2017 [11:16:05] »
Интересно. Подпишусь. Свой уровень пока недостаточен для советов, так что с интересом читаю.
モ - mo

anovikov

  • Гость
Re: Алгоритм выделения звёзд на снимке
« Ответ #22 : 05 Окт 2017 [13:45:35] »
krussh, вот у меня результаты выходят примерно того же качества что и у Вас (не было инструмента для рисования кружков так что поставил точки со значением 0 - тут белые - там где нашел звезду - сделайте зум чтобы увидеть). Как видим, и у Вас на приаттаченной картинке и у меня - звёзды нашлись очень неплохо, но позиции их мажут на 1-3 пиксела (у Вас тоже звёзды по большей части не в центре, а с краю кружка). Вот и у меня та же хрень. Очевидно что какой алгоритм идентификации WGS по таким позициям я потом не присобачу - он врядли что-то найдёт, слишком неточны исходные данные. Что делать? По идее, точность центроидов может быть даже лучше 1 пиксела, а тут намного хуже.

anovikov

  • Гость
Re: Алгоритм выделения звёзд на снимке
« Ответ #23 : 05 Окт 2017 [13:58:56] »
О, увидел ответ с get_psf. Пробую! спасибо

Оффлайн krussh

  • *****
  • Сообщений: 2 460
  • Благодарностей: 112
  • http://www.soulfulbits.com/
    • Сообщения от krussh
Re: Алгоритм выделения звёзд на снимке
« Ответ #24 : 05 Окт 2017 [14:27:45] »
О, увидел ответ с get_psf. Пробую! спасибо

Ага. Дальше нужно уточнять положение.

anovikov

  • Гость
Re: Алгоритм выделения звёзд на снимке
« Ответ #25 : 05 Окт 2017 [22:22:54] »
Забил я на это - результат хронически плохой что ни юзай, и ничего фиттинг не уточняет толком. Не знаю в чём дело...

Оффлайн krussh

  • *****
  • Сообщений: 2 460
  • Благодарностей: 112
  • http://www.soulfulbits.com/
    • Сообщения от krussh
Re: Алгоритм выделения звёзд на снимке
« Ответ #26 : 06 Окт 2017 [06:56:37] »
Забил я на это - результат хронически плохой что ни юзай, и ничего фиттинг не уточняет толком. Не знаю в чём дело...

Не-не-не)) там все не сложно.
У вас есть примерные координаты звезд - найдены поиском. Сам точечки видел)
Дальше вырезаем кусок вокруг +-5*FWHM  = ROI.
Накладываем маску на центр ROI и считаем медиану по пикселям на краях. Это дает оценку локального фона.
Значение и положение максимально яркого пикселя в центре дает оценку амплитуды и положения пика ф-ии Моффата.
Дальше фитируем с начальными оценками - получаем уточненное положение. Параллельно еще и фотометрию можно сделать.

Я этот алгоритм использую для астрометрии и фотометрии астероидов. Точность на уровне 1/10 пикселя.
Полный пакет лежит вот здесь: http://optlab.kourovka.ru/krussh/followme/Allmetry/
Там без поиска звезд, для этой задачи не нужное действие. Сразу делаю слепую астрометрию и подсасываю каталог из Vizier.
Центрирование и фотометрия в модуле PSF_phot. Переход от измеренных мной X-Y к RaDec считается с помощью Astrometry.net.