Python插值法统一ct扫描体素尺寸
我在Matlab中使用了Python插值法统一ct扫描体素尺寸,python,matlab,interpolation,dicom,Python,Matlab,Interpolation,Dicom,我在Matlab中使用了interp2,例如下面的代码,这是@rayryeng在中的答案的一部分: d=大小(体积图像) [X,Y]=meshgrid(1:1/scaleCoeff(2):d(2),1:1/scaleCoeff(1):d(1)); 对于ind=z %通过interp2插值每个切片 M2D(:,:,ind)=interp2(体积图像(:,:,ind),X,Y); 结束 尺寸示例: 图像大小为512x512,切片数为133。因此: 体积图像(三维尺寸中的行、列、切片):三维尺寸中的
interp2
,例如下面的代码,这是@rayryeng在中的答案的一部分:
d=大小(体积图像)
[X,Y]=meshgrid(1:1/scaleCoeff(2):d(2),1:1/scaleCoeff(1):d(1));
对于ind=z
%通过interp2插值每个切片
M2D(:,:,ind)=interp2(体积图像(:,:,ind),X,Y);
结束
尺寸示例:
图像大小为512x512,切片数为133。因此:
体积图像(三维尺寸中的行、列、切片):三维尺寸中的512x512x133
X:288x288
Y:288x288
scaleCoeff(2):0.5625
scaleCoeff(1):0.5625
z=1到133,因此z:1x133
ind:1至133
M2D(:,:,ind)最终在3D维度上为288x288x133
同样,Matlabs的大小语法:(第三维度的行、列、切片)和Python的大小语法:(第三维度的切片、行、列)。
但是,将Matlab代码转换为Python代码后出现错误,ValueError:非矩形网格输入z的长度无效
:
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
怎么了?非常感谢。在MATLAB中,有以下参数:
result = interp2(input_x, input_y, input_z, output_x, output_y)
您只使用后3个参数,前两个参数假定为input\ux=1:size(input\uz,2)
和input\uy=1:size(input\uz,1)
在Python中,则完全不同:它接受MATLAB函数的前3个输入参数,并返回一个对象,您可以调用该对象来获取插值:
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)
[代码未测试,如果有错误,请告诉我。]您可能会感兴趣。如果要从一个常规栅格插值到另一个栅格,则它比
scipy.interpolate.interp2d
更快更易于使用
有关示例,请参见此答案:
您可能需要以下内容:
import scipy.ndimage as ndimage
M2D = ndimage.zoom(volume_image, (1, scaleCoeff[0], scaleCoeff[1])
您是如何创建卷图像的?通常,在Python中,数组是按C顺序存储的,而不像Matlab那样是按F顺序存储的,因此它应该是
volume\u image[:,:,ind]
。另外,范围是错误的,您希望对范围内的ind使用(len(z):
@Matthieu Brucher:I发现:size的Matlabs语法:(x=行,y=列,z=三维维度中的切片)
和大小的Python语法:[z=三维维度中的切片,x=行,y=列]
而且,的范围与Matlab相同。我在问题中编辑了我的示例。你是如何读取图像的?你的len(z)
仍然有一个错误,为什么z不是向量而是矩阵?@Matthieu Brucher:我将图像收集为volume_image[I,:,:]=dcm_图像。循环中的像素_数组
。z
是三维中的切片数。错误是因为interp2d
而不是len(z)
。您可能希望改用scikit.image。len(z)
是一个错误,但我想说的是,volume\u image
的内容也不允许很好的插值。但是我们没有它的内容。有一个错误:ValueError:无法将输入数组从shape(2881024)广播到shape(288288)
。我想将大小为512x512
的图像调整为288x288
@eli:也许我误解了您对scaleceff
的定义。请确保xnew
和ynew
各有288个元素。是的,这是因为scaleceff
。我的问题解决了。非常感谢。