使用bwconncomp
和regionprops
检测我的图片中连接域的数量和位置。我现在想要弄清楚对象填充的空间(凸域的大小)。
如果所有对象均匀分布或属于一个大组,这不是问题,因为我可以使用convhull
来计算区域。
问题是现在如果我有几个组,那么我想要几个凸区 - 每组一个,组的数量预先未知。
例如参见:http://jasonyianakis.co.nz/wp-content/uploads/2012/08/different-people-groups.jpg
请注意,这只是我感兴趣的分组,作为单个元素的检测已经在运行。
答案 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
生成的二元掩码:
标记每个组件,并获取'ConvexArea'
:
lb = bwlabel(bw);
st = regionprops(lb,'ConvexArea');
cxArea = [st.ConvexArea];
丢弃太小的区域
cxArea( cxArea < 100 ) = [];
现在你有了组件的凸面区域:
cxArea =
474813 2054497 451879
答案 1 :(得分:0)
尝试使用Matlab的kmeans
函数。此功能用于将数据划分为多个群集。此外,高斯混合模型经常用于您的目的(它们给出了最好的结果)。网上有很多关于它们的信息,并且在Matlab中实现了几个函数。
clusterdata
和类似的功能可以为你做,但这并不意味着它将是最好的结果。通常会尝试几个不同数量的组,看看哪个最适合, Gaussians 可以用它的权重来帮助。如果一个体重很轻,那么它的可能性就会大于它的重要性,并且可以被删除。