匿名化后如何以dicom格式保存Dicom图像?

Bil*_*lal 1 pydicom

  • 我读了一个带有所有元数据的 dicom 图像,并对一些字段进行了匿名处理,之后我想再写一次,但出现错误: if None in (dataset.is_little_endian, dataset.is_implicit_VR): AttributeError: 'dict' object has no attribute 'is_little_endian'
  • 我阅读了pydicom文档,但不明白该怎么做!
  • 我怎样才能在一份工作指令中重新写一遍?
  • 编辑:生日改为None代替'None',并dcmwriteinsted的的save_as
import pydicom
from pydicom.misc import is_dicom

fp ='1.dcm'
dico = pydicom.filereader.dcmread(fp)
if(is_dicom(dico)):
        dico['PatientID']= 'None'
        dico['PatientBirthDate'] = None
        dico['is_little_endian'] = True
        dico['is_implicit_VR'] = True
        path = '/dataset'
        # dico.save_as(os.path.join(path,'Anonymous.dcm'))
        pydicom.dcmwrite(os.path.join(path,'Anonymous.dcm'), dico)
Run Code Online (Sandbox Code Playgroud)

MrB*_*men 5

好的,save_as如果您像第一次尝试一样使用它,那么 using 应该确实有效。这是应该起作用的代码:

import pydicom
from pydicom.misc import is_dicom

dico = pydicom.filereader.dcmread('1.dcm')
dico.PatientID = 'None'
dico.PatientBirthDate = None
path = '/dataset'
dico.save_as(os.path.join(path,'Anonymous.dcm'))
# alternatively:
# dcmwrite(os.path.join(path,'Anonymous.dcm', dico)
Run Code Online (Sandbox Code Playgroud)

请注意,我已更改dico['PatientID']dico.PatientID. 这不仅是一个方便的快捷方式,而且还改变了语义:如果您分配给dico['PatientID'],则必须分配一个DataElement

dico['PatientID'] = DataElement(0x00100020, 'PN', b'None')
Run Code Online (Sandbox Code Playgroud)

而如果使用关键字,则可以直接赋值(在DataElement内部转换为 a)。

我同意文档在这方面有些缺乏 - 我认为添加一个简单的示例来读取 DICOM 文件、修改它并将其写回是有意义的。但如果您查看基本数据集文档,您应该会找到大部分所需的信息。

关于上述属性的注释is_little_endianis_implicit_VR:仅当您编写没有传输语法集的新数据集时才需要这些属性。是该情况的一个示例。如果数据集是从有效的 DICOM 文件中读取的,则它已设置了这些属性。