Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 天文图像校准:使用ccdproc的索引问题_Python_Image Processing_Indexing_Astronomy_Ccdproc - Fatal编程技术网

Python 天文图像校准:使用ccdproc的索引问题

Python 天文图像校准:使用ccdproc的索引问题,python,image-processing,indexing,astronomy,ccdproc,Python,Image Processing,Indexing,Astronomy,Ccdproc,我似乎对使用python包ccdproc进行一些基本的天文图像处理/校准有问题 我目前正在将30个偏移帧编译成一幅平均分量帧的图像。在进行组合之前,我迭代每个图像,以便使用subtract\u overscan()减去过扫描区域,然后使用trim\u image()选择要保留的图像尺寸 我想我的索引是正确的,但是当我使用组合时,它需要非常长的时间(超过几个小时)。我不确定这是否正常。我怀疑我的电脑可能误解了什么。我以前在没有任何其他处理的情况下创建了平均图像,并且没有花很长时间(5-10分钟左右

我似乎对使用python包
ccdproc
进行一些基本的天文图像处理/校准有问题

我目前正在将30个偏移帧编译成一幅平均分量帧的图像。在进行组合之前,我迭代每个图像,以便使用
subtract\u overscan()
减去过扫描区域,然后使用
trim\u image()
选择要保留的图像尺寸

我想我的索引是正确的,但是当我使用组合时,它需要非常长的时间(超过几个小时)。我不确定这是否正常。我怀疑我的电脑可能误解了什么。我以前在没有任何其他处理的情况下创建了平均图像,并且没有花很长时间(5-10分钟左右),这就是为什么我认为这可能是我的索引问题

如果有人能验证我的代码是否正确和/或对可能出现的问题进行评论,那将是非常有帮助的

图像尺寸:NAXIS1=3128,NAXIS2=3080和
allfiles
是一个
ccdproc.ImageFileCollection

from astropy.io import fits
import ccdproc as cp

biasImages = []
for filename in allfiles.files_filtered(NAXIS1=3128,NAXIS2=3080,OBSTYPE = 'BIAS'):
    ccd = fits.getdata(allfiles.location + filename)
    # print(ccd)
    ccd = cp.CCDData(ccd, unit = u.adu)
    # print(ccd)
    ccd = cp.subtract_overscan(ccd,overscan_axis = 1, fits_section = '[3099:3124,:]')
    # print(ccd)
    ccd = cp.trim_image(ccd,fits_section = '[27:3095,3:3078]')
    # print(ccd)
    biasImages.append(ccd)

master_bias = cp.combine(biasImages,output_file = path + 'mbias_avg.fits', method='average')

该代码看起来类似于我自己的代码,用于将偏见组合在一起(参见此),因此没有任何东西会立即显示为红色标志。我很少做这么多的偏差,而ccdproc.combine任务可以优化得多,所以我并不奇怪它非常慢

我有时会遇到的一件事是垃圾收集的问题。所以,如果您在笔记本或大型脚本的一部分中运行此操作,则可能存在内存未清除的问题。查看内存中发生了什么是很有用的,我有时会删除biasImages对象(或其他ccd对象列表),在它被使用之后,就不再需要它了


我很高兴在这里进一步回应,或者如果您有进一步的问题,请在github repo上打开一个问题

如果您只是在寻找解决方案,请跳到本答案的末尾,但如果您感兴趣,请(可能)不要跳到前面

这需要非常长的时间(超过几个小时)

看起来你的内存用完了,然后你的电脑开始使用。这意味着它将在硬盘上保存部分(或全部)对象,并将它们从RAM中删除,以便在需要时再次加载它们。在某些情况下,交换内存可能非常有效,因为它很少需要从硬盘重新加载,但在某些情况下,它必须重新加载很多次,然后您会注意到“整个系统变慢”和“永无止境的操作”

经过一些调查,我认为问题主要是因为
ccdproc.combine
创建的
numpy.array
沿第一轴,而。如果第一个轴是FORTRAN连续数组,但是
ccdproc
,那么它将是C连续的,那么第一个轴就很好了。这意味着最后一个轴上的元素彼此相邻地存储在内存中(如果是)。因此,如果RAM耗尽,计算机开始使用交换内存,它会将阵列的一部分放在磁盘上,但由于操作是沿着第一个轴执行的,因此每次操作中使用的元素的内存地址“彼此相距很远”。这意味着它不能以一种有用的方式利用交换内存,因为它基本上必须为“每个”下一项从硬盘重新加载阵列的一部分

知道这一点并不重要,事实上,我只是把它包括在内,以防你对观察到的行为战争的原因感兴趣。需要注意的要点是,如果您注意到,如果您运行任何程序,系统会变得非常慢,而且似乎没有取得多大进展,那是因为您的RAM已经用完了


最简单的解决方案(尽管与编程无关)是购买更多的RAM

复杂的解决方案是减少程序的内存占用


让我们先做一个小计算,计算我们要处理多少内存:

您的图像是
3128*3080
9634240
元素。当您读取它们时,它们可能是任何类型,但当您使用
ccdproc.subtract\u overscan
时,它们将在以后成为
float
s。一个浮点(实际上是
np.float64
)使用8个字节,所以我们要处理
77073920
字节。这大约是每一张73MB的偏压图像。你有30个偏倚图像,所以我们在这里处理大约2.2GB的数据。这是假设您的图像没有
不确定性
遮罩
。如果他们有,将增加2.2 GB的不确定性或0.26 GB的遮罩

2.2 GB听起来是一个足够小的数字,但是
ccdproc.combine
堆叠NumPy阵列。这意味着它将创建一个新阵列,并将
ccd
s的数据复制到新阵列中。这将使内存加倍。堆叠它们是有意义的,因为即使它需要更多的内存,但当它真正进行“组合”时,速度会快得多,但它还没有出现

总而言之,4.4GB可能已经耗尽了内存。有些计算机只有4GB内存,别忘了你的操作系统和其他程序也需要一些内存。然而,如果你有8GB或更多的内存,你就不太可能耗尽内存,但是根据数字和你的观察,我假设你只有4-6GB的内存


有趣的问题实际上是如何避免这个问题。这实际上取决于您拥有的内存量:

小于4GB内存 这很棘手,因为扣除所有
CCDData
对象的大小以及操作系统和其他进程所需的内容后,您将没有多少可用RAM。在这种情况下,最好一次处理例如5个偏压图像,然后合并分析结果
biasImages = []
biasImagesCombined = []
for idx, filename in enumerate(allfiles.files_filtered(NAXIS1=3128,NAXIS2=3080,OBSTYPE = 'BIAS')):
    ccd = fits.getdata(allfiles.location + filename)
    ccd = cp.CCDData(ccd, unit = u.adu)
    ccd = cp.subtract_overscan(ccd,overscan_axis = 1, fits_section = '[3099:3124,:]')
    ccd = cp.trim_image(ccd,fits_section = '[27:3095,3:3078]')
    biasImages.append(ccd)
    # Combine every 5 bias images. This only works correctly if the amount of
    # images is a multiple of 5 and you use average as combine-method.
    if (idx + 1) % 5 == 0:
        tmp_bias = cp.combine(biasImages, method='average')
        biasImages = []
        biasImagesCombined.append(tmp_bias)

master_bias = cp.combine(biasImagesCombined, output_file = path + 'mbias_avg.fits', method='average')
# To account for additional memory usage I chose 100 MB of additional memory
# you could try to adapt the actual number.
master_bias = cp.combine(biasImages, mem_limit=1024*1024*100, ioutput_file=path + 'mbias_avg.fits', method='average')