-1

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

请问有什么建议吗?

4

1 回答 1

1

来自http://docs.astropy.org/en/stable/io/fits/appendix/faq.html#why-is-an-image- contains-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')
于 2015-07-22T14:55:44.677 回答