0

我有闪光灯的图像数据,其中一些像素在闪光灯的中心达到了 255。为了对像素的假设像素值进行建模,将 2D 高斯拟合到不在 255 的数据的最佳方法是什么。

我一直在玩astropy.convolution, 和interpolate_replace_nans函数,但这总是返回低于 255 的值,而不是高于 255 的预期值。

数据的表面图
曲面图

数据的表面图明显遵循单一的高斯形状,顶部被截断;有没有一种简单的方法来计算高斯的参数来重建应该是什么值?

4

2 回答 2

0

如果屏蔽掉饱和的像素,则可以将2D 高斯模型拟合数据中。

屏蔽可以简单到不将坏数据传递给拟合器,因为拟合器期望接收 x,y 坐标和相应的 z 值。

(卷积方法在这里不正确;它永远不会返回大于原始数据中的值)

于 2021-11-07T00:42:41.127 回答
0

可以对饱和高斯进行建模,用模型拟合数据,用拟合参数恢复原始高斯。

这是一个例子:

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()
于 2021-11-07T01:41:20.660 回答