在Matlab中,如何将多元高斯分布划分为单独的高斯分布?

时间:2017-06-21 17:00:01

标签: matlab image-processing gaussian

我在直方图中有一个多变量高斯分布的图像。我想将图像分割成两个区域,这样它们都可以跟随正态分布,如直方图中显示的红色和蓝色曲线。我知道高斯混合模型可能适用于此。我尝试使用fitgmdist函数然后聚类这两个部分,但仍然不能正常工作。任何建议将不胜感激。 enter image description here enter image description here enter image description here enter image description here

以下是我的appraoch的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)

2 个答案:

答案 0 :(得分:4)

您的解决方案是正确的

显示直方图的方式不佳代表检测到的分布。

  1. 规范化二进制文件大小,因为histogram是频率计数
  2. 使轴限制一致(或在同一轴上绘图)
  3. 这两个小小的变化表明你实际上已经获得了相当不错的发行版。

    histogram(cluster1,0:.01:1); hold on;
    histogram(cluster2,0:.01:1);
    

    Hists

    将高斯曲线重新拟合到每个群集

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

    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);
    

    Gaussian

答案 1 :(得分:-2)

你是如何尝试使用这个'模型'的?如果数据是恒定的,那你为什么不测量两个高斯的平均值/方差呢?

如果你试图从这个混合分布中生成新值,那么你可以查看一个混合模型,其中给出了上述每个分布的权重。