使用Python在fits文件中查找像素的物理坐标

8

我想从Python脚本中获取给定像素的物理天空坐标。 我想使用astropy的WCS,但我可以在Python内部做任何事情。

我尝试了以下两个代码片段。

from astropy.io import fits
from astropy.wcs import WCS

def astropymethod1(img):
    # from http://astropy.readthedocs.org/en/latest/wcs/
    w = WCS(img)
    lon, lat = w.all_pix2world( 100., 100., 1)
    print lon, lat

def astropymethod2(img):
    # from http://astropy.readthedocs.org/en/latest/wcs/
    hdu = fits.open(img)
    w = WCS(hdu[0].header)
    lon, lat = w.wcs_pix2world(100., 100., 1)
    print lon, lat

问题在于我第一次尝试使用WCS时出现错误,并且结果只是我输入的像素值。
WARNING: FITSFixedWarning: The WCS transformation has more axes (2) than the image it is associated with (0) [astropy.wcs.wcs]

你的Dropbox链接不是一个链接。你有其他的服务可以用来展示样本文件吗? - skrrgwasme
一个朋友Brian告诉我,我的fits文件是多扩展的,因此我在第二种方法中只需要使用hdu[1]而不是hdu[0]。 - Benjamin Rose
这是Dropbox链接。我没有看到它没有出现。https://www.dropbox.com/s/qt0mx78cwfcpsjk/WCS.zip - Benjamin Rose
1个回答

7

问题是您有一个多扩展名的FITS文件。以下是一个示例会话,展示了如何访问适当的WCS:

In [1]: from astropy.io import fits

In [2]: h = fits.getheader('SN1415_F625W_1_drz.fits')

In [3]: f = fits.open('SN1415_F625W_1_drz.fits')

In [4]: f
Out[4]:
[<astropy.io.fits.hdu.image.PrimaryHDU at 0x106735490>,
 <astropy.io.fits.hdu.image.ImageHDU at 0x106749750>,
 <astropy.io.fits.hdu.image.ImageHDU at 0x106751310>,
 <astropy.io.fits.hdu.image.ImageHDU at 0x106751d10>,
 <astropy.io.fits.hdu.table.BinTableHDU at 0x1067dfdd0>]

In [5]: from astropy import wcs

In [6]: w = wcs.WCS(f[0].header)
WARNING: FITSFixedWarning: The WCS transformation has more axes (2) than the image it is associated with (0) [astropy.wcs.wcs]

In [7]: w.wcs.naxis
Out[7]: 2

In [8]: f[0].data

In [9]: w = wcs.WCS(f[1].header)

In [10]: w.wcs.naxis
Out[10]: 2

In [11]: f[1].data
Out[11]:
array([[ 0.01986978, -0.04018363,  0.03330525, ...,  0.        ,
         0.        ,  0.        ],
       [ 0.0695872 , -0.00979143,  0.00147662, ...,  0.        ,
         0.        ,  0.        ],
       [-0.09292094,  0.02481506, -0.01057338, ...,  0.        ,
         0.        ,  0.        ],
       ...,
       [ 0.        ,  0.        ,  0.        , ...,  0.02375774,
         0.0389731 ,  0.03825707],
       [ 0.        ,  0.        ,  0.        , ..., -0.01570918,
        -0.01053802,  0.00461219],
       [ 0.        ,  0.        ,  0.        , ..., -0.0638448 ,
        -0.0240754 ,  0.02679451]], dtype=float32)

In [12]: w.wcs_pix2world(100., 100., 1)
Out[12]: [array(6.113076380801787), array(0.616758775753701)]

所以你可能想重新定义你的方法:
def astropymethod2(img, hduid=1):
    # from http://astropy.readthedocs.org/en/latest/wcs/
    hdu = fits.open(img)
    w = WCS(hdu[hduid].header)
    lon, lat = w.wcs_pix2world(100., 100., 1)
    print lon, lat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接