python PIL不显示FITS文件

ngynwnxp  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(150)

我将开始这篇文章说,虽然我可以编码一点,我不是超级擅长它,所以道歉,如果答案真的很明显,我没有看到它。
我有一系列的.fits文件,我需要通过PIL可视化。我想用一种简单的方式来做,只需要使用PIL支持FITS。
所使用的图像来自WISE数据库中的M1星云。
当我尝试运行下面的代码时,我得到的只是一个颗粒状的图像:

  1. from PIL import Image
  2. fits_file = Image.open('image.fits')
  3. fits_file.show()

字符串
如果我尝试通过Astropy Fits模块来读取它,它有时会返回正确的图像,有时会返回白色图像(我相信这是由于min/max超过255)。

  1. from astropy.io import fits
  2. from PIL import Image
  3. fits_file = fits.open('image.fits')
  4. fits_img = fits_file[0].data
  5. pil_img = Image.fromarray(fits_img)
  6. pil_img.show()


我是否错过了一些东西,为什么我不能让所有的图像都正确地可视化?
编辑:我决定提供我的代码得到的图像。
第一个代码块显示以下图像:x1c 0d1x
第二个代码块显示以下图像:

原始图像由astropy + matplotlib可视化:

编辑2:根据评论中提供的链接,我将第二个代码更改为:

  1. from astropy.io import fits
  2. from PIL import Image
  3. fits_file = fits.open('image.fits')
  4. fits_img = fits_file[0].data
  5. pil_img = Image.fromarray(fits_img, mode="F")
  6. pil_img.show()


这将返回与第一个代码相同的图像。

o0lyfsai

o0lyfsai1#

我认为PIL有一个错误,并以错误的字节顺序读取FITS文件。如果我打开文件,转换为Numpy数组,交换字节顺序以适应错误,然后缩放并保存为PNG,它工作正常:

  1. #!/usr/bin/env python3
  2. import numpy as np
  3. from PIL import Image
  4. # Oopen sample FITS image and convert to Numpy array
  5. im = Image.open('sample.fits')
  6. na = np.array(im)
  7. # BYTESWAP FOR SOME UNKNOWN REASON
  8. nb = na.byteswap()
  9. # Scale data to range 0..65535 so we can see it
  10. nc = (nb - nb.min()) * 65535/(nb.max() - nb.min())
  11. # Save as 16-bit PNG
  12. Image.fromarray(nc.astype(np.uint16)).save('result.png')

字符串


的数据

展开查看全部

相关问题