/ / Media su un voxel 3x3x3 in un volume 192x192x24 - immagine, matlab, elaborazione immagine, voxel

Media su un voxel 3x3x3 in un volume 192x192x24 - immagine, matlab, elaborazione immagine, voxel

Sto elaborando i file di immagine con misuratiintensità, in pratica estrazione di voxel in dimensioni di 1x1x1 pixel. I file di immagine formano un volume per evitare picchi di intensità. Mi piacerebbe trovare un modo per fare una media di oltre 3x3x3 pixel.

Il mio problema è di capire il problema, perché è una forma all'interno dell'immagine separata da zeri e altri valori. Quindi, prima ho considerato un for-loop con a if-affermazione. Queste sono le considerazioni che ho fatto finora per il for-loop e if-affermazione. MATLAB percepisce il volume come una lunga matrice quindi da un semplice for dovrebbe essere facile trovare un valore diverso da zero e i suoi valori adiacenti, e prendere la media su quei valori. Il problema arriva quando devo prendere in considerazione la dimensione z.

Questo chiaramente non funziona in modo ottimale, e trovo difficile tener conto degli effetti di confine.

risposte:

6 per risposta № 1

Spero di interpretare correttamente la tua domanda, masi desidera trovare la media su un volume di voxel 3 x 3 x 3 per ciascun voxel nell'immagine di input in cui ciascun voxel di input funge da media di ciascun volume di voxel 3 x 3 x 3 da calcolare come media. Se hai la possibilità di utilizzare le funzioni incorporate di MATLAB, considera l'utilizzo della convoluzione N-D con convn. Non usare i loop qui perché sarà notoriamente lento convn, il primo parametro è l'immagine 3D e ilil secondo parametro è un kernel 3 x 3 x 3 con valori tutti uguali a 1/27. Hai anche la possibilità di specificare cosa succede lungo il confine se il tuo kernel di convoluzione supera i limiti dell'immagine di input. Di solito, si desidera restituire un'immagine di output che abbia le stesse dimensioni dell'input e quindi si potrebbe voler specificare "same" contrassegna come terzo parametro facoltativo. Questo meccanismo di media presuppone anche che i bordi esterni siano riempiti a zero.

Pertanto, supponendo che l'immagine sia memorizzata im, fai qualcosa del genere:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix
kernel = ones(3,3,3);
kernel = kernel / numel(kernel);

%// Perform N-D convolution
out = convn(double(im), kernel, "same"); %// Cast to double for precision

out = cast(out, class(im)); %// Recast back to original data type

In alternativa, se si ha accesso alla casella degli strumenti di elaborazione delle immagini, utilizzare imfilter anziché. La differenza con questo e convn è questo imfilter è stato scritto usando Intel Integrated Performance Primitives (IIPP)e quindi le prestazioni saranno sicuramente più veloci:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix
kernel = ones(3,3,3);
kernel = kernel / numel(kernel);

%// Perform N-D convolution
out = imfilter(im, kernel);

Il vantaggio aggiunto è che non è necessario modificare il tipo di input. imfilter questo diminuisce automaticamente, l'elaborazione rispetta il tipo originale dell'immagine di input e il tipo di output di imfilter è uguale al tipo di input. Con convn, devi assicurarti che i tuoi dati siano a virgola mobile prima di usarli.