Domanda

Ho un array la cui immagine sembra mostrata di seguito. I valori nell'array rappresentano il numero di particelle ad ogni pixel/griglia. Voglio calcolare la distribuzione di particelle diverse da zero lungo la periferia/confine (periferia/confine si riferisce alla distribuzione dei punti più lontani dal centro) dove esistono particelle diverse da zero. Come output da questo, vorrei ottenere:

1) # di particelle diverse da zero lungo la periferia/confine e

2) # di pixel/griglie in cui risiedono quelle particelle

Qualche modo rapido/efficiente di farlo?

enter image description here

EDIT 1: istantanea che descrive l'esempio di un confineLa linea di confine traccia le particelle diverse da zero.enter image description here

È stato utile?

Soluzione

A partire da una matrice M di conteggi di particelle, questo ti porterà una maschera Mb del confine come è stato definito dalla domanda,

% 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

Questo è quello che ho capito che vuoi che la tua maschera di confine sia. Il numero di pixel che compongono il confine è

numBorderPix = sum(Mb(:))

Il numero di particelle su quei punti di confine è quindi

numBorderParticles = sum(M(Mb))

Nota: questa soluzione lo garantirà Ogni punto sulla linea di confine ha un conteggio di particelle diverso da zero.

Altri suggerimenti

La periferia peri Per l'indicizzazione logica della tua matrice M è

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

Quindi, le particelle contano n Nella periferia ci sono n = M(peri). (1) Il numero totale di particelle lungo il confine è sum(n). (2) Il numero di pixel in cui risiedono è sum(n > 0).

-Ho ho trovato questo algoritmo per il tuo problema.

-I dettagli di ciò che desideri non sono chiari al 100%, quindi potrebbe non calcolare esattamente ciò che desideri.

-La spiegazione è nei commenti

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top