FITS图像阵列像素超出范围

时间:2015-06-16 03:43:22

标签: python image fits astropy

我正在尝试使用以下代码为FITS文件中的像素设置阈值。但是,我收到的错误是:

IndexError: Index 2620 is out of bounds for axis 0 with size 2620

有关如何解决此问题的任何想法?

这是代码:

from astropy.io import fits
import numpy as np
hdulist = fits.open("12ratio.fits")
origImData = hdulist[0].data
newImData = origImData*0

for x, y in np.nditer(origImData.shape):
        curPixel = origImData[x, y]
        if curPixel > 0.28 or curPixel < 3.11:
                newImData[x, y] = curPixel
        else:
                newImData[x, y] = 0
newhdu = fits.PrimaryHDU(newImData)
newhdulist = fits.HDUList([newhdu])
newhdulist.writeto('modifiedratio12.fits')

1 个答案:

答案 0 :(得分:1)

问题是你的迭代方案。您正在迭代数组的 shape ,而不是像素索引。

一般来说,有一种更好的屏蔽方法:

mask = (origImData > 0.28) & (origImData < 3.11)
newImData[mask] = origImData[mask]

将实现您的目标。

或同样有效:

from astropy.io import fits
import numpy as np
hdulist = fits.open("12ratio.fits")
origImData = hdulist[0].data
mask = (origImData > 0.28) & (origImData < 3.11)
origImData[~mask] = 0

newhdu = fits.PrimaryHDU(data=origImData, header=hdulist[0].header)
newhdu.writeto('modifiedratio12.fits')

这里我使用了numpy数组boolean not操作(~)来反转掩码。我也跳过了HDUList,因为单扩展FITS文件不需要。{/ p>

您显示的代码中有两个错误:

for x, y in np.nditer(origImData.shape):

xy分配origImData.shape的值,即x=2640y=(something else)不会分配它们您想要的值0,1,...,2640

比较操作:

    if curPixel > 0.28 or curPixel < 3.11:

对于实数始终为真:所有数字都大于0.28或小于3.11。