使用 astropy 有效地获取 Python 中的图像中点

Efficiently get midpoint of image in Python with astropy

我的数据以 table 格式组织(example.fits)。我使用 Python 模块 atpy 打开这个 table ('mappars')。 table 有 x,y 列,它们是图像坐标和数据列 z。 x,y 均匀分布(CCD 检测器上的事件),但它们之间有间隙。

我像这样获取图像中间的值:

import atpy
import numpy as np

mappars = atpy.Table('example.fits')
#get midpoint value
midx = np.int((np.max(mappars['x'])+np.min(mappars['x']))/2)
midy = np.int((np.max(mappars['y'])+np.min(mappars['y']))/2)
midist = mappars.where((mappars.x == midx) & (mappars.y == midy)['z']

是否有更有效的方法(不包含 atpy 的 .where 函数)? 还有一个函数对应于 astropy.table 中的 .where 因为我想从 atpy 移动到 astropy?

您应该能够使用 astropy.ionumpy 非常相似地执行此操作。我没有方便的事件文件,但类似:

从 astropy.io 导入适合 将 numpy 导入为 np

with fits.open("example.fits") as hdulist:
    events = hdulist[1].data   # since hdu 0 should be an ImageHDU type, the events are probably in the first extension
    midx = np.int((np.max(events['x'])+np.min(events['x']))/2)
    midy = np.int((np.max(events['y'])+np.min(events['y']))/2)
    midist = events['z'][(events['x'] == midx) & (events['y'] == midy)]

在这种情况下,我直接使用布尔 (numpy) 表达式 events['x'] == midx) & (events['y'] == midy).

创建一个布尔索引数组 events['z']

请注意,这是未经测试的;如果上面的方法对你来说失败了,我可能会尝试从互联网上的某个地方提取一个事件文件来测试它,当然除非你的事件文件是特殊的。


顺便说一下,如果 xy 整数 像素坐标,您可以使用纯整数除法使事情稍微简单一些并跳过转换为 int:

midx = (np.max(events['x'])+np.min(events['x']))//2
midy = (np.max(events['y'])+np.min(events['y']))//2

这直接适用于 Python 3,如果你有 from __future__ import division,则适用于 Python 2(无论如何你都应该这样做)。