极致优化:Python 实战教你高效转换 FITS 图像并精确标注坐标
前言
FITS(Flexible Image Transport System)是天文学中常用的数据格式,保存了大量的观测数据。传统软件如 SAOImage DS9 能够直观显示 FITS 图像,但在大规模数据处理和自动化任务中,使用 Python 编程可以实现更加灵活高效的图像处理工作流程。本文示例代码中主要使用了以下工具:
- astropy.io.fits:读取 FITS 数据
- astropy.visualization.ZScaleInterval:智能拉伸图像对比度
- matplotlib:图像渲染与保存
同时,我们在图像上添加彩色圆圈标注目标点,方便后续分析与比对。
安装相关依赖
在开始之前,请确保安装了以下 Python 包:
1 | pip install numpy matplotlib astropy pillow |
这些包分别用于数值计算、图像绘制、FITS 数据处理以及图片后处理。
完整代码
下面是完整的代码示例,该代码读取 FITS 文件,使用 ZScaleInterval 自动调整亮度区间,并在指定坐标位置添加彩色圆圈标注,最终保存为 PNG 图片:
1 | # -*- coding: utf-8 -*- |

优化技巧
为了提升整体处理速度和运行效率,我们可以从以下几个方面进行优化:
1. 使用内存映射(Memory Mapping)读取 FITS 文件
对于大型 FITS 文件,可以使用 memmap=True 进行内存映射,以加快数据读取速度。
1 | with fits.open(fits_file, memmap=True) as hdul: |
但是有时会出现如下错误:
1 | ValueError: Cannot load a memory-mapped image: BZERO/BSCALE/BLANK header keywords present. Set memmap=False |
原因:
某些 FITS 文件包含 BZERO、BSCALE 或 BLANK 关键字,这会影响数据的内存映射方式,导致无法正常加载。
解决方案:
在遇到该问题时,直接设置 memmap=False或者不添加memmap参数, 默认就是False,即不启用内存映射:
1 | with fits.open(fits_file, memmap=False) as hdul: |
这样可以保证数据正确加载,虽然可能牺牲部分加载速度,但避免了内存映射带来的兼容性问题。
2. 下采样计算亮度区间
使用 ZScaleInterval 计算 vmin 和 vmax 时,对数据进行下采样(例如采样每隔 4 个像素),可以减少计算量:
1 | vmin, vmax = interval.get_limits(data[::4, ::4]) |
3. 关闭插值加速渲染
在 imshow 中设置 interpolation='none' 可关闭插值计算,从而加快渲染速度:
1 | ax.imshow(data, cmap='gray', origin='lower', vmin=vmin, vmax=vmax, interpolation='none') |
4. 合理调整 dpi 以加速图片保存
如果对图像分辨率要求不高,可以适当降低 dpi 参数,从而缩短保存时间。例如:
1 | plt.savefig(output_file, dpi=150, bbox_inches='tight', pad_inches=-0.1) |
降低 dpi 后,保存速度会更快,但需权衡分辨率和速度的关系。
拓展
Mac上安装 SAOImage DS9
1 | brew install --cask saoimageds9 |
最后
本文详细介绍了如何使用 Python 将 FITS 图像转换为常用格式,并在图像上添加彩色圆圈进行精确标注。同时,我们分享了多种提升处理速度的优化策略,包括内存映射优化、下采样计算、关闭插值以及合理调整 dpi。希望这篇文章能为你在天文图像数据处理方面提供帮助和启发!
欢迎大家留言讨论,分享你的优化经验和心得。关注我们,获取更多天文数据处理与 Python 编程的干货分享!
最近文章