сегментация на основе гауссовой смеси

У меня есть изображение с четырьмя разными цветами - темно-синим, голубым, еще более светлым синим - фон и белым - фон. Я хочу сегментировать только первые две категории

bG= mat2gray(image);
his=imhist(bG);
sai = gmdistribution.fit(his,4);
m1=sai.mu(1);
v1=sai.Sigma(1);
m2=sai.mu(2);
v2=sai.Sigma(2);

imt=bG<m2+v2;
figure;
imagesc(~imt);

Я получаю изображение со всеми пикселями 1. Матрица изображения bG имела значения меньше 1, но среднее значение и дисперсия каждого гауссова были намного выше.

Насколько я понял, bG является матрицей изображения и, следовательно, будет иметь значения интенсивности. поэтому все значения здесь меньше 1.

но средние значения четырех гуассианов равны: 0,8604 0,976 2,9182 6,6377. Это не похоже на интенсивность, поэтому, когда я попытался получить все пиксели в изображении меньше среднего значения секунды, все пиксели прошли тест. Есть кое-что, чего мне здесь не хватает. Может ли кто-нибудь помочь мне сегментировать темно-синие и светло-голубые клетки на основе смеси Гаусса. Любая помощь приветствуется!


person Sai Chetan    schedule 23.04.2013    source источник


Ответы (1)


Нет никакой гарантии, что sai.mu(1) ‹ sai.mu(2) ‹ sai.mu(3) и т. д. Насколько вам известно, mu(2) может соответствовать белому цвету, и в этом случае m2+v2 будет больше, чем 1, и все пиксели пройдут тест. Я бы просто использовал sai.cluster(bG(:)), нашел два самых низких mus и соединил кластеры, соответствующие двум самым маленьким mus, вот так:

sai = gmdistribution.fit(his,4);

mus = [sai.mu(1),sai.mu(2),sai.mu(3),sai.mu(4)];
[~,sortmus] = sort(mus);

clusters = sai.cluster(bG(:));
bGclustered = clusters == sortmus(1) | clusters == sortmus(2);

subplot(1,2,1);
imagesc(bG)
subplot(1,2,2);
imagesc(reshape(bGclustered,size(bG)))
person Patrick Mineault    schedule 24.04.2013
comment
Патрик, не могли бы вы проверить правку, которую я внес в вопрос. Спасибо! - person Sai Chetan; 24.04.2013