检测组

时间:2015-04-10 07:14:33

标签: matlab image-processing computer-vision image-segmentation

使用bwconncompregionprops检测我的图片中连接域的数量和位置。我现在想要弄清楚对象填充的空间(凸域的大小)。

如果所有对象均匀分布或属于一个大组,这不是问题,因为我可以使用convhull来计算区域。 问题是现在如果我有几个组,那么我想要几个凸区 - 每组一个,组的数量预先未知。

例如参见:http://jasonyianakis.co.nz/wp-content/uploads/2012/08/different-people-groups.jpg

请注意,这只是我感兴趣的分组,作为单个元素的检测已经在运行。

2 个答案:

答案 0 :(得分:1)

您可以在regionprops

中使用'ConvexArea'媒体资源

例如

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

生成的二元掩码:

enter image description here 标记每个组件,并获取'ConvexArea'

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

丢弃太小的区域

cxArea( cxArea < 100 ) = [];

现在你有了组件的凸面区域:

cxArea =
  474813     2054497      451879

答案 1 :(得分:0)

尝试使用Matlab的kmeans函数。此功能用于将数据划分为多个群集。此外,高斯混合模型经常用于您的目的(它们给出了最好的结果)。网上有很多关于它们的信息,并且在Matlab中实现了几个函数。

PS:确定集群数是一项非常艰巨的任务。 clusterdata和类似的功能可以为你做,但这并不意味着它将是最好的结果。通常会尝试几个不同数量的组,看看哪个最适合, Gaussians 可以用它的权重来帮助。如果一个体重很轻,那么它的可能性就会大于它的重要性,并且可以被删除。