Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 3.x 从三维体积数据中提取40 mm立方体_Python 3.x_Image Processing_Scipy_Scikit Image_Pydicom - Fatal编程技术网

Python 3.x 从三维体积数据中提取40 mm立方体

Python 3.x 从三维体积数据中提取40 mm立方体,python-3.x,image-processing,scipy,scikit-image,pydicom,Python 3.x,Image Processing,Scipy,Scikit Image,Pydicom,我已经从dicom格式创建了一个3d numpy数据数组(形状:133 x 512 x 512)。给定结节位置的中心点,如何提取尺寸为40mm x 40mm x 40mm的三维体积。我不确定像素到毫米的转换是如何发生的?我把数据附在这里了。结节的位置是(31736389),也就是(x,y,z),其中z表示切片的数量。所以在这个例子中,结节在切片89上。 这是你的电话号码。它是nrrd格式的。在dicom标头信息中,切片厚度为2.5,像素间距为['0.703125','0.703125'.看起来N

我已经从dicom格式创建了一个3d numpy数据数组(形状:133 x 512 x 512)。给定结节位置的中心点,如何提取尺寸为40mm x 40mm x 40mm的三维体积。我不确定像素到毫米的转换是如何发生的?我把数据附在这里了。结节的位置是(31736389),也就是(x,y,z),其中z表示切片的数量。所以在这个例子中,结节在切片89上。
这是你的电话号码。它是nrrd格式的。在dicom标头信息中,切片厚度为2.5,像素间距为['0.703125','0.703125'.

看起来NumPy阵列坐标反转为(z,y,x)aka(平面,行,列),有关详细信息,请参阅。此外,我们假设体素间距等于[2.5,0.703125,0.703125],尽管我无法在Pyrd中找到此信息。但是,想象一下,我发现这些测量结果是正确的。其单位为毫米/像素

现在,你想把40毫米,或者说是20毫米的一半,转换成像素。通过除以mm/像素,可以得到以下框大小:

>20/np.数组([2.5,0.703125,0.703125])
数组([8,28.4444,28.4444])
这意味着盒子的顶部应位于:

np.数组([89363317])-[8,28,28] 数组([81335289]) 底部为:

np.数组([89363317])+[8,29,29] 数组([97392346]) (为了得到中心像素,我在另一侧将其设置为29,这也是因为28.4*2近似于57,而不是56。)

因此,要想拿到你的盒子,你需要:

>>box40mm=data[81:97335:392289:346]
有关NumPy索引的更多详细信息,请参阅文档

要将其全部放在一个函数中,该函数假定所有输入都是NumPy数组:

def获取框(数据、中心像素、框大小、像素间距):
框大小像素=框大小/像素间距
box\u size\u left=np.round(box\u size\u pixels/2)。astype(int)
box\u size\u right=np.round(box\u size\u像素-box\u size\u left)。astype(int)
开始=中心像素-框大小\u左侧
端点=中心像素+方框大小\u右侧
切片=元组(
切片(开始、结束)
对于开始,以zip结束(开始,结束)
)
返回数据[切片]

请注意,此代码不考虑碰撞体积的边界。

看起来NumPy数组坐标被反转为(z,y,x)aka(平面,行,列),有关详细信息,请参阅。此外,我们假设体素间距等于[2.5,0.703125,0.703125],尽管我无法在Pyrd中找到此信息。但是,想象一下,我发现这些测量结果是正确的。其单位为毫米/像素

现在,你想把40毫米,或者说是20毫米的一半,转换成像素。通过除以mm/像素,可以得到以下框大小:

>20/np.数组([2.5,0.703125,0.703125])
数组([8,28.4444,28.4444])
这意味着盒子的顶部应位于:

np.数组([89363317])-[8,28,28] 数组([81335289]) 底部为:

np.数组([89363317])+[8,29,29] 数组([97392346]) (为了得到中心像素,我在另一侧将其设置为29,这也是因为28.4*2近似于57,而不是56。)

因此,要想拿到你的盒子,你需要:

>>box40mm=data[81:97335:392289:346]
有关NumPy索引的更多详细信息,请参阅文档

要将其全部放在一个函数中,该函数假定所有输入都是NumPy数组:

def获取框(数据、中心像素、框大小、像素间距):
框大小像素=框大小/像素间距
box\u size\u left=np.round(box\u size\u pixels/2)。astype(int)
box\u size\u right=np.round(box\u size\u像素-box\u size\u left)。astype(int)
开始=中心像素-框大小\u左侧
端点=中心像素+方框大小\u右侧
切片=元组(
切片(开始、结束)
对于开始,以zip结束(开始,结束)
)
返回数据[切片]

请注意,这段代码没有考虑到到达卷的边界。

谢谢@Juan,关于图像尺寸(切片、行、列),您是对的,我在问题中输入错误。你能解释一下为什么用体素间距除以20吗?在这种情况下,1mm=1px吗?不,1mm不等于1px。像素间距准确地告诉您1px是什么:沿切片轴2.5mm,沿xy轴0.7mm。间距以毫米/像素为单位。为了记住是否应该使用维度分析进行除法或乘法,请参见,或者感谢@Juan,关于图像维度(切片、行、列),您是对的,我在问题中输入错误。你能解释一下为什么用体素间距除以20吗?在这种情况下,1mm=1px吗?不,1mm不等于1px。像素间距准确地告诉您1px是什么:沿切片轴2.5mm,沿xy轴0.7mm。间距以毫米/像素为单位。要记住是否应使用量纲分析进行除法或乘法,请参见,例如,或