fits文件的映射的可以在规定的头文件之下,把数据按规定的头文件进行映射。有以下作用
【练习文件下载,下载好请自行修改名字:fits文件下载地址】
1,改变轴的数量
改变轴的数量意义在于,只有轴数相同的头文件才允许相互映射,这一步是至关重要的。
import numpy as np
from astropy.io import fits as pf
from astropy.wcs import WCS
from reproject import reproject_interp
hdu1 = pf.open('m31cm6i_full_3min_large.fits')[0]
print(hdu1.data.shape)
#map从三个轴改成两个轴
hdr1 = hdu1.header
hdr = pf.Header({ 'SIMPLE': True,
'BITPIX': -32,
'NAXIS': 2,
'NAXIS1': hdr1['NAXIS1'],
'NAXIS2': hdr1['NAXIS2'],
'CDELT1': hdr1['CDELT1'],
'CRVAL1': hdr1['CRVAL1'],
'CRPIX1': hdr1['CRPIX1'],
'CTYPE1': hdr1['CTYPE1'],
'CDELT2': hdr1['CDELT2'],
'CRPIX2': hdr1['CRPIX2'],
'CRVAL2': hdr1['CRVAL2'],
'CTYPE2': hdr1['CTYPE2'],
'CROTA1': hdr1['CROTA1'],
'CROTA2': hdr1['CROTA2'],
'EPOCH' : hdr1['EPOCH'],
'BUNIT' : hdr1['BUNIT'],
'EXTEND': True,
})
#各个关键词的意义参考本人博客ska暑期训练。
#这里没有写分辨率信息,关键字为'HBPW'或者其他,如果需要可以自行添加 。
pf.writeto('m31cm6i_full_3min_large_H.fits', hdu1.data[0], hdr, overwrite=True)
data = pf.getdata('m31cm6i_full_3min_large_H.fits')
print(data.shape)
(1, 281, 601)
(281, 601)
2. 改变数据大小和中心的位置
经过映射之后,可以缩小数据的范围,并且数据的中心是可以根据你的科学目标进行更改的
具体代码如下,效果图如下,就是更改
hdu = pf.open('m31cm6i_full_3min_large_H.fits')
hdr = pf.getheader('m31cm6i_full_3min_large_H.fits')
hdr['NAXIS1'] = 301
hdr['NAXIS2'] = 301
hdr['CRVAL1'] = 10.0074996948
hdr['CRVAL2'] = 40.9961128235
hdr['CRPIX1'] = 151
hdr['CRPIX2'] = 151
data_n1, footprint = reproject_interp(hdu, hdr)
pf.writeto('new.fits', data_n1, hdr, overwrite=True)


3. 对坐标系进行旋转投影
可以看到原来的旋转度数是53度,可以随意更改这个旋转的度数
print(hdr['CROTA1'])
print(hdr['CROTA2'])
hdr['CROTA1'] = 0
hdr['CROTA2'] = 0
data_n1, footprint = reproject_interp(hdu, hdr)
pf.writeto('new1.fits', data_n1, hdr, overwrite=True)
0.0
53.0
4. 从J1950系到J2000系
转换坐标系,要改变EPOCH和参考点的坐标,最好用自transform_to去转变。可以把参考点从FK4转换到FK5系。
print(hdr['EPOCH'])
hdu = pf.open('m31cm6i_full_3min_large_H.fits')[0]
hdr = pf.getheader('m31cm6i_full_3min_large_H.fits')
print(hdu.header['CRVAL1'], hdu.header['CRVAL2'])
c = SkyCoord(hdu.header['CRVAL1']*u.degree, hdu.header['CRVAL2']*u.degree, frame='fk4')
c = c.transform_to('fk5')
hdr['CRVAL1'] = c.ra.deg
hdr['CRVAL2'] = c.dec.deg
hdr['EPOCH'] = 2000.00
print(hdr['CRVAL1'], hdr['CRVAL2'])
data1, footprint = reproject_interp(hdu, hdr)
pf.writeto('new_FK5.fits', data1, hdr, overwrite=True)
2000.0
10.0074996948 40.9961128235
10.691854734427656 41.26993263852114
其他的映射一样的逻辑,主要对头文件的操作,要特别注意头文件每个的关键词。按照自己需求全部修改好,一并把数据映射过来就好了。