Python 3.x 从三维体积数据中提取40 mm立方体
我已经从dicom格式创建了一个3d numpy数据数组(形状:133 x 512 x 512)。给定结节位置的中心点,如何提取尺寸为40mm x 40mm x 40mm的三维体积。我不确定像素到毫米的转换是如何发生的?我把数据附在这里了。结节的位置是(31736389),也就是(x,y,z),其中z表示切片的数量。所以在这个例子中,结节在切片89上。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
这是你的电话号码。它是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。间距以毫米/像素为单位。要记住是否应使用量纲分析进行除法或乘法,请参见,例如,或