我正在通过分析强度值的直方图来进行图像分析。 我得到了类似的图(按特定顺序有 2 个尖峰和 1 个平峰)。
我尝试使用混合高斯对其进行建模,但结果并不好。我已附上图像以供参考。经过BIC Scores分析,我发现拐点是当我将高斯数设置为4时。
在尝试的 5 个案例中,以下 2 个取得了良好的结果:
但是,以下 3 项的结果是不正确的:
是否有替代/更好的方法来近似曲线?
我尝试更改高斯参数,或通过在图像上应用平均滤波器然后绘制图来抑制强度清晰度。还是没有帮助。
我尝试了以下方法: n 个检测到的峰和不同强度的曲线拟合
我正在寻找 3 条不同的曲线,一条用于最后出现的两个峰值,一条用于开始时的平台状部分,也许 1 条曲线用于其他噪声的高方差和低权重。
任何使用传统 CV 方法或机器学习方法的解决方案都是最受欢迎的。
编辑: 直方图来源 我正在分析从 3D CT 扫描图像上的分割模型分割肠道后生成的直方图。对于近 100 张图像,我通过手动检查得到了类似的曲线。 第一个平台是脂肪,前面的第一个峰值是内容物的分布,再下一个峰值是肠壁的分布。 X 轴代表 HU(猎犬场单位)值的线性函数。
我想建议使用高斯过程回归来解决这个问题。
我尝试生成下面的数据样本(一个 2D NumPy 数组,两列,N 行):
下面提供了使用 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()
这是结果(你必须微调参数):