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

Matlab 如何计算矩阵中给定值“1”的块数?,matlab,Matlab,矩阵的数字已经被处理,只包含0和1。现在我想找到1的块,即如果两个或多个1站在附近,位于左、右、上和下。对于exmaple,这里有一个矩阵: 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来解决这个问题? 非常感谢。对不起,这个问题对我来说不够清楚 如果您想通过行或列找到最大的和,这将给出您提供的结果,请使用: max( max( sum(A,1) ) , max( sum(A,2) ) ) 其中:sumA

矩阵的数字已经被处理,只包含0和1。现在我想找到1的块,即如果两个或多个1站在附近,位于左、右、上和下。对于exmaple,这里有一个矩阵:

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来解决这个问题?
非常感谢。

对不起,这个问题对我来说不够清楚

如果您想通过行或列找到最大的和,这将给出您提供的结果,请使用:

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

其中:sumA,1,sumA,2返回沿列、线的和作为向量。“内部最大值”沿每个向量选择最大值,“外部最大值”返回每个最大值中的最大值,即bycol、byline和。

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

如果您想通过行或列找到最大的和,这将给出您提供的结果,请使用:

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

其中:sumA,1,sumA,2返回沿列、线的和作为向量。内部最大值沿每个向量选择最大值,外部最大值返回每个最大值中最大的bycol和byline总和。

听起来像是连接组件的问题。Mathworks的Steve在他的博客上写了8篇关于它的文章。见第1至7部分

听起来像是连接组件的问题。Mathworks的Steve在他的博客上写了8篇关于它的文章。见第1至7部分

基本上,您需要借助图像处理工具箱中的函数在矩阵中找到连接的组件,正如

如果你仍然有问题,考虑下面的代码:

%# 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')

基本上,您需要借助图像处理工具箱中的函数在矩阵中查找连接的组件,正如

如果你仍然有问题,考虑下面的代码:

%# 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')

对我的反对者的评论:好吧,这不是一个很好的答案。我不应该试图回答我不完全理解的问题。我是那个投了反对票的人。对不起,我应该发表评论。。。事实上,如果您查看编辑的历史记录,您将看到,确实是以矩阵形式出现的,只是OP忘记了正确格式化代码,因此显示为一行。我愿意删除我的否决票,但你应该先编辑它,因为我的投票现在已锁定,否则我认为这应该被删除..谢谢,我没有注意到必须单击历史记录上的“来源”链接。你创造了我的一天;不过,我无法解释他的问题,基本上会给出相同的答案,因此我不会编辑它,保留你的反对票,提醒我在回答之前应该仔细理解。没有冒犯。对我的失望的评论投票者:好吧,这不是一个很好的答案。我不应该试图回答我不完全理解的问题。我是那个投了反对票的人。对不起,我应该发表评论。。。事实上,如果您查看编辑的历史记录,您将看到,确实是以矩阵形式出现的,只是OP忘记了正确格式化代码,因此显示为一行。我愿意删除我的否决票,但你应该先编辑它,因为我的投票现在已锁定,否则我认为这应该被删除..谢谢,我没有注意到必须单击历史记录上的“来源”链接。你创造了我的一天;不过,我无法解释他的问题,基本上会给出相同的答案,因此我不会编辑它,保留你的反对票,提醒我在回答之前应该仔细理解。没有冒犯。