MATLAB: forma eficiente de contar números distintos de cero a lo largo del límite de una matriz

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

Pregunta

Tengo una matriz cuya imagen se ve como se muestra a continuación. Los valores en la matriz representan el número de partículas en cada píxel/cuadrícula. Quiero calcular la distribución de partículas distintas de cero a lo largo de la periferia/límite (La periferia/límite se refiere a la distribución de puntos más lejanos desde el centro) donde existen partículas distintas de cero. Como salida de esto, me gustaría obtener:

1) # de partículas distintas de cero a lo largo de la periferia/límite, y

2) # de píxeles/cuadrículas donde residen esas partículas

¿Alguna forma rápida/eficiente de hacer esto?

enter image description here

Editar 1: instantánea que describe el ejemplo de un límiteLa línea límite rastrea las partículas distintas de cero.enter image description here

¿Fue útil?

Solución

Comenzando con una matriz M de recuentos de partículas, esto le dará una máscara Mb del límite como ha sido definido por la pregunta,

% 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

Así es como entiendo que quieres que se vea tu máscara límite. El número de píxeles que componen el límite es

numBorderPix = sum(Mb(:))

El número de partículas en esos puntos fronterizos es entonces

numBorderParticles = sum(M(Mb))

NOTA: Esta solución asegurará que Cada punto en la línea límite tiene un recuento de partículas distintas de cero.

Otros consejos

La periferia peri Para la indexación lógica de su matriz M es

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

Entonces, la partícula cuenta n en la periferia están n = M(peri). (1) El número total de partículas a lo largo del límite es sum(n). (2) El número de píxeles donde residen es sum(n > 0).

-Eledé este algoritmo para tu problema.

-Los detalles de lo que desea no están 100% claros, por lo que puede no calcular exactamente lo que desea.

-La explicación está en los comentarios

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top