Переключение между координатами пикселя и физическими координатами в n-мерном ПОДХОДЯЩЕМ изображении с использованием Astropy

#python #coordinate-transformation #astropy

#python #преобразование координат #astropy

Вопрос:

У меня есть изображение FITS с заголовком, содержащим информацию о координатах вдоль каждой оси

 NAXIS   =                    3
NAXIS1  =                  259
NAXIS2  =                  272
NAXIS3  =                  100
CDELT1  = -0.08333333330000001
CDELT2  =  0.08333333330000001
CDELT3  =                  0.1
CRPIX1  =                130.5
CRPIX2  =    132.1906015909634
CRPIX3  =                    0
CRVAL1  =                255.0
CRVAL2  =                 60.0
CRVAL3  =                15.45
  

Есть ли простой способ (например, и функция Astropy) получить фактические (физические) координаты из координат пикселя?

И наоборот, есть ли встроенная функция в Astropy для получения координат ближайшего пикселя из фактических координат?

Редактировать: Я нашел WCS.all_pix2world функцию, но я не понимаю, как ее использовать, и я не нашел никаких примеров использования.

Из документации:

 There are two accepted forms for the positional arguments:

        - 2 arguments: An N x naxis array of coordinates, and an origin.
        - more than 2 arguments: An array for each axis, followed by an origin. These arrays must be broadcastable to one another.
  

В первом случае, что такое N ? Не origin всегда было бы [0,0,0] так?

Ответ №1:

  • N это количество точек, для которых вы хотите выполнить преобразование, т. Е. вы можете вычислить пиксельные или мировые координаты для массива из N точек.

  • origin это просто условно, о координате верхнего левого угла. В массивах Python используется индексация на основе 0, поэтому она равна 0. Смотрите пример ниже:

 In [1]: from astropy.wcs import WCS                                                            

In [2]: from astropy.io import fits                                                            

In [3]: hdr = fits.Header.fromstring(""" 
   ...: NAXIS   =                    3 
   ...: NAXIS1  =                  259 
   ...: NAXIS2  =                  272 
   ...: NAXIS3  =                  100 
   ...: CDELT1  = -0.08333333330000001 
   ...: CDELT2  =  0.08333333330000001 
   ...: CDELT3  =                  0.1 
   ...: CRPIX1  =                130.5 
   ...: CRPIX2  =    132.1906015909634 
   ...: CRPIX3  =                    0 
   ...: CRVAL1  =                255.0 
   ...: CRVAL2  =                 60.0 
   ...: CRVAL3  =                15.45 
   ...: """, sep='n')                                                                         

In [4]: wcs = WCS(hdr)                                                                         

In [5]: wcs                                                                                    
Out[5]: 
WCS Keywords

Number of WCS axes: 3
CTYPE : ''  ''  ''  
CRVAL : 255.0  60.0  15.45  
CRPIX : 130.5  132.1906015909634  0.0  
PC1_1 PC1_2 PC1_3  : 1.0  0.0  0.0  
PC2_1 PC2_2 PC2_3  : 0.0  1.0  0.0  
PC3_1 PC3_2 PC3_3  : 0.0  0.0  1.0  
CDELT : -0.0833333333  0.0833333333  0.1  
NAXIS : 259  272  100
  

Теперь вы можете вычислить мировую координату верхнего левого угла:

 In [6]: wcs.all_pix2world([[0, 0, 0]], 0)                                                      
Out[6]: array([[265.79166666,  49.06744987,  15.55      ]])
  

Здесь вы могли бы использовать массив индексов Nx3.

Итак, если у вас есть индексы пикселей и вы хотите преобразовать их в координаты неба, вам нужно использовать origin = 0 и то же самое для обратного, чтобы преобразовать координаты неба в индексы пикселей с помощью wcs.all_world2pix .

Использование origin = 1 иногда может быть полезно, если у вас есть индексы пикселей, хранящиеся в каталоге с использованием соглашения FITS / Fortran.

Комментарии:

1. Итак, я ожидаю, что wcs.all_pix2world([[CRPIX1, CRPIX2, CRPIX2]]) вернется (CRVAL1, CRVAL2, CRVAL3) , например?

2. Устанавливая origin=0 , я получаю неправильные значения. Однако с origin=1 (массивы в моем файле FITS начинаются с 1 ) я, кажется, получаю ожидаемые значения.

3. Если вы преобразуете координаты пикселей, это зависит от того, с какими соглашениями координаты пикселей хранятся в файле.