如何将图像中的点源/恒星转换为NaN值?基于SExtractor坐标实现
基于SExtractor结果将恒星区域设为NaN的方法
核心思路
- 利用SExtractor输出的
FWHM_IMAGE(半高全宽)确定每颗恒星的覆盖像素范围,通常取2-3倍FWHM作为有效区域(可根据实际观测数据调整) - 对每张抖动图像,遍历每颗恒星,计算其覆盖的像素坐标范围,将范围内所有像素设为
NaN - 强制处理坐标边界,避免超出图像的行列索引范围引发错误
具体实现代码
假设dcals是存储9张抖动图像的数组(每张为2D数组),dse是对应每张图像的SExtractor结果列表:
import numpy as np # 遍历所有图像及对应恒星数据 for img_idx in range(len(dcals)): # 复制原图像,避免修改原始数据 processed_img = dcals[img_idx].copy() # 转换为浮点型,确保能存储NaN(若原图像是整数类型) processed_img = processed_img.astype(np.float64) star_list = dse[img_idx] img_h, img_w = processed_img.shape # 遍历当前图像中的每颗恒星 for star in star_list: # 获取恒星坐标与FWHM(注意:若SExtractor输出为1-based坐标,需减1转0-based) x = star['X_IMAGE'] - 1 # 若为0-based则去掉-1 y = star['Y_IMAGE'] - 1 fwhm = star['FWHM_IMAGE'] # 计算恒星覆盖区域的半宽,这里取2倍FWHM,可根据需求调整 half_size = int(np.round(fwhm * 2)) # 计算像素范围上下界,确保不超出图像边界 x_start = max(0, int(np.floor(x - half_size))) x_end = min(img_w - 1, int(np.ceil(x + half_size))) y_start = max(0, int(np.floor(y - half_size))) y_end = min(img_h - 1, int(np.ceil(y + half_size))) # 将区域内所有像素设为NaN processed_img[y_start:y_end+1, x_start:x_end+1] = np.nan # 替换原数组为处理后的图像,或存入新列表 dcals[img_idx] = processed_img # 验证处理结果:绘制第一张图查看恒星区域 import matplotlib.pyplot as plt plt.imshow(dcals[0], cmap='gray', vmin=0, vmax=255) plt.scatter([s['X_IMAGE']-1 for s in dse[0]], [s['Y_IMAGE']-1 for s in dse[0]], s=[(e['FWHM_IMAGE']/0.608)*2 for e in dse[0]], c='blue', marker='.') plt.show()
关键细节说明
- 坐标索引转换:SExtractor默认输出1-based像素坐标,而Python数组是0-based,必须做减1处理,否则坐标会偏移一个像素
- 区域系数调整:如果发现恒星边缘未被完全覆盖,可将
2调整为2.5或3;若想减少背景误覆盖,可降低系数至1.5 - 数据类型转换:整数类型数组无法存储
NaN,必须先转换为float64或float32类型
内容的提问来源于stack exchange,提问作者Ryan He
相关产品推荐
相关产品推荐

