矩阵的数字已经被处理,只包含“0”和“1”。现在我想要找到块的“1”,即如果两个或更多的“1”站在附近,位于左侧,右侧,向上和down.For〔实施例,这里是一个矩阵:如何计算矩阵中给定值的“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来解决这个问题? 非常感谢。
矩阵的数字已经被处理,只包含“0”和“1”。现在我想要找到块的“1”,即如果两个或更多的“1”站在附近,位于左侧,右侧,向上和down.For〔实施例,这里是一个矩阵:如何计算矩阵中给定值的“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来解决这个问题? 非常感谢。
这个问题对我来说还不够清楚,对不起。
如果您想通过行或列,找到最大数(这给你提供的结果),用途:
max(max(sum(A,1)) , max(sum(A,2)))
其中:sum(A,1)
,sum(A,2)
沿着列返回总和的作为线一个向量。 Inner max()
选择沿着每个矢量的最大值并且外部max()
返回每个最大bycol,byline和的最大值。
听起来像一个连接组件问题给我。 Mathworks的Steve在他的blog上写了8篇文章。见部分1至7
基本上你需要找到与从图像处理工具箱功能的帮助下,矩阵连接的部件(如有人指出由@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
作为一个额外的步骤,我们就可以绘制马特里CES以帮助观察结果:
%# 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')
(我downvoter评论:)好了,这是不是一个伟大的答案。我不应该试图回答我不完全理解的问题。 –
我是一个downvoted(抱歉应该发表评论)...实际上,如果你看看编辑的历史,你会看到[原始问题](http://stackoverflow.com/revisions/9d0beb93 -6de6-40fc-8bfe-affd64abbc93/view-source)确实是一个矩阵形式,这只是OP忘记了正确格式化代码,因此显示为一行。我愿意删除我的downvote(但你应该先编辑它,因为我的投票现在被锁定),否则我认为这应该被删除。 – Amro
谢谢,我没有注意到,你必须点击'源'链接上历史。 )但是,我不能解释他的问题,并且基本上会做出同样的答案(因此,我不会编辑它,保留你的失望作为提醒,我应该在回答之前仔细理解)。没有冒犯。 –