处理前后FITS文件的大小不同

时间:2015-07-22 13:15:45

标签: python pyfits

处理后我的文件大小有问题...我编写了创建编辑图像的脚本...(从原始图像数据中扣除平场图像数据和暗图像数据)...这是代码Convert float NumPy array to big endian我的问题是......在开始时,我有一个大小为2.8MiB且类型为> 2i的文件...处理后我有11MiB适合文件并输入float64,我不知道为什么? 在IDL中有一些修复方法http://www.exelisvis.com/docs/FIX.html。在Python中,我使用imgg = imgg.astype(np.int16,copy = False)。因此,我获得了2.8MiB的图像文件,但只有白色和黑色......

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

来自http://docs.astropy.org/en/stable/io/fits/appendix/faq.html#why-is-an-image-containing-integer-data-being-converted-unexpectedly-to-floats

如果图像的标题包含可选BSCALE和/或BZERO关键字的非平凡值(即BSCALE!= 1和/或BZERO!= 0),则必须重新调整文件中的原始数据根据公式得出其物理值:

physical_value = BZERO + BSCALE * array_value

由于BZERO和BSCALE是浮点值,因此结果值也必须是浮点值。如果原始值是16位整数,则结果值是单精度(32位)浮点数。如果原始值为32位整数,则结果值为双精度(64位浮点数)。

如果您不期望它,这种自动缩放很容易让您感到警惕,因为直到访问HDU的数据部分才会发生这种情况(允许更新标题而不重新调整数据)。例如:

>>> hdul = fits.open('scaled.fits')
>>> image = hdul['SCI', 1]
>>> image.header['BITPIX']
32
>>> image.header['BSCALE']
2.0
>>> data = image.data  # Read the data into memory
>>> data.dtype
dtype('float64')  # Got float64 despite BITPIX = 32 (32-bit int)
>>> image.header['BITPIX']  # The BITPIX will automatically update too
-64
>>> 'BSCALE' in image.header  # And the BSCALE keyword removed
False

这样做的原因是,一旦用户访问数据,他们也可以操纵它并对其执行计算。如果数据被强制保持为整数,则会丢失很多精度。因此,最好是在不丢失数据的情况下犯错,但最初会造成一些混乱。

如果在保存之前必须将数据返回到整数,请使用ImageHDU.scale方法:

>>> image.scale('int32')
>>> image.header['BITPIX']
32

或者,如果使用mode ='update'打开文件以及scale_back = True参数,原始BSCALE和BZERO缩放将在保存之前自动重新应用于数据。通常这是不可取的,尤其是在从浮点转换回无符号整数值时。但是,在需要根据物理值的变化修改原始数据的情况下,这可能很有用。

为了防止发生重新缩放(适用于更新标头 - 即使您不打算让代码访问数据,也可以在这里谨慎行事),在打开时使用do_not_scale_image_data参数文件:

>>> hdul = fits.open('scaled.fits', do_not_scale_image_data=True)
>>> image = hdul['SCI', 1]
>>> image.data.dtype
dtype('int32')