在 Matlab 中,如何划分多元高斯分布以分离高斯分布?

Sim*_*ing 5 matlab image-processing gaussian

我在直方图中有一个具有多元高斯分布的图像。我想将图像分割为两个区域,以便它们都可以遵循正态分布,如直方图中显示的红色和蓝色曲线。我知道高斯混合模型可能适用于此。我尝试使用 fitgmdist 函数,然后将两部分聚类,但仍然无法正常工作。任何建议将不胜感激。 在此处输入图片说明在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

下面是我的方法的 Matlab 代码。

% Read Image
I = imread('demo.png');
I = rgb2gray(I);
data = I(:);

% Fit a gaussian mixture model
obj = fitgmdist(data,2);
idx = cluster(obj,data);
cluster1 = data(idx == 1,:);
cluster2 = data(idx == 2,:);

% Display Histogram
histogram(cluster1)
histogram(cluster2)
Run Code Online (Sandbox Code Playgroud)

Bre*_*ick 5

你的解决方案是正确的

您显示直方图的方式不能很好地代表检测到的分布。

  1. 归一化 bin 大小,因为histogram是频率计数
  2. 使轴限制一致(或在同一轴上绘制)

这两个小的变化表明您实际上获得了非常好的分布拟合。

histogram(cluster1,0:.01:1); hold on;
histogram(cluster2,0:.01:1);
Run Code Online (Sandbox Code Playgroud)

历史记录

为每个簇重新拟合高斯曲线

如果您将集群视为独立分布,则一旦您拥有集群,您就可以平滑两个分布合并的尾部。

gcluster1 = fitdist(cluster1,'Normal');
gcluster2 = fitdist(cluster2,'Normal');

x_values = 0:.01:1;
y1 = pdf(gcluster1,x_values);
y2 = pdf(gcluster2,x_values);
plot(x_values,y1);hold on;
plot(x_values,y2);
Run Code Online (Sandbox Code Playgroud)

高斯