Frage

Ich habe ein Array, dessen Bild wie unten gezeigt aussieht. Die Werte im Array repräsentieren die Anzahl der Partikel an jedem Pixel/Gitter. Ich möchte die Verteilung von Partikeln ungleich Null entlang der Peripherie/Grenze berechnen (Grenze (Peripherie/Grenze bezieht sich auf die Verteilung der weitesten Punkte aus der Mitte) wo Partikel ungleich Null existieren. Als Ausgabe möchte ich:

1) Anzahl von Partikeln ungleich Null entlang der Peripherie/Grenze und

2) Anzahl der Pixel/Gitter, in denen sich diese Partikel befinden

Irgendwelche schnelle/effiziente Art, dies zu tun?

enter image description here

Bearbeiten 1: Schnappschuss beschreibt das Beispiel einer GrenzeDie Grenzlinie verfolgt die Partikel ungleich Null.enter image description here

War es hilfreich?

Lösung

Beginnend mit einer Matrix M von Partikeln werden Sie eine Maske einbringen Mb der Grenze, wie sie durch die Frage definiert wurde,

% 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

So verstehe ich, dass Sie möchten, dass Ihre Grenzmaske aussieht. Die Anzahl der Pixel, aus denen die Grenze besteht

numBorderPix = sum(Mb(:))

Die Anzahl der Partikel an diesen Randpunkten ist dann

numBorderParticles = sum(M(Mb))

Hinweis: Diese Lösung sorgt dafür Jeder Punkt auf der Grenzlinie hat eine Partikelzahl ungleich Null.

Andere Tipps

Die Peripherie peri Für die logische Indizierung Ihrer Matrix M ist

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

Dann zählt das Partikel n in der Peripherie sind n = M(peri). (1) Die Gesamtzahl der Partikel entlang der Grenze ist sum(n). (2) Die Anzahl der Pixel, in denen sie wohnen, ist sum(n > 0).

-Ich habe diesen Algorithmus für Ihr Problem gefunden.

-Die Details zu dem, was Sie wollen, sind nicht 100% klar, sodass nicht genau das berechnet wird, was Sie wollen.

-Die Erklärung ist in den Kommentaren

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top