2017-10-10 55 views
7

所以,如果我有一个图像(CT,MRI等)或从放射疗法甚至剂量我可以拉出剂量或图像值到一个数组通过:获得DICOM结构轮廓如在Python阵列

import dicom 

ds = dicom.read_file("dicom_file.dcm") 

print ds.pixel_array 

这是非常简单的,让我能够操纵图像/剂量,我想要的。但是,通常您还有一个结构文件,其中包含不同的轮廓结构,然后您可以在图像查看器或类似的东西中看到这些结构文件。再次,非常简单。

我的问题是,我也想这些个别结构作为一个数组以及。如果我运行相同的代码,我只是得到TypeError: No pixel data found in this dataset.

我猜DICOM文件结构不是“剂量”/ DICOM文件相同的方式。

那么有没有解决方案,我一直没有找到?我也看过dicompyler_core软件包,但是从我所看到的,没有任何方法可以“将”不同的结构分解到数组中。

+1

请提供相关DICOM文件的SOP类UID,以便我们知道信息是如何编码的。 –

+0

@kritzel_sw哦,对不起,响应缓慢。如果我在结构文件上使用“SOP Class UID”标签,我会得到:RT Structure Set Storage。不知道这是你要求的吗? –

回答

2

这里是示出使用rtstruct.dcm文件中的数据布局的交互式会话附带pydicom:

>>> import dicom 
>>> ds = dicom.read_file("rtstruct.dcm", force=True) 
>>> ds.dir("contour") 
['ROIContourSequence'] 
>>> ctrs = ds.ROIContourSequence 
>>> ctrs[0] 
(3006, 002a) ROI Display Color     IS: ['220', '160', '120'] 
(3006, 0040) Contour Sequence 3 item(s) ---- 
    (3006, 0042) Contour Geometric Type    CS: 'CLOSED_PLANAR' 
    (3006, 0046) Number of Contour Points   IS: '5' 
    (3006, 0048) Contour Number      IS: '1' 
    (3006, 0050) Contour Data      DS: ['-200.0', '150.0', '-20 
0.0', '-200.0', '-150.0', '-200.0', '200.0', '-150.0', '-200.0', '200.0', '150.0 
', '-200.0', '-200.0', '150.0', '-200.0'] 
    --------- 
    (3006, 0042) Contour Geometric Type    CS: 'CLOSED_PLANAR' 
    (3006, 0046) Number of Contour Points   IS: '6' 
    (3006, 0048) Contour Number      IS: '2' 
    (3006, 0050) Contour Data      DS: ['200.0', '-0.0', '-190. 
0', '200.0', '-150.0', '-190.0', '-200.0', '-150.0', '-190.0', '-200.0', '150.0' 
, '-190.0', '200.0', '150.0', '-190.0', '200.0', '-0.0', '-190.0'] 
    --------- 
    (3006, 0042) Contour Geometric Type    CS: 'CLOSED_PLANAR' 
    (3006, 0046) Number of Contour Points   IS: '6' 
    (3006, 0048) Contour Number      IS: '3' 
    (3006, 0050) Contour Data      DS: ['200.0', '-0.0', '-180. 
0', '200.0', '-150.0', '-180.0', '-200.0', '-150.0', '-180.0', '-200.0', '150.0' 
, '-180.0', '200.0', '150.0', '-180.0', '200.0', '-0.0', '-180.0'] 
    --------- 
(3006, 0084) Referenced ROI Number    IS: '1' 

的数据被存储(在这种情况下,像通常那样)作为一组用于每个坐标平面。要获得数据一个轮廓,为一个平面,可以使用

>>> ctrs[0].ContourSequence[0].ContourData 
['-200.0', '150.0', '-200.0', '-200.0', '-150.0', '-200.0', '200.0', '-150.0', ' 
-200.0', '200.0', '150.0', '-200.0', '-200.0', '150.0', '-200.0'] 

这些是(X,Y,Z)坐标一前一后三胞胎。

您可以在StructureSetROISequence序列中找到有关每个轮廓(名称等)的更多信息,以了解引用ROI编号给出的索引。

通过在ContourSequence中为每个特定轮廓循环遍历每个数据集并将它们附加到一个数组中,可以获得所有这些数组的完整数组。

+0

谢谢你的回复。是的,这也是我现在所处的位置。但是,也许我做错了,一些轮廓不是他们应该做的。这就像这些坐标只是轮廓的轮廓。因此,如果轮廓中有孔,比如当你有膀胱壁时(例如),我似乎没有获得壁的宽度,但更多的只是轮廓的轮廓。所以原则上,膀胱壁和膀胱坐标几乎是一样的,即使壁应该有轮廓以及内线。至少这就是我在绘图时看到的 –