如何简便对存在像素饱和截断的闪光图像进行二维高斯拟合求解?
饱和截断闪光图像的二维高斯拟合恢复方案

astropy.convolution.interpolate_replace_nans得到的替换值低于255的核心原因是:该函数属于邻域插值算法,仅能在现有有效观测值的范围内做内插计算,不会对分布的趋势做外推,自然无法输出超过255的饱和区真实估计值。
你可以直接基于astropy.modeling模块的内置二维高斯模型完成拟合,仅用非饱和值参与计算即可外推得到饱和区的理论值,具体步骤如下:
1. 数据预处理
- 遍历原始图像数组,将所有像素值>=255的位置标记为无效值(设为
NaN),仅保留像素值<255的有效数据参与拟合,避免截断的饱和值拉低高斯峰值的拟合结果 - 若图像存在稳定的全局背景,可先统计非闪光区域的平均背景值,从所有有效像素中扣除背景,进一步提升拟合精度
2. 二维高斯拟合实现
无需手动推导最小二乘公式,直接调用astropy内置的模型和拟合器即可,示例代码如下:
import numpy as np from astropy.modeling import models, fitting # 读取原始图像,img为二维numpy数组 img = 待处理的图像数据 y_grid, x_grid = np.mgrid[:img.shape[0], :img.shape[1]] # 筛选非饱和的有效数据点 valid_mask = img < 255 x_valid = x_grid[valid_mask] y_valid = y_grid[valid_mask] z_valid = img[valid_mask] # 初始化二维高斯模型,可根据光斑实际情况调整初始参数 gauss_model_init = models.Gaussian2D( amplitude = np.max(z_valid), x_mean = np.mean(x_valid[z_valid == np.max(z_valid)]), y_mean = np.mean(y_valid[z_valid == np.max(z_valid)]), x_stddev = 8, # 按光斑实际尺寸调整初始值 y_stddev = 8, bounds = {"amplitude": (200, 1500)} # 限制振幅合理范围,避免拟合发散 ) # 执行拟合 fitter = fitting.LevMarLSQFitter() gauss_fit_result = fitter(gauss_model_init, x_valid, y_valid, z_valid)
3. 重构饱和区域像素值
用拟合得到的高斯模型计算所有像素位置的理论值,即为恢复后的图像:
# 计算全图所有位置的高斯理论值 img_recovered = gauss_fit_result(x_grid, y_grid) # 可选:非饱和区域保留原始观测值,仅替换饱和区域 img_recovered[valid_mask] = img[valid_mask]
注意事项
- 若光斑存在明显的非对称特征,可放开
Gaussian2D的theta参数(旋转角)的默认固定设置,允许模型拟合倾斜的高斯分布 - 拟合完成后可先输出
gauss_fit_result.amplitude值,确认高斯峰值高于255符合预期,若结果偏差大可调整初始参数或参数的约束范围
内容的提问来源于stack exchange,提问作者djs22
相关产品推荐
相关产品推荐

