Обнаружение групп

После использования bwconncomp и regionprops для определения количества и места подключенных доменов на моем изображении. Теперь я хочу выяснить, сколько пространства (размер выпуклой области) заполняют объекты.

Если все объекты равномерно распределены или находятся в одной большой группе, это не проблема, так как я могу просто использовать convhull для вычисления площади. Проблема в том, что если у меня несколько групп, то я хочу несколько выпуклых областей - по одной на каждую группу, количество групп заранее неизвестно.

См., например:
(источник: jasonyianakis.co.nz)

Обратите внимание, что меня интересует только группировка, обнаружение как отдельного элемента уже работает.


person Nicky Mattsson    schedule 10.04.2015    source источник


Ответы (2)


Вы можете использовать свойство 'ConvexArea' в regionprops.

Например

img = imread('http://jasonyianakis.co.nz/wp-ontent/uploads/2012/08/different-people-groups.jpg');
img = im2double(img); %// convert to double
bw = max(bsxfun(@rdivide,img,sum(img,3)),[], 3 )>.4; %// get a binary mask

Полученная бинарная маска:

введите здесь описание изображенияПометьте каждый компонент и получите 'ConvexArea':

lb = bwlabel(bw);
st = regionprops(lb,'ConvexArea');
cxArea = [st.ConvexArea];

Отбрасывать слишком маленькие регионы

cxArea( cxArea < 100 ) = [];

Теперь у вас есть выпуклая область компонентов:

cxArea =
  474813     2054497      451879
person Shai    schedule 14.04.2015

Попробуйте использовать функцию kmeans Matlab. Эта функция используется для разделения данных на несколько кластеров. Кроме того, для ваших целей часто используются Гауссовские смешанные модели (они дают наилучшие результаты). В Интернете есть много информации о них и нескольких функциях, реализованных в Matlab.

PS: Определить количество кластеров очень сложная задача. clusterdata и подобные функции могут сделать это за вас, но это не значит, что это будет лучший результат. Обычно пробуют несколько разных групп и выбирают наиболее подходящую . В этом могут помочь гауссианы с их весами . Если у кого-то очень низкий вес, он, скорее всего, незначителен и может быть удален.

person Nerea González Vázquez    schedule 10.04.2015
comment
Если вы не понимаете функцию kmeans, я могу передать вам пример, который я сделал в курсе. - person Nerea González Vázquez; 10.04.2015
comment
Я сожалею, что я не был ясен в моем описании проблемы. Количество групп заранее неизвестно, поэтому я не могу напрямую применить функцию kmeans. - person Nicky Mattsson; 10.04.2015
comment
Тогда вам идеально подойдет clusterdataфункция Matlab. В противном случае Гауссовы смешанные модели очень полезны, но их сложнее реализовать. - person Nerea González Vázquez; 10.04.2015