web-dev-qa-db-ja.com

Python)の配列としてDICOM構造の輪郭を取得する

したがって、画像(CT、MRIなど)または放射線療法からの線量さえあれば、次の方法で線量または画像の値を配列に引き出すことができます。

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パッケージも調べましたが、私が見たところ、さまざまな構造を配列に「ただ」取り出す方法はありませんでした。

9
Denver Dang

これは、pydicomに含まれているrtstruct.dcmファイルを使用したデータレイアウトを示すインタラクティブセッションです。

>>> 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'

データは(この場合、通常どおり)各平面の座標のセットとして保存されます。 1つの平面について、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内の各データセットをループし、それらを1つの配列に追加することで、これらすべての完全な配列を取得できます。

4
darcymason