使用另一个图像文件的指定尺寸在 astropy 中创建一个新的图像文件

Creating a new Image file in astropy with specified dimensions of another image file

我在使用 astropy 包进行文件操作时遇到了问题,我需要一些帮助。

我基本上想拍摄适合文件格式的图像,并创建一个我需要开始输入校正因子的新文件和一个新图像,然后可以将其与校正因子和原始图像一起使用生成校正图像。每一个都具有相同的尺寸。

从这里开始:

from astropy.io import fits

# Compute the size of the images (you can also do this manually rather than calling these keywords from the header):
#URL: /Users/UCL_Astronomy/Documents/UCL/PHASG199/M33_UVOT_sum/UVOTIMSUM/M33_sum_epoch1_um2_norm.img
nxpix_um2_ext1 = fits.open('...')[1]['NAXIS1']
nypix_um2_ext1 = fits.open('...')[1]['NAXIS2']
#nxpix_um2_ext1 = 4071 #hima_sk_um2[1].header['NAXIS1'] # IDL: nxpix_uw1_ext1 = sxpar(hima_sk_uw1_ext1,'NAXIS1')
#nypix_um2_ext1 = 4321 #hima_sk_um2[1].header['NAXIS2'] # IDL: nypix_uw1_ext1 = sxpar(hima_sk_uw1_ext1,'NAXIS2')

# Make a new image file with the same dimensions (and headers, etc) to save the correction factors:
coicorr_um2_ext1 = ??[nxpix_um2_ext1,nypix_um2_ext1]

# Make a new image file with the same dimensions (and headers, etc) to save the corrected image:
ima_sk_coicorr_um2_ext1 = ??[nxpix_um2_ext1,nypix_um2_ext1]

任何人都可以告诉我我缺少执行此操作的明显知识...最后两行只是概述缺少的内容。我已经包括了??也许表明我需要其他东西可能 fits.writeto() 或类似的东西......

astropy documentation 带您逐步完成此任务:创建一个大小为 (NAXIS1,NAXIS2) 的数组,将数据放入主 HDU,创建一个 HDUlist 并将其写入磁盘:

import numpy as np
from astropy.io import fits

data = np.zeros((NAXIS2,NAXIS1))
hdu = fits.PrimaryHDU(data)
hdulist = fits.HDUList([hdu])

hdulist.writeto('new.fits')

我认为@VincePs 的回答是正确的,但我会添加更多信息,因为我认为您在这里没有很好地使用 astropy 的功能。

首先 Python 是 zero-based,所以主分机的号码是 0。也许你错了,也许你没有 - 但访问第二个 HDU 并不常见,所以我想我最好提一下。

hdu_num = 0 # Or use = 1 if you really want the second hdu.

首先同一个文件不需要打开两次,可以打开一次,提取相关值后关闭:

with fits.open('...') as hdus:
    nxpix_um2_ext1 = hdus[hdu_num]['NAXIS1']
    nxpix_um2_ext1 = hdus[hdu_num]['NAXIS2']
# Continue without indentation and the file will be closed again.

或者如果您想保留整个 header(以便稍后保存)和您可以使用的数据:

with fits.open('...') as hdus:
    hdr = hdus[hdu_num].header
    data = hdus[hdu_num].data # I'll also take the data for comparison.

我将继续使用第二种方法,因为我认为它更简洁,而且您将准备好所有数据和 header 值。

new_data = np.zeros((hdr['NAXIS2'], hdr['NAXIS1']))

请注意,Python 对轴的解释不同于 IRAF(我认为是 IDL,但我不确定),因此您需要将 axis2 作为第一个元素,将 axis1 作为第二个元素。

所以快速检查一下形状是否相同:

print(new_data.shape)
print(data.shape)

如果它们不相等,我对 Python 中的轴感到困惑(再次),但我不这么认为。但是,除了根据 header 值创建一个新数组之外,您还可以仅使用旧形状创建一个新数组:

new_data_2 = np.zeros(data.shape)

这将确保尺寸和形状相同。现在你有一个空图像。如果您更喜欢副本,那么您可以(但不需要)显式复制数据(除非您以 write/append/update 模式显式打开文件,那么您应该始终复制它,但这不是默认设置。)

new_data = data # or = data.copy() for explicitly copying.

对其进行操作,如果您想再次保存它,可以使用@VinceP 建议的方法:

hdu = fits.PrimaryHDU(new_data, header=hdr) # This ensures the same header is written to the new file
hdulist = fits.HDUList([hdu])
hdulist.writeto('new.fits')

请注意,即使您更改了数据的形状,您也不必更改 shape-related header 关键字,因为在 writeto 期间,astropy 将更新这些(默认情况下)