Как подсчитать количество блоков «1» заданного значения в матрице? - PullRequest
1 голос
/ 08 октября 2011

Номера матрицы уже были обработаны, они содержат только «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 ]

4 голосов
/ 08 октября 2011

Похоже, проблема со связанными компонентами для меня. Стив из Mathworks написал 8 статей об этом в своем блоге . Смотрите части с 1 по 7.

3 голосов
/ 10 октября 2011

В основном вам нужно найти связанные компоненты в матрице с помощью функций из панели инструментов обработки изображений (как было указано @ 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

0 голосов
/ 08 октября 2011

Вопрос недостаточно ясен для меня, извините.

Если вы хотите найти наибольшую сумму по строке или столбцу (это дает результат, который вы предоставили), используйте:

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

Где: sum(A,1), sum(A,2) возвращает сумму по столбцу, строке A как вектор. Внутреннее max() выбирает наибольшее значение по каждому вектору, а внешнее max() возвращает наибольшее из каждого величайшего байкола, суммы в подлине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...