2017-10-10 11 views
7

Vì vậy, nếu tôi có hình ảnh (CT, MRI, vv) hoặc thậm chí một liều xạ trị, tôi có thể rút ra các giá trị liều hoặc hình ảnh thành một mảng thông qua:Lấy các đường nét cấu trúc DICOM như mảng trong Python

import dicom 

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

print ds.pixel_array 

Điều này khá đơn giản và cho tôi khả năng thao tác hình ảnh/liều theo ý muốn. Tuy nhiên, thông thường bạn cũng có một tệp cấu trúc bao gồm các cấu trúc đường viền khác nhau mà sau đó bạn có thể nhìn thấy trong trình xem hình ảnh hoặc thứ gì đó tương tự. Một lần nữa, khá đơn giản.

Vấn đề của tôi là tôi cũng muốn các cấu trúc riêng lẻ này như một mảng. Và nếu tôi chạy cùng một mã, tôi chỉ nhận được TypeError: No pixel data found in this dataset.

Tôi đoán cấu trúc rằng các tệp DICOM không được "tạo" giống như tệp DICOM liều/hình ảnh.

Vì vậy, có một giải pháp cho điều này mà tôi đã không thể tìm thấy? Tôi cũng đã xem xét các gói dicompyler_core, nhưng từ những gì tôi có thể thấy không có cách nào để "chỉ" nhận ra các cấu trúc khác nhau thành mảng.

+1

Vui lòng cung cấp UID lớp SOP của tệp DICOM được đề cập để chúng tôi biết cách thông tin được mã hóa. –

+0

@kritzel_sw Ồ, xin lỗi vì phản hồi chậm. Nếu tôi sử dụng thẻ "SOP lớp UID" trên tệp cấu trúc của tôi, tôi nhận được: Bộ lưu trữ cấu trúc RT. Không biết nếu đó là những gì bạn đã yêu cầu? –

Trả lời

2

Dưới đây là một phiên tương tác minh họa cách bố trí dữ liệu bằng cách sử dụng tập tin rtstruct.dcm kèm 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' 

Dữ liệu được lưu trữ (trong trường hợp này, như là bình thường) như một tập hợp các tọa độ cho mỗi máy bay. Để lấy dữ liệu cho một đường bao, đối với một mặt phẳng, bạn có thể sử dụng

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

Đây là ba (x, y, z) tọa độ cái này với nhau.

Bạn có thể tìm hiểu thêm thông tin về mỗi đường bao (tên, v.v ..) trong trình tự StructureSetROISequence, cho chỉ mục được cung cấp bởi Số ROI được tham chiếu.

Bạn có thể nhận được một mảng hoàn chỉnh cho tất cả những điều này bằng cách lặp qua từng tập dữ liệu trong ContourSequence cho đường bao cụ thể đó và nối chúng lại với nhau thành một mảng.

+0

Cảm ơn bạn đã trả lời. Và có, đây cũng là khá nhiều nơi tôi đang ở ngay bây giờ. Nhưng, và có lẽ tôi đang làm điều đó một cách sai lầm, một số đường nét không phải là những gì họ được cho là. Nó giống như những tọa độ này chỉ làm đường viền của một đường bao. Vì vậy, nếu các đường viền có lỗ trong nó, như khi bạn có một bức tường bàng quang (ví dụ), tôi dường như không nhận được chiều rộng của bức tường, nhưng nhiều hơn chỉ là phác thảo của các đường viền. Vì vậy, về nguyên tắc, các bức tường bàng quang và bàng quang tọa độ là khá nhiều giống nhau, mặc dù bức tường nên có một phác thảo cũng như một dòng bên trong. Ít nhất đó là những gì tôi thấy khi vẽ đồ thị –

Các vấn đề liên quan