Получить пиксельные координаты из ra, dec после передискретизации изображения FITS

Я ищу способ найти координаты пикселей на моем изображении FITS, которые соответствуют положениям объекта в градусах по ra и dec после передискретизации. Это было бы просто, если бы я не передискретизировал, но мне нужно. Учитывая неизмененное изображение FITS, я могу:

from astropy.wcs import WCS

ra, dec = (43.603, 31.029)
w = WCS('myimage.fits')
x, y = w.all_world2pix(ra, dec, 1) #this gives me the pixel coordinates of the object at (ra, dec) position

Однако, когда я передискретизирую его и ТОГДА пытаюсь найти координаты пикселей, это явно неточно, поскольку (ra, dec) больше не точен для передискретизированного изображения. Так как я передискретизирую 5x5, я попытался просто умножить свой x, y выше на 5. Но когда я увеличиваю масштаб в этой точке в ds9, он показывает объект не по центру, поэтому я не думаю, что это работает. Ниже приведена моя часть кода с передискретизацией, поскольку это может помочь увидеть это. Здесь data - это просто двумерный массив данных, содержащихся в моем исходном изображении FITS.

from astropy.nddata import Cutout2D
import numpy as np
from scipy import interpolate

def oversample(data_set, N):
    size = 120 #pixel size of my box cutout
    geom_ctr = (np.shape(data_set)[0]//2, np.shape(data_set)[1]//2)
    cutout = Cutout2D(data_set, geom_ctr, size).data
    Y, X = np.shape(cutout)
    x = np.linspace(0, 0.5, X)
    y = np.linspace(0, 0.5, Y)

    f = interpolate.interp2d(x, y, cutout, kind='cubic')
    Xnew = np.linspace(0, 0.5, X*N)
    Ynew = np.linspace(0, 0.5, Y*N)
    new_data = f(Xnew, Ynew)

    return new_data

resampled_data = oversample(data, 5)

Если у кого-то есть идеи, как я могу восстановить точные координаты пикселей после передискретизации, это было бы здорово. Спасибо!


person curious_cosmo    schedule 16.08.2018    source источник


Ответы (1)


В принципе, описанное вами решение «умножить x, y на 5» является правильным. В вашей реализации должна быть ошибка.

Вы не показываете код, который используете для вычисления координат, поэтому я могу только догадываться о проблеме.

Несколько советов:

  • Сначала научитесь использовать Cutout2D, прочитав эту страницу: http://docs.astropy.org/en/stable/nddata/utils.html Обратите внимание, что есть cutout.data, который вы используете в своем примере, но есть также cutout.wcs, который представляет WCS вашего вырезания. Если вы хотите работать с вырезом, вы должны использовать эту WCS (а не ту из исходного изображения) для преобразования между мировыми и пиксельными координатами.
  • Попробуйте получить рабочий пример с координатами пиксель / небо на сверхдискретизированном изображении без дополнительных сложностей, связанных с вырезом. На ваш вопрос было бы легче ответить, если бы вы опубликовали минимальный пример, пытающийся сделать то, что мы можем запустить, и который дает неверные результаты.
  • Знайте, что если вы передадите origin=1 в вызове w.all_world2pix(ra, dec, 1) в качестве третьего аргумента, тогда центр первого пикселя будет в позиции пикселя 1. Вам нужно получить позиции интерполяции x и y для интерполяции, а также строку кода, которую вы используете. для точного вычисления координат. Может быть проще передать origin=0.5, то есть поместить центр первого пикселя в позицию пикселя 0,5 и, следовательно, угол изображения в позицию пикселя 0,0? Таким образом, может быть проще написать строки, в которых нужно разместить узлы интерполяции, и правильно вычислить координаты в интерполированном изображении.

Если вы разделяете задачу на отдельные шаги или функции (вместо одной функции, которая выполняет как вырезание, так и повышающую дискретизацию) и используете хорошо выбранный тестовый пример, в котором вы знаете ожидаемый результат (например, изображение размером всего несколько пикселей, где вы знаете ожидаемый результат) результат, например data = np.array([[1, 2, 3], [4, 5, 6]])), вы быстро найдете и исправите проблему в своем коде, который вычисляет координаты.

person Christoph    schedule 19.08.2018