使用 Astropy 在 n-dimensional FITS 图像中的像素坐标和物理坐标之间切换
Switch between coordinates of pixel and physical coordinates in n-dimensional FITS image using Astropy
我有一个 FITS 图像 header 包含有关沿每个轴的坐标的信息
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中有没有built-in函数,可以得到离实际坐标最近的像素的坐标?
编辑:我找到了 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]
吗?
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
。
如果您使用 FITS/Fortran 约定将像素索引存储在目录中,则使用 origin=1 有时可能会有用。
我有一个 FITS 图像 header 包含有关沿每个轴的坐标的信息
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中有没有built-in函数,可以得到离实际坐标最近的像素的坐标?
编辑:我找到了 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]
吗?
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
。
如果您使用 FITS/Fortran 约定将像素索引存储在目录中,则使用 origin=1 有时可能会有用。