使用python将拟合文件中的低信号像素清零

时间:2015-03-07 16:43:09

标签: python fits astropy

我正在尝试编写一个简单的脚本,该脚本将在拟合图像文件中读取,将所有低于某个阈值的像素(我将根据背景统计信息输入)设置为零或南。我在下面包含了我正在使用的代码。这会写一个类似于原始文件的新拟合文件,但像素值似乎是重新缩放的(即,我希望新文件中的最小值是我指定的最小值,但事实并非如此)。我认为这是一个问题,我如何编写新文件的标题,但不知道如何解决它,并欢迎任何做过类似事情的天文学家的建议或片段。谢谢!

import astropy.io.fits as fits
import numpy as np

f=fits.open('filename.fits')
data = f[0].data
header = f[0].header
data[data<noise_cutoff]=np.nan
fits.writeto('outfilename.fits', data, header)
f.close()

1 个答案:

答案 0 :(得分:-1)

在python 2.7中,我总是这样做:

img[numpy.where(img<min_flux)]=0
img[numpy.where(img>0)]+=add_flux

看到区别:

这将返回满足条件的字段的实际值:

>>> data2[data2>noise_cutoff]
array([ 0.15600586,  0.15576172,  0.16992188, ...,  0.15063477,
        0.21899414,  0.15722656], dtype=float32)

返回条件返回True的索引:

>>> np.where(data2>noise_cutoff)
(array([   0,    0,    0, ..., 1488, 1488, 1488]), array([  88,  789, 1065, ..., 1683, 1833, 1872]))

你想将index的值设置为nan或0,我不知道第一个是如何被解释为,但根据经验,我知道它不起作用。

修改 我对处理nan值的FITS查看器也有不好的经验。通常人们会写一个拟合字段,即RANGE,它应该描述所有可能的值。我经常看到[0, 65535],但它主要是协议和数据类型(毕竟它是FITS格式)。

我也对发送索引和值之间的差异感到好奇,这就是我所做的:

首先显示一些默认值:

>>> data
array([[ 0.01800537,  0.00421143, -0.01644897, ..., -0.03686523,
         0.05981445, -0.00924683],
       [-0.00267029, -0.02334595,  0.03179932, ...,  0.09436035,
         0.05981445,  0.00457001],
       [-0.13354492, -0.0302124 , -0.00266266, ...,  0.05291748,
        -0.06445312,  0.09436035],
       ..., 
       [ 0.04669189, -0.02218628, -0.06347656, ..., -0.01507568,
         0.10229492,  0.02636719],
       [ 0.00536346, -0.00842285,  0.04669189, ..., -0.00816345,
         0.00565338, -0.02886963],
       [-0.07043457, -0.00840759, -0.09106445, ...,  0.06787109,
        -0.11865234, -0.05645752]], dtype=float32)

我制作了一份副本,因为我没有编辑我需要的原始文件,然后我采用了data2[data2>noise_cutoff]np.where(data2>noise_cutoff)并将结果复制了一段时间,并将其作为一个有效的表达式复制到了[ ]运营商。

>>> data2 = data.copy

# result of data2[data2>noise_cutoff]
>>> data2[[0.21899414,  0.15722656]]
array([[ 0.01800537,  0.00421143, -0.01644897, ..., -0.03686523,
         0.05981445, -0.00924683],
       [ 0.01800537,  0.00421143, -0.01644897, ..., -0.03686523,
         0.05981445, -0.00924683]], dtype=float32)

#result of np.where(data2>noise_cutoff)
>>> data2[[0,0, 0, 1488, 1488, 1488], [88,789,1065,1683,1833,1872]]
array([ 0.15600586,  0.15576172,  0.16992188,  0.15063477,  0.21899414,
        0.15722656], dtype=float32)

所以似乎numpy喜欢解包发送给[ ]的参数。例如,发送data2[[1, 2]]将返回data2的第一行和第二行。由于我发送了浮点值0.218994140.15722656,因此显然会将其转换为int s,向下舍入为0,并且第一行返回两次。

然后在data2[[1],[1]]中发送会在data[1,1]处返回一个浮点数。在这些返回的列表中发送一系列在这些索引处写入的值,即data2[[1,2], [1,2]]为您提供元素[1,1][2,2]

>>> data2[1,1] == data2[[1],[1]]
array([ True], dtype=bool)