使用 pydicom 通过 DICOMDIR 访问 DICOM 文件

Access DICOM files via DICOMDIR using pydicom

我不熟悉这种文件类型。我想通过访问位于该文件夹旁边的 DICOMDIR 来访问文件夹 S65279_1148582599_LIVER__QIU__SHIFU__M_53 中的文件。在文件夹内,我想访问文件夹中的“IMG”文件,如下所示:

IMGO00O0000 2021/12/22 8:55 13,408 KB
IMGOO000001 2021/12/2  8:55 13,840 KB
IMGO0000002 2021/12/22 8:54 8 KB
IMG00000035 2021/12/22 8:54 103 KB
IMGOO000739 2021/12/22 8:54 2 KB
Objects.xml 2021/12/22 8:54 11 KB

使用 dcmread 读取 DICOMDIR 文件后,我得到如下信息:

(0004, 0000) Group Length                        UL: 232
(ee04, 1400) Offset of the Next Directory Record UL: e
(0004, 1410) Record In-use Flag                  US: 65535
(e004, 1420) Offset of Referenced Lower-Level Di UL: 0
(e004, 1430) Directory Record Type               CS: 'SR DOCUMENT'
(e004, 1500) Referenced File ID                  CS: ['S65279_1148582599_LIVER_QIU_SHIFU_M_53', 'IMGOOOR0739']
(0004, 1510) Referenced sOP Class UID in File    UI: Comprehensive SR Storage
(eee4, 1511) Referenced sOP Instance UID in File UI: 1.2.276.0.48.10201. 1.20110506073656578008
(0004, 1512) Referenced Transfer Syntax UID in F UI: Explicit VR Little Endian
(0008, 0e00) Group Length                        UL: 48
(0008, 0005) Specific Character Set              CS: 'IS0_IR 192'
(0008, 0023) Content Date                        DA: '20110322'
(e008, e033) Content Time                        TM: '095212'
(0020, e000) Group Length                        UL: 10
(ea20, 0013) Instance Number                     IS: '0'

我应该如何获得 'IMG00000739'?我曾尝试使用 ds[0x0004,0x1500] 访问 ReferenceFileID,但这不起作用。

DICOMDIR 文件包含患者、研究、系列和图像及其某些属性的目录记录的链接列表。如果您只需要 DICOMDIR 中引用的 DICOM 文件列表,您可以找到所有 ReferencedFileID 标签,其中包含路径组件作为列表。 ReferencedFileID 仅出现在图像级目录记录中,因此如果您搜索这些条目,您将获得所有包含的 DICOM 图像的路径。

pydicom 中,DICOMDIR 由 FileSet 表示,它处理该文件类型的细节并允许您搜索目录记录。
所以,如果你想获得 DICOMDIR 中引用的所有 DICOM 文件路径,你可以这样做:

from pydicom import dcmread 
from pydicom.fileset import FileSet

ds = dcmread(dicomdir_path)
fs = FileSet(ds)
root_path = fs.path
# returns all contained values if IMAGE level entries
file_ids = fs.find_values("ReferencedFileID")
for file_id in file_ids:
    # file_id is a list, unpack it into the components using *
    dcm_path = os.path.join(root_path, *file_id)
    print(dcm_path) # here you can collect the paths or load the dataset