Question

J'ai un tableau dont l'image ressemble comme indiqué ci-dessous. Les valeurs du tableau représentent le nombre de particules à chaque pixel / grille. Je veux calculer la distribution des particules non nulles le long de la périphérie / limite (La périphérie / la limite fait référence à la distribution des points les plus éloignés du centre) Là où des particules non nulles existent. En sortie de cela, je voudrais obtenir:

1) # de particules non nulles le long de la périphérie / limite, et

2) # de pixels / grilles où ces particules résident

Un moyen rapide / efficace de faire cela?

enter image description here

Edit 1: instantané décrivant l'exemple d'une frontièreLa ligne limite retrace les particules non nulles.enter image description here

Était-ce utile?

La solution

En commençant par une matrice M du nombre de particules, cela vous apportera un masque dans Mb de la frontière telle qu'elle a été définie par la question,

% 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

C'est ce que je comprends que vous voulez que votre masque limite ressemble. Le nombre de pixels qui composent la frontière est

numBorderPix = sum(Mb(:))

Le nombre de particules sur ces points de bordure est alors

numBorderParticles = sum(M(Mb))

Remarque: cette solution garantira que Chaque point de la ligne de limite a un nombre de particules non nul.

Autres conseils

La périphérie peri pour l'indexation logique de votre matrice M est

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

Ensuite, la particule compte n à la périphérie sont n = M(peri). (1) le nombre total de particules le long de la frontière est sum(n). (2) le nombre de pixels où ils résident est sum(n > 0).

-J'ai trouvé cet algorithme pour votre problème.

-Les détails de ce que vous voulez ne sont pas clairs à 100% afin de ne pas calculer exactement ce que vous voulez.

-La explication est dans les commentaires

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top