如何计算矩阵中给定值的“1”块数?

时间:2011-10-08 07:27:37

标签: matlab

矩阵的编号已经被处理,只包含“0”和“1”。现在我想找到“1”的块,即如果两个或更多“1”站在附近,位于左,右,向上和向下。例如,这是一个矩阵:

1 1 0 1 0 0
0 0 0 0 0 1
1 0 1 0 1 1
1 0 0 0 0 0

块的总和是3。 如何用matlab来解决这个问题? 非常感谢。

3 个答案:

答案 0 :(得分:4)

听起来像连接组件问题。 Mathworks的史蒂夫在blog上写了8篇关于它的文章。见第1至7部分。

答案 1 :(得分:3)

基本上你需要借助图像处理工具箱中的函数找到矩阵中的连通分量(正如@Maurits指出的那样)

如果您仍然遇到问题,请考虑以下代码:

%# matrix
A = [
    1 1 0 1 0 0
    0 0 0 0 0 1
    1 0 1 0 1 1
    1 0 0 0 0 0
];
BW = logical(A);

%# find connected components (4-connected neighborhood)
CC = bwconncomp(BW, 4);

%# find blocks with two or more connected 1's
idx = ( cellfun(@numel,CC.PixelIdxList) > 1 );
num = sum(idx);
答案如预期的那样:

>> num
ans =
     3

作为额外步骤,我们可以绘制矩阵以帮助可视化结果:

%# update connected components to those found only
CC.PixelIdxList = CC.PixelIdxList(idx);       %# pixel list
CC.NumObjects = sum(idx);                     %# number of blocks

%# show matrix with blocks found
RGB = label2rgb(labelmatrix(CC), 'lines', [0 0 0]);
h(1) = subplot(121); imshow(BW)
h(2) = subplot(122); imshow(RGB)
title( sprintf('Number of blocks = %d',CC.NumObjects) )

%# plot grid lines
X = 1:size(A,2); Y = 1:size(A,1);
vx = repmat(X+0.5,[2 1]); vx(end+1,:) = NaN;
vy = repmat([Y(1)-0.5;Y(end)+0.5;NaN],[1 size(vx,2)]);
hy = repmat(Y+0.5,[2 1]); hy(end+1,:) = NaN;
hx = repmat([X(1)-0.5;X(end)+0.5;NaN],[1 size(hy,2)]);
line('XData',[vx(:);hx(:)], 'YData',[vy(:);hy(:)], 'Parent',h(1), ...
    'LineWidth',1, 'Color',[0.8 0.8 0.8], 'HandleVisibility','off')
line('XData',[vx(:);hx(:)], 'YData',[vy(:);hy(:)], 'Parent',h(2), ...
    'LineWidth',1, 'Color',[0.8 0.8 0.8], 'HandleVisibility','off')

screenshot

答案 2 :(得分:0)

这个问题对我来说不够清楚,抱歉。

如果您想按行或列找到最大的总和(这会给出您提供的结果),请使用:

max( max( sum(A,1) ) , max( sum(A,2) ) )

其中:sum(A,1)sum(A,2)沿着列返回一个总和,A行作为向量。内部max()选择每个向量的最大值,外部max()返回每个最大的bycol,byline sums中的最大值。