有没有办法在Python中的FITS文件上使用算术运算?

有没有办法在Python中的FITS文件上使用算术运算?,python,python-3.x,astropy,fits,pyfits,Python,Python 3.x,Astropy,Fits,Pyfits,我对Python相当陌生,我一直在尝试用Python重新创建一个工作的IDL程序,但是我被卡住了,并且不断地出错。我还没有找到解决办法。 该程序总共需要4个FITS文件(img和校正图像暗、flat1、flat2)。行动如下: flat12 = (flat1 + flat2)/2 img1 = (img - dark)/flat12 所述文件具有尺寸(10241024,1)。我已经将它们的大小调整为(10241024),甚至可以使用im\u show()函数 我也尝试过使用cv2.add()

我对Python相当陌生,我一直在尝试用Python重新创建一个工作的IDL程序,但是我被卡住了,并且不断地出错。我还没有找到解决办法。 该程序总共需要4个FITS文件(img和校正图像暗、flat1、flat2)。行动如下:

flat12 = (flat1 + flat2)/2

img1 = (img - dark)/flat12
所述文件具有尺寸(10241024,1)。我已经将它们的大小调整为(10241024),甚至可以使用
im\u show()
函数

我也尝试过使用
cv2.add()
,但我发现:

TypeError:参数“src1”应为Ptr


有什么解决办法吗?提前感谢。

要阅读您的FITS文件,请使用
astropy.io.FITS
: 这将为您提供Numpy数组(如果需要,可以使用头文件,如文档中所述,有不同的方法来实现),因此您可以执行以下操作:

>>> from astropy.io import fits
>>> img = fits.getdata('image.fits', ext=0) # extension number depends on your FITS files
>>> dark = fits.getdata('dark.fits') # by default it reads the first "data" extension
>>> darksub = img - dark
>>> fits.writeto('out.fits', darksub) # save output
如果数据有一个额外的维度,如(10241024,1)形状所示,并且如果要删除该轴,可以使用正常的Numpy数组切片语法:
darksub=img[0]-dark[0]

否则,在上面的示例中,它将生成并保存(10241024,1)图像。

要读取FITS文件,请使用
astropy.io.FITS
: 这将为您提供Numpy数组(如果需要,可以使用头文件,如文档中所述,有不同的方法来实现),因此您可以执行以下操作:

>>> from astropy.io import fits
>>> img = fits.getdata('image.fits', ext=0) # extension number depends on your FITS files
>>> dark = fits.getdata('dark.fits') # by default it reads the first "data" extension
>>> darksub = img - dark
>>> fits.writeto('out.fits', darksub) # save output
如果数据有一个额外的维度,如(10241024,1)形状所示,并且如果要删除该轴,可以使用正常的Numpy数组切片语法:
darksub=img[0]-dark[0]

否则,在上面的示例中,它将生成并保存(10241024,1)图像。

将它们转换为numpy数组@谢谢你的建议,但它不处理FITS文件。我尝试使用线程中给出的方法,但将FITS转换为ndarray会给我一个空元组或类“NoneType”。只是一个我喜欢反复强调的概念性说明:一个人不会对FITS文件进行算术运算(尽管我知道你问这个问题的意思;我不是吹毛求疵)。我认为,考虑数据和数据存储方法之间的概念上的差异是很有用的。FITS只是将阵列数据存储在磁盘文件中(以及相关元数据)的一种方法。因此,您真正想考虑的是如何将存储在FITS文件中的数据读入某种更通用的格式,并对其执行算术运算(在Python中,根据@saimn的回答,“通用格式”是Numpy数组)(甚至Numpy数组也是更高级别的抽象)将其转换为Numpy数组@谢谢你的建议,但它不处理FITS文件。我尝试使用线程中给出的方法,但将FITS转换为ndarray会给我一个空元组或类“NoneType”。只是一个我喜欢反复强调的概念性说明:一个人不会对FITS文件进行算术运算(尽管我知道你问这个问题的意思;我不是吹毛求疵)。我认为,考虑数据和数据存储方法之间的概念上的差异是很有用的。FITS只是将阵列数据存储在磁盘文件中(以及相关元数据)的一种方法。因此,您真正想考虑的是如何将存储在FITS文件中的数据读入更通用的格式,并对其执行算术运算(在Python中,根据@saimn的回答,“通用格式”是Numpy数组)(甚至Numpy数组也是更高级别的抽象)注意,这种方法从FITS文件中提取数据,并丢弃头信息。数据(数组)和标头(一组键值对)之间的区别是无法直接对FITS文件执行操作的部分原因。请注意,此方法从FITS文件提取数据并丢弃标头信息。数据(数组)和标头(一组键值对)之间的区别是不能直接对FITS文件执行操作的部分原因。