如何创建单文件形式的RGB HEALPix FITS图像?
如何创建单文件形式的RGB HEALPix FITS图像?
我懂你这种需求!每次打开三个FITS文件调RGB确实麻烦,能把三个HEALPix RGB通道塞进单个FITS文件里,用ds9一键打开才是理想状态对吧?之前healpy的write_map只能分开存单通道,确实不给力,我来给你分享两个亲测可行的方案,分别对应你提到的ds9 -rgbimage和-rgbcube两种打开方式~
方案一:生成多扩展FITS文件(对应ds9 -rgbimage)
这种方式是把红、绿、蓝三个HEALPix通道分别作为FITS文件里的独立图像扩展,ds9的-rgbimage参数会自动识别这三个扩展并映射到RGB通道。
核心思路是绕开healpy的write_map,用更灵活的astropy.io.fits手动构建FITS文件,同时保留HEALPix的关键元数据(比如NSIDE、采样顺序),这样ds9才能正确识别它是HEALPix格式的图像。
代码实现
from astropy.io import fits import numpy as np from pathlib import Path def save_rgb_healpix_as_multiext(healpix_map: np.ndarray, output_path: Path) -> None: # 初始化FITS的HDU列表 hdus = fits.HDUList() # 配置HEALPix关键元数据(和你之前用的参数对应) nside = 1024 # 你使用的nside值,也可以动态计算:int(np.sqrt(healpix_map.shape[0] // 12)) base_hdr = fits.Header() base_hdr['NSIDE'] = nside base_hdr['ORDERING'] = 'NESTED' # 和你之前的nest=True保持一致 base_hdr['PIXTYPE'] = 'HEALPIX' # 逐个添加RGB通道为独立的图像扩展 for channel_idx, channel_name in enumerate(["RED", "GREEN", "BLUE"]): # 复制基础表头并添加通道名称标识 channel_hdr = base_hdr.copy() channel_hdr['EXTNAME'] = channel_name # 创建当前通道的图像HDU channel_hdu = fits.ImageHDU(data=healpix_map[:, channel_idx], header=channel_hdr) hdus.append(channel_hdu) # 写入文件 hdus.writeto(output_path, overwrite=True) print(f"多扩展RGB HEALPix文件已保存到:{output_path}")
使用这个函数生成文件后,直接用你想要的命令打开即可:
ds9 -rgbimage rgb_multiext.fits
方案二:生成数据立方体FITS文件(对应ds9 -rgbcube)
如果更习惯用ds9的-rgbcube参数,我们可以把三个RGB通道堆叠成一个3D数据立方体,塞进单个FITS的主HDU里。同样要注意保留HEALPix的元数据,确保ds9能正确解析。
代码实现
from astropy.io import fits import numpy as np from pathlib import Path def save_rgb_healpix_as_cube(healpix_map: np.ndarray, output_path: Path) -> None: # 将(N,3)的原数组转置为(3,N)的立方体结构 cube_data = healpix_map.T # 配置HEALPix关键元数据 nside = 1024 hdr = fits.Header() hdr['NSIDE'] = nside hdr['ORDERING'] = 'NESTED' hdr['PIXTYPE'] = 'HEALPIX' # 标注数据立方体的维度信息 hdr['NAXIS'] = 2 hdr['NAXIS1'] = cube_data.shape[1] # 像素总数 hdr['NAXIS2'] = cube_data.shape[0] # 通道数(3) # 创建主HDU并写入文件 primary_hdu = fits.PrimaryHDU(data=cube_data, header=hdr) hdus = fits.HDUList([primary_hdu]) hdus.writeto(output_path, overwrite=True) print(f"RGB HEALPix数据立方体已保存到:{output_path}")
生成文件后,用以下命令打开:
ds9 -rgbcube rgb_cube.fits
关键注意事项
- 必须保留HEALPix元数据:NSIDE、ORDERING、PIXTYPE这三个关键字是必须的,少了的话ds9会把文件当成普通的2D图像/立方体,无法正确渲染HEALPix投影。
- astropy是核心工具:healpy的
write_map确实不支持多通道数据,所以直接用astropy操作FITS的HDU结构是最可靠的方式,自由度更高。 - 测试文件结构:写完文件后可以用
fitsinfo命令检查结构,确认多扩展文件有三个IMAGE HDU,立方体文件是2D的3行数据(对应三个通道)。
内容来源于stack exchange




