Унификация ct сканирования размера вокселя с использованием интерполяции в Python - PullRequest
0 голосов
/ 26 октября 2018

Я использовал interp2 в Matlab, например, следующий код, который является частью ответа @ rayryeng в: Трехмерная (3D) матричная интерполяция в 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

Пример размеров:

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

Также, синтаксис Matlabs для размера: (строки, столбцы, фрагменты в 3-м измерении) и синтаксис Python для размера: (фрагменты в 3-м размере, строки, столбцы). Однако после преобразования кода Matlab в код Python произошла ошибка 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

Что не так? Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вас может заинтересовать scipy.ndimage.zoom. Если вы интерполируете из одной регулярной сетки в другую, это намного быстрее и проще в использовании, чем scipy.interpolate.interp2d.

См. Этот ответ для примера: https://stackoverflow.com/a/16984081/1295595

Возможно, вы захотите что-то вроде:

import scipy.ndimage as ndimage
M2D = ndimage.zoom(volume_image, (1, scaleCoeff[0], scaleCoeff[1])
0 голосов
/ 26 октября 2018

В MATLAB interp2 имеет в качестве аргументов:

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

Вы используете только последние 3 аргумента, первые два предполагается, что input_x = 1:size(input_z,2) и input_y = 1:size(input_z,1).

В Python scipy.interpolate.interp2 совершенно другой: он принимает первые 3 входных аргумента функции MATLAB и возвращает объект, который вы можете вызвать для получения интерполированных значений:

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

Следуя примеру из документации, я получаю что-то вроде этого:

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)

[Код не проверен, пожалуйста, дайте мне знать, если есть ошибки.]

...