强度图的正确曲线拟合

问题描述 投票:0回答:1

我正在通过分析强度值的直方图来进行图像分析。 我得到了类似的图(按特定顺序有 2 个尖峰和 1 个平峰)。

我尝试使用混合高斯对其进行建模,但结果并不好。我已附上图像以供参考。经过BIC Scores分析,我发现拐点是当我将高斯数设置为4时。

在尝试的 5 个案例中,以下 2 个取得了良好的结果:

Correct 1

Correct 2

但是,以下 3 项的结果是不正确的:

Misfit 1

Misfit 2

Misfit 3

是否有替代/更好的方法来近似曲线?

我尝试更改高斯参数,或通过在图像上应用平均滤波器然后绘制图来抑制强度清晰度。还是没有帮助。

我尝试了以下方法: n 个检测到的峰和不同强度的曲线拟合

我正在寻找 3 条不同的曲线,一条用于最后出现的两个峰值,一条用于开始时的平台状部分,也许 1 条曲线用于其他噪声的高方差和低权重。

任何使用传统 CV 方法或机器学习方法的解决方案都是最受欢迎的。

编辑: 直方图来源 我正在分析从 3D CT 扫描图像上的分割模型分割肠道后生成的直方图。对于近 100 张图像,我通过手动检查得到了类似的曲线。 第一个平台是脂肪,前面的第一个峰值是内容物的分布,再下一个峰值是肠壁的分布。 X 轴代表 HU(猎犬场单位)值的线性函数。

python image-processing signal-processing curve-fitting gaussian-mixture-model
1个回答
0
投票

我想建议使用高斯过程回归来解决这个问题。

我尝试生成下面的数据样本(一个 2D NumPy 数组,两列,N 行): enter image description here

下面提供了使用 RBF 内核运行高斯过程回归的代码:

def main() -> None:

    t = data[:, 0].reshape(-1, 1)
    u = data[:, 1].reshape(-1, 1)

    gp_regressor = train_gaussian_process(t, u)
    x = np.linspace(min(t), max(t), 400).reshape(-1, 1)
    mean = gp_regressor.predict(x)

    plt.figure(figsize=(14, 6))
    plt.scatter(t, u, label="Observations", s=0.1)
    plt.plot(x, mean, linewidth=1.2)
    plt.show()


def train_gaussian_process(x: np.ndarray, y: np.ndarray) -> GaussianProcessRegressor:
    """
    Train Gaussian Process.

    Parameters
    ----------
    x : np.ndarray
    y : np.ndarray

    Returns
    -------
    GaussianProcessRegressor

    """
    kernel = RBF(length_scale=0.2)
    gaussian_process = GaussianProcessRegressor(
        kernel=kernel, alpha=1e-2, n_restarts_optimizer=9, random_state=42
    )
    gaussian_process.fit(x, y)
    return gaussian_process


if __name__ == "__main__":
    main()

这是结果(你必须微调参数):

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.