首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pydicom从DICOMDIR文件中提取数据

使用Pydicom从DICOMDIR文件中提取数据
EN

Stack Overflow用户
提问于 2022-02-09 17:06:12
回答 1查看 535关注 0票数 1

我无法像往常一样在DICOM文件中读取,原因是错误:

代码语言:javascript
复制
AttributeError: 'DicomDir' object has no attribute 'DirectoryRecordSequence'

我试过:

  • pydicom.fileset.FileSet
  • 在dcmread中使用特定的标记
  • pydicom.filereader.read_dicomdir
  • pydicom.filereader.read_partial
  • 在dcmread中使用force=True

pydicom.filereader.read_file_meta_info是唯一没有返回错误和产生结果的东西;

代码语言:javascript
复制
(0002, 0000) File Meta Information Group Length  UL: 172
(0002, 0001) File Meta Information Version       OB: b'\x00\x01'
(0002, 0002) Media Storage SOP Class UID         UI: Media Storage Directory Storage
(0002, 0003) Media Storage SOP Instance UID      UI: 2.25.330614241706723499239981063503184149269
(0002, 0010) Transfer Syntax UID                 UI: Explicit VR Little Endian
(0002, 0012) Implementation Class UID            UI: 1.3.6.1.4.1.30071.8
(0002, 0013) Implementation Version Name         SH: 'fo-dicom 4.0.7'

此外,图像应该是一个常规的DICOM文件,而不是DICOMDIR。我可以在ImageJ中打开文件并查看头部信息,这样我就知道数据是可恢复的。有没有办法让我用Python阅读这个文件,或者强迫它忽略查找DirectoryRecordSequence?

编辑:使用FileSet的代码和堆栈跟踪:

代码语言:javascript
复制
from pydicom.fileset import FileSet
fs = FileSet("unprocessed.dcm")

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-2b6ba2e435fe> in <module>
      1 from pydicom.fileset import FileSet
----> 2 fs = FileSet("unprocessed.dcm")

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\fileset.py in __init__(self, ds)
    998         # Check the DICOMDIR dataset and create the record tree
    999         if ds:
-> 1000             self.load(ds)
   1001         else:
   1002             # New File-set

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\fileset.py in load(self, ds_or_path, include_orphans, raise_orphans)
   1641             ds = ds_or_path
   1642         else:
-> 1643             ds = dcmread(ds_or_path)
   1644 
   1645         sop_class = ds.file_meta.get("MediaStorageSOPClassUID", None)

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\filereader.py in dcmread(fp, defer_size, stop_before_pixels, force, specific_tags)
   1027         stop_when = _at_pixel_data
   1028     try:
-> 1029         dataset = read_partial(
   1030             fp,
   1031             stop_when,

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\filereader.py in read_partial(fileobj, stop_when, defer_size, force, specific_tags)
    879             DeprecationWarning
    880         )
--> 881         ds = DicomDir(
    882             fileobj,
    883             dataset,

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\dicomdir.py in __init__(self, filename_or_obj, dataset, preamble, file_meta, is_implicit_VR, is_little_endian)
     94 
     95         self.patient_records: List[Dataset] = []
---> 96         self.parse_records()
     97 
     98     def parse_records(self) -> None:

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\dicomdir.py in parse_records(self)
    125 
    126         # Build the mapping from file offsets to records
--> 127         records = self.DirectoryRecordSequence
    128         if not records:
    129             return

c:\****\appdata\local\programs\python\python38-32\lib\site-packages\pydicom\dataset.py in __getattr__(self, name)
    834             return {}
    835         # Try the base class attribute getter (fix for issue 332)
--> 836         return object.__getattribute__(self, name)
    837 
    838     @property

AttributeError: 'DicomDir' object has no attribute 'DirectoryRecordSequence'

EN

回答 1

Stack Overflow用户

发布于 2022-02-09 22:26:34

pydicom正确读取数据集,但由于它标识为,因此它将由不推荐的DicomDir类处理,即使直接传递给FileSet类也是如此。由于dataset不是有效的媒体存储目录实例,因此会失败,从而产生所见的异常。

您应该能够通过在读取期间更改文件元信息的(0002,0002)媒体存储SOP类UID来修复这个问题:

代码语言:javascript
复制
from pydicom import dcmread
from pydicom import config

def fix_sop_class(elem, **kwargs):
    if elem.tag == 0x00020002:
        # DigitalXRayImageStorageForProcessing
        elem = elem._replace(value=b"1.2.840.10008.5.1.4.1.1.1.1.1")

    return elem

config.data_element_callback = fix_sop_class

ds = dcmread('path/to/file')

通过更改SOP类UID,将跳过该处理并返回数据集。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71053788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档