Tamaño de voxel de escaneo ct de unificación mediante interpolación en Python

He utilizado interp2 en Matlab, como el siguiente código, que forma parte de la respuesta de @ rayryeng en: Interpolación de matriz tridimensional (3D) en Matlab :

 d = size(volume_image) [X,Y] = meshgrid(1:1/scaleCoeff(2):d(2), 1:1/scaleCoeff(1):d(1)); for ind = z %Interpolate each slice via interp2 M2D(:,:,ind) = interp2(volume_image(:,:,ind), X, Y); end 

Ejemplo de dimensiones:

 The image size is 512x512 and the number of slices is 133. So: volume_image(rows, columns, slices in 3D dimenson) : 512x512x133 in 3D dimenson X: 288x288 Y: 288x288 scaleCoeff(2): 0.5625 scaleCoeff(1): 0.5625 z = 1 up to 133 ,hence z: 1x133 ind: 1 up to 133 M2D(:,:,ind) finally is 288x288x133 in 3D dimenson 

También, la syntax de Matlabs para el tamaño: (filas, columnas, cortes en la tercera dimensión) y la syntax de Python para el tamaño: (cortes en la tercera dimensión, filas, columnas). Sin embargo, después de convertir el código Matlab en código Python, se produjo un error, ValueError: Invalid length for input z for non rectangular grid :

 for ind in range(0, len(z)+1): M2D[ind, :, :] = interpolate.interp2d(X, Y, volume_image[ind, :, :]) # ValueError: Invalid length for input z for non rectangular grid 

¿Qué está mal? Muchas gracias.

En MATLAB, interp2 tiene como argumentos:

 result = interp2(input_x, input_y, input_z, output_x, output_y) 

Está utilizando solo los últimos 3 argumentos, se supone que los dos primeros son input_x = 1:size(input_z,2) y input_y = 1:size(input_z,1) .

En Python, scipy.interpolate.interp2 es bastante diferente: toma los primeros 3 argumentos de entrada de la función MATLAB y devuelve un objeto al que puedes llamar para obtener valores interpolados:

 f = scipy.interpolate.interp2(input_x, input_y, input_z) result = f(output_x, output_y) 

Siguiendo el ejemplo de la documentación, llego a algo como esto:

 from scipy import interpolate x = np.arange(0, volume_image.shape[2]) y = np.arange(0, volume_image.shape[1]) f = interpolate.interp2d(x, y, volume_image[ind, :, :]) xnew = np.arange(0, volume_image.shape[2], 1/scaleCoeff[0]) ynew = np.arange(0, volume_image.shape[1], 1/scaleCoeff[1]) M2D[ind, :, :] = f(xnew, ynew) 

[Código no probado, por favor avíseme si hay errores.]

Usted podría estar interesado en scipy.ndimage.zoom . Si está interpolando de una cuadrícula regular a otra, es mucho más rápido y más fácil de usar que scipy.interpolate.interp2d .

Vea esta respuesta para ver un ejemplo: https://stackoverflow.com/a/16984081/1295595

Probablemente quieras algo como:

 import scipy.ndimage as ndimage M2D = ndimage.zoom(volume_image, (1, scaleCoeff[0], scaleCoeff[1])