我有闪光灯的图像数据,其中一些像素在闪光灯的中心达到了 255。为了对像素的假设像素值进行建模,将 2D 高斯拟合到不在 255 的数据的最佳方法是什么。
我一直在玩astropy.convolution
, 和interpolate_replace_nans
函数,但这总是返回低于 255 的值,而不是高于 255 的预期值。
数据的表面图明显遵循单一的高斯形状,顶部被截断;有没有一种简单的方法来计算高斯的参数来重建应该是什么值?
我有闪光灯的图像数据,其中一些像素在闪光灯的中心达到了 255。为了对像素的假设像素值进行建模,将 2D 高斯拟合到不在 255 的数据的最佳方法是什么。
我一直在玩astropy.convolution
, 和interpolate_replace_nans
函数,但这总是返回低于 255 的值,而不是高于 255 的预期值。
数据的表面图明显遵循单一的高斯形状,顶部被截断;有没有一种简单的方法来计算高斯的参数来重建应该是什么值?
可以对饱和高斯进行建模,用模型拟合数据,用拟合参数恢复原始高斯。
这是一个例子:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from numba import njit
@njit
def get_model(mu_x, mu_y, sig_x, sig_y, amp, cutoff, image_size):
"""
simulate a 2D gaussian were the value higher than cutoff
were saturated.
"""
dom_x = -1 / 2 / sig_x ** 2
dom_y = -1 / 2 / sig_y ** 2
result = np.empty(image_size)
for x in range(image_size[0]):
for y in range(image_size[1]):
gx = (x - mu_x)**2 * dom_x
gy = (y - mu_y)**2 * dom_y
g = amp * np.exp(gx + gy)
g = min(g, cutoff)
result[x, y] = g
return result
def cost(args, data):
model = get_model(*args, data.shape)
return np.power(model - data, 2).sum()
img = get_model(25, 25, 10, 5, 300, 255, (70, 70))
result = minimize(
cost, x0=(25, 25, 1, 1, 255, 255),
args=(img)
)
fit = get_model(*result.x, img.shape)
gauss = get_model(
*result.x[:-1],
cutoff=np.inf, # set cutoff to inf == no saturation
image_size=img.shape
)
plt.figure(figsize=(10, 4))
plt.subplot(131).imshow(img, vmin=0, vmax=300)
plt.title("data")
plt.subplot(132).imshow(fit, vmin=0, vmax=300)
plt.title("fitting result")
plt.subplot(133).imshow(gauss, vmin=0, vmax=300)
plt.title("gaussian from fit")
plt.tight_layout()
plt.show()