Matlab: эффективный способ подсчета ненулевых чисел вдоль границы массива

StackOverflow https://stackoverflow.com/questions/19825429

Вопрос

У меня есть массив, изображение, изображение, как показано ниже. Значения в массиве представляют количество частиц в каждом пикселе/сетке. Я хочу рассчитать распределение ненулевых частиц вдоль периферии/границы (Периферия/граница относится к распределению самых дальних точек из центра) где существуют ненулевые частицы. Анкет В качестве вывода из этого я хотел бы получить:

1) # ненулевых частиц вдоль периферии/границы, и

2) # пикселей/сетки, где проживают эти частицы

Есть какой -нибудь быстрый/эффективный способ сделать это?

enter image description here

РЕДАКТИРОВАТЬ 1: Снимок, описывающий пример границыГраничная линия прослеживает ненулевые частицы.enter image description here

Это было полезно?

Решение

Начиная с матрицы M из количества частиц, это даст вам маску в Mb границы, как это было определено вопросом,

% define particle count matrix and find non-zero locations
M = randi(5,10,10)-1
[nr,nc] = size(M);
[pRows,pCols] = find(M);

% identify locations that compose the "boundary" line
boundCoords = [accumarray(pCols,pRows',[nc 1],@min)', ...
               accumarray(pCols,pRows',[nc 1],@max)', ...
               1:nr 1:nr; ...
               1:nc 1:nc, ...
               accumarray(pRows,pCols',[nr 1],@min)', ...
               accumarray(pRows,pCols',[nr 1],@max)'];
boundCoords = unique(boundCoords','rows');
boundCoords(any(boundCoords==0,2),:)=[]; %' remove possible (unlikely) zeros

% create a mask representation of the boundary line
Mb = false(size(M));
Mb(sub2ind(size(Mb),boundCoords(:,1),boundCoords(:,2))) = true

Это то, что я понимаю, вы хотите, чтобы ваша пограничная маска выглядела. Количество пикселей, которые составляют границу, это

numBorderPix = sum(Mb(:))

Количество частиц на этих пограничных точках тогда

numBorderParticles = sum(M(Mb))

Примечание: это решение обеспечит, чтобы Каждая точка на граничной линии имеет ненулевое количество частиц.

Другие советы

Периферия peri для логической индексации вашей матрицы M является

peri = true(25);
peri(2:end-1, 2:end-1) = false;

Затем количество частиц имеет значение n на периферии n = M(peri). Анкет (1) Общее количество частиц вдоль границы sum(n). Анкет (2) количество пикселей, где они находятся sum(n > 0).

-Я придумал этот алгоритм для вашей проблемы.

-Детали того, что вы хотите, не на 100% ясны, так что это может не вычислять именно то, что вы хотите.

-Ворация в комментариях

A=full(sprand(10,10,0.9));

crossKernel=[0 1 0; 1 1 1; 0 1 0]; %% neighbor kernel
isBorder = (conv2(ones(size(A)),crossKernel,'same')~=5); %% find pixels on border
isZeroOnBorder = isBorder & (A==0); %% find zeros on border
%%% the pixels on the new border are...
isNewBorder = (conv2(double(isZeroOnBorder),crossKernel,'same')... %% next to a zero on border
              | isBorder )... %% or on the border of the matrix
              & (~isZeroOnBorder); %% and are not zeros on border
newBorderLength=nnz(isNewBorder) %% counting and obtaining result
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top