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 № 1Espero 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.