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

Posted

技术标签:

【中文标题】有没有办法在 Python 中对 FITS 文件使用算术运算?【英文标题】:Is there any way to use arithmetic ops on FITS files in Python? 【发布时间】:2020-05-09 23:52:41 【问题描述】:

我对 Python 还很陌生,我一直在尝试为 Python 重新创建一个有效的 IDL 程序,但我遇到了困难并且不断出错。我还没有找到解决方案。 该程序总共需要 4 个 FITS 文件(img 和校正图像 dark、flat1、flat2)。操作如下:

flat12 = (flat1 + flat2)/2

img1 = (img - dark)/flat12

上述文件的尺寸为 (1024,1024,1)。我已将它们的大小调整为 (1024,1024),以便能够使用 im_show() 函数。

我也尝试过使用cv2.add(),但我明白了:

TypeError:参数“src1”的预期 Ptr

有什么解决方法吗?提前致谢。

【问题讨论】:

把它们变成 numpy 数组。 ***.com/questions/7762948/… @shanecandoit 感谢您的建议,但它不处理 FITS 文件。我尝试使用线程中给出的方法,但是将 FITS 转换为 ndarray 会给我一个空元组或类“NoneType”。 只是一个我喜欢强调的概念性注释:一个不会对 FITS 文件进行算术运算(尽管我知道你问的意思;我不是在吹毛求疵)。我认为考虑数据和数据存储方法之间的概念差异很有用。 FITS 只是将阵列数据存储在磁盘文件中的一种方式(以及相关的元数据)。因此,您真正要考虑的是如何将存储在 FITS 文件中的数据读取为更通用的格式,并对其执行算术运算(在 Python 中,根据@saimn 的回答,“通用格式”是 Numpy 数组)跨度> (甚至 Numpy 数组也是更高级别的抽象) 【参考方案1】:

要阅读您的 FITS 文件,请使用 astropy.io.fits: http://docs.astropy.org/en/latest/io/fits/index.html 这将为您提供 Numpy 数组(如果需要,还有 FITS 标头,有不同的方法可以做到这一点,如文档中所述),因此您可以执行以下操作:

>>> 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

如果您的数据有一个额外的维度,如 (1024,1024,1) 形状所示,并且如果您想删除该轴,您可以使用正常的 Numpy 数组切片语法:darksub = img[0] - dark[0]。 否则在上面的示例中,它将生成并保存 (1024,1024,1) 图像。

【讨论】:

请注意,此方法从 FITS 文件中提取数据并丢弃标头信息。数据(数组)和标头(一组键值对)之间的区别是您无法直接对 FITS 文件执行操作的部分原因。

以上是关于有没有办法在 Python 中对 FITS 文件使用算术运算?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中对 subprocess.PIPE 进行非阻塞读取

在 Python 中对 subprocess.PIPE 进行非阻塞读取

在 Python 中对 subprocess.PIPE 进行非阻塞读取

如何在python中对没有标题的大型csv信号文件进行分类?

有没有办法在 Python 中对 1900 年之前的日期使用类似 strftime 的函数?

有没有办法根据小数位在python中对数组/列表的值进行动态分组?