Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python插值法统一ct扫描体素尺寸_Python_Matlab_Interpolation_Dicom - Fatal编程技术网

Python插值法统一ct扫描体素尺寸

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。因此: 体积图像(三维尺寸中的行、列、切片):三维尺寸中的

我在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。因此:
体积图像(三维尺寸中的行、列、切片):三维尺寸中的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
。我的问题解决了。非常感谢。