/ / Promedio sobre un voxel de 3x3x3 en un volumen de 192x192x24 - imagen, matlab, procesamiento de imagen, voxel

Promedio sobre un vóxel de 3x3x3 en un volumen de 192x192x24 - imagen, matlab, procesamiento de imágenes, voxel

Estoy procesando archivos de imagen con medidas.Intensidad, básicamente extrayendo voxels en tamaños de 1x1x1 píxeles. Los archivos de imagen están formando un volumen para evitar intensidades máximas. Me gustaría encontrar una manera de promediar más de 3x3x3 píxeles.

Mi problema es entender el problema porque es una forma dentro de la imagen separada por ceros y otros valores. Así que, en primer lugar, consideré una for-loop con un if-declaración. Estas son las consideraciones que he hecho hasta ahora para el for-loop y if-declaración. MATLAB percibe el volumen como una matriz larga, por lo que de forma simple for en bucle debería ser fácil encontrar un valor distinto de cero y sus valores adyacentes, y tomar el promedio sobre esos valores. El problema viene cuando tengo que tener en cuenta la dimensión z.

Claramente, esto no funciona de manera óptima, y ​​me resulta difícil dar cuenta de los efectos de contorno.

Respuestas

6 para la respuesta № 1

Espero interpretar bien tu pregunta, perodesea encontrar el promedio de un volumen de voxel de 3 x 3 x 3 para cada vóxel en la imagen de entrada donde cada voxel de entrada actúa como el centro de cada volumen de voxel de 3 x 3 x 3 que se promediará. Si tiene la opción de usar las funciones integradas de MATLAB, considere usar la convolución N-D con convn. No use bucles aquí porque será notoriamente lento. Para convn, el primer parámetro es la imagen 3D, y elEl segundo parámetro es un kernel de 3 x 3 x 3 con valores todos iguales a 1/27. También tiene la opción de especificar qué sucede a lo largo del borde si su núcleo de convolución va más allá de los límites de la imagen de entrada. Por lo general, desea devolver una imagen de salida que sea del mismo tamaño que la entrada, por lo que es posible que desee especificar la "same" bandera como el tercer parámetro opcional. Este mecanismo de promediación también asume que los bordes externos están rellenados en cero.

Por lo tanto, suponiendo que su imagen se almacena en im, haz algo como esto:

%// 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

Alternativamente, si tiene acceso a la caja de herramientas de procesamiento de imágenes, use imfilter en lugar. La diferencia con esto y convn es eso imfilter fue escrito usando Primitivas de rendimiento integrado de Intel (IIPP)Y así, el rendimiento definitivamente será más rápido:

%// 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);

La ventaja adicional es que no es necesario cambiar el tipo de entrada. imfilter Infiere automáticamente esto, hace el procesamiento respetando el tipo original de la imagen de entrada y el tipo de salida de imfilter es el mismo que el tipo de entrada. Con convn, debe asegurarse de que sus datos estén en coma flotante antes de usarlos.