我有来自MATLAB中图像的数据,我想将其分解为高斯混合.图像的计数和binLocations存储在256x2矩阵'X'中,fitgmdist(X,3)为三个高斯人提供参数.我想绘制这些高斯人并找到他们的交叉点.
我也有点困惑为什么混合模型中的'mu'等参数有两列.难道每个高斯都不应该有一个对应的意思吗?
我尝试使用pout.tif图像解决问题:
以下是情节:
这是代码:
I = imread('pout.tif'); imshow(I); [counts,binLocations] = imhist(I); subplot(3, 1, 1); stem(binLocations, counts, 'MarkerSize', 1 ); xlim([50 200]); X = I(:); options = statset('MaxIter', 300); % default value is 100. Sometimes too few to converge gm = gmdistribution.fit(double(X),3, 'Options', options); subplot(3, 1, 2); plot(binLocations, pdf(gm,binLocations)); xlim([50 200]); subplot(3, 1, 3); for j=1:3 line(binLocations,gm.PComponents(j)*normpdf(binLocations,gm.mu(j),sqrt(gm.Sigma(j))),'color','r'); end xlim([50 200]);
UPDATE
以下是对代码的一些解释:
第一个图显示直方图:颜色代码及其在图像中的编号.它只是为了证明每种颜色的频率.后来可以看出,pdf图类似于直方图轮廓 - 一个很好的验证手段.
第二个图显示了颜色代码的pdf.该模型通过近似值将实际分布描述为k = 3正态分布的总和:
有时算法无法找到合适的近似值,最终只有2个分布.您需要重新启动代码.曲线下面积等于1.为了保持此约束为真,使用参数p缩放pdf组件.
在第三个图中,描绘了单个分布.它们是x的连续函数.你可以象征性地为x解决它们,它们看起来像:
f1 = 0.0193*exp(-0.0123*(x - 97.6)^2) f2 = 0.0295*exp(-0.0581*(x - 83.0)^2) f3 = 0.0125*exp(-0.00219*(x - 131.0)^2)
为了找到它们的交点,你可以构造一个符号函数,为每个分布放置相应的参数,写一个方程,然后使用求解函数来求解x的等式:
syms x m s p f = symfun(p/(s*sqrt(2*pi))*exp(-((x-m)^2)/(2*(s^2))), [x, m, s, p]); for j = 1:3 ff(j) = f(x, gm.mu(j), sqrt(gm.Sigma(j)), gm.PComponents(j)); end eqn = ff(1) == ff(2); sols = solve(eqn, x); display(vpa(sols, 3));
上面的代码找到了第一个和第二个pdf的交集.结果:x = 88.1,x = 70.0.
UPDATE
使用上面的simbolic等式,您可以找到有关pdf的更多信息:
% At which value of x the 3rd pdf is equal to 0.01? eqn = ff(3) == 0.01; sols = solve(eqn, x); display(vpa(sols, 3)); %returns 121.0 and 141.0 % What is the value of the 3rd pdf at x = 141? sol = subs(ff(3), x, 141); display(vpa(sol, 3)); %returns 0.0101