Pydicom+SimpleITK操作DICOM图像数据和TAG

本文详细介绍了如何使用Pydicom和SimpleITK库处理DICOM格式的医疗图像,包括打开压缩的DCM文件,进行图像分割,以及如何正确保存分割后的图像数据,同时保留原始DCM文件的元数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 当前的需求是将原始DCM文件进行器官分割后,把得到的图像数据再保存为新的dcm文件,且新的dcm文件头要保留原始DCM的基本信息,以便进行后期分析。操作过程中主要有几个问题:

    1. 本来只用了pydicom库,发现它打不开有压缩的dcm文件,官网也说了只能借助其他工具打开(如gdcm),所以行不通(搞不懂这么好用的pydiocm怎么会有这种问题)
    1. 后来改用Simple ITK库,dcm文件倒是都能打开,但是保存为新的dcm时又出了问题:Simple ITK保存时会自动生成Series UID,而且0002开头的tag都不能修改,导致最后生成的dcm文件都不是一个序列,十分蛋疼
    1. 中间就差自己写代码解码dcm文件了,最后是结合pydicom和simpleitk,即用simpleitk读数据,pydicom处理tag并写入新的dcm,成功解决。
  • Pydicom

  • 官网及官方教程:https://pydicom.github.io/pydicom/stable/index.html

  • 利用pydicom读写并修改图像数据

    import pydicom
           
    dataset = pydicom.dcmread('.\001.dcm')                #读取dicom文件
    #val = dataset.data_element('Columns').value          #根据TAG获得其值,可以读写所有tag
    pixeldata = dataset.pixel_array                       #获得图像数据的矩阵形式,只读
    databyte = dataset.PixelData                          #获得图像的byte数据,可直接读写
    
    datanew = pixeldata[0:400, 0:400]                     #截取原图像的一部分
    dataset.Rows, dataset.Columns = datanew.shape         #图像矩阵大小的另一种快速读写方法
    
    newArray = np.ones([400, 400])+254                    #新建一个对应大小的图像数据矩阵
    
    data16 = np.int16(newArray)                           #必须转为int16
    
    #dataset.pixel_array.data = data16                    #第一种修改图像数据的方法,直接修改像素值
    
    dataset.PixelData = data16.tobytes()                  #第二种修改图像数据的方法,修改byte值,建议用这种方式
    
    dataset.save_as(r'.\002.dcm')                         #保存为新dcm文件
    

如果想把一个dcm的图像数据复制到另一个dcm中,需要考虑和pixeldata读写相关的一些tag,除了rows,columns,还有斜率/截距,高低位等,要提前修改。

import SimpleITK as sitk

image = sitk.ReadImage('.\001.dcm')                                 #读取dicom文件
image_array = sitk.GetArrayFromImage(image)
np_array = np.int16(image_array)
image_array = np.squeeze(np_array)                                  #获得图像数据

im = sitk.GetImageFromArray(image_array)                            #用来读写Tag,相当于开始以imagearray构建一个新dcm

reader = sitk.ImageFileReader()
reader.SetFileName('.\002.dcm')
reader.LoadPrivateTagsOn()
reader.ReadImageInformation()                                       #获得Tag信息

ImageType = reader.GetMetaData('0008|0008')                         #读取对应的Tag,0002开头的不能读写
im.EraseMetaData('0008|0008')                                       #删除Tag,更改的话可以不写
im.SetMetaData('0008|0008', ImageType)                              #更改新dcm的Tag值

SOPClassUID = reader.GetMetaData('0008|0016')
im.SetMetaData('0008|0016',SOPClassUID)

SOPInstanceUID = reader.GetMetaData('0008|0018')
im.SetMetaData('0008|0018', SOPInstanceUID)

SeriesInstanceUID = reader.GetMetaData('0020|000e')                 #这个Tag改不了,保存时貌似会随机赋值
im.SetMetaData('0020|000e', SeriesInstanceUID)

sitk.WriteImage(im, '.\003.dcm')                                    #保存为新dcm,不过不能组成序列
  • 利用pydicom+Simple ITK读写有压缩分段的dcm
 dcm = pydicom.dcmread('.\001.dcm')                                  #选择一个普通的非压缩dcm文件作为转换模板
 
 image = sitk.ReadImage('.\002.dcm')                  
 image_array = sitk.GetArrayFromImage(image)
 np_array = np.int16(image_array)
 image_array = np.squeeze(np_array)                                  #读取有压缩分段的dcm图像数据
 
 dataset = pydicom.dcmread('.\002.dcm')                              #用来修改Tag,图像读写相关的tag都要改
 dcm.data_element('PixelSpacing').value = dataset.data_element('PixelSpacing').value
 dcm.data_element('RescaleIntercept').value = dataset.data_element('RescaleIntercept').value
 dcm.data_element('RescaleSlope').value = dataset.data_element('RescaleSlope').value

 dcm.PixelData = image_array.tobytes()
 dcm.save_as('.\002.dcm')                                            #保存文件
<think>好的,我现在需要详细介绍一下医疗图像中的RAW图像DICOM图像的区别特点。首先,我得确认自己对这两个概念的理解是否正确,然后再组织语言,确保回答准确、结构清晰,符合用户的需求。 首先,RAW图像在医疗领域通常指的是未经处理的原始数据。这类数据直接从成像设备(如CT、MRI等)的传感器获取,没有经过压缩或转换。可能需要确认RAW数据的格式是否因设备厂商而异,以及它的应用场景,比如科研或后期处理需要高保真数据的情况。 然后是DICOM图像,这应该是医疗影像的标准格式,包含图像数据患者信息、检查参数等元数据。需要说明DICOM的结构,比如文件头信息像素数据,以及它如何促进医疗数据的互通性。可能还要提到DICOM在临床中的广泛应用,比如医院之间的图像传输、PACS系统的使用等。 接下来要考虑两者的对比,包括数据内容、应用场景、兼容性、处理需求等方面。可能需要指出RAW适合需要深度处理的研究,而DICOM适合临床诊断标准化流程。此外,用户可能关心为何选择其中一种格式,或者如何转换两者之间的格式。 需要注意避免技术错误,比如DICOM是否真的支持三维数据,或者RAW是否真的没有元数据。同时,要确保术语准确,比如DICOM的全称是Digital Imaging and Communications in Medicine,可能需要提到这一点。 还要考虑用户可能的深层需求,比如他们可能在处理医疗图像时遇到转换问题,或者在研究中使用RAW数据需要了解其优缺点。因此,在回答中可以加入一些实际案例或处理流程,帮助用户更好地理解应用场景。 最后,确保回答结构清晰,分点说明,使用适当的例子技术细节,但不过于晦涩。可能需要使用比喻或对比表格来增强可读性。同时,检查是否有遗漏的重要信息,比如DICOM的安全性、RAW文件的大小处理难度等。 总结思考步骤:确认定义特点→对比分析→应用场景→常见问题→总结。需要确保每个部分逻辑连贯,信息准确,并且用中文自然表达,避免直译术语造成的理解困难。</think>以下是关于医疗图像中 **RAW 图像** **DICOM 图像** 的详细对比与解析: --- ### 一、RAW 图像:原始数据层 #### 1. **定义与特点** - **直接采集数据**:从医疗设备(如 CT、MRI、X 射线探测器)传感器直接输出的二进制数据,未经任何压缩或标准化处理。 - **高保真性**:保留完整的原始信号信息(如光子计数、磁场强度等),无动态范围损失。 - **无元数据**:通常不含患者信息、设备参数或图像注释,仅包含像素/体素矩阵。 #### 2. **技术细节** - **格式多样性**:不同厂商使用私有格式(如西门子 `.raw`、GE 的 `.his`),需专用软件解析。 - **数据维度**:可能包含时间序列(如动态增强 MRI)、多通道(如 PET-CT 融合数据)。 - **典型应用**:科研分析、算法训练、影像后处理(如去噪、三维重建)。 #### 3. **处理流程示例** ```plaintext CT 探测器 → RAW 数据(光子计数矩阵) → 重建算法 → 图像切片 → DICOM 转换 ``` --- ### 二、DICOM 图像:标准化临床层 #### 1. **定义与特点** - **国际标准**:遵循 **DICOM(Digital Imaging and Communications in Medicine)** 协议,全球医疗影像通用格式。 - **数据封装**:包含两部分: - **元数据**:患者信息(姓名、ID)、设备参数(kVp、层厚)、检查描述(DICOM Tag 标注)。 - **像素数据**:已重建的医疗图像(如 CT 的 Hounsfield 单位矩阵)。 - **兼容性**:支持跨平台传输(如 PACS 系统)可视化(如 OsiriX、RadiAnt)。 #### 2. **文件结构** ```plaintext DICOM 文件头 (0002,0010) → 患者信息 (0010,0010) → 图像参数 (0028,0030) → 像素数据 (7FE0,0010) ``` #### 3. **核心优势** - **临床合规性**:符合 HIPAA 等医疗数据安全规范。 - **三维支持**:通过 `DICOM Series` 管理多层扫描数据(如 CT 卷数据)。 - **工作流整合**:支持影像归档(PACS)、报告生成(RIS) AI 辅助诊断。 --- ### 三、关键差异对比 | **特性** | **RAW 图像** | **DICOM 图像** | |------------------|------------------------------------------|----------------------------------------| | **数据内容** | 原始信号(如光子计数、射频信号) | 重建后的像素值 + 结构化元数据 | | **元数据** | 无 | 包含患者、设备、检查等完整信息 | | **文件格式** | 厂商私有格式 | 标准 DICOM 格式(`.dcm`) | | **主要用途** | 科研、算法开发 | 临床诊断、医院信息系统 | | **处理软件** | MATLAB、Python(需自定义解析) | OsiriX、Horos、3D Slicer | | **数据量** | 极大(可能达 TB 级) | 较小(有损/无损压缩选项) | --- ### 四、转换与互操作性 1. **RAW → DICOM** - 需添加元数据并转换像素值(如 CT 的 Hounsfield 单位校准)。 - 工具:`dcmtk`、`pydicom`(Python 库)。 ```python import pydicom ds = pydicom.Dataset() ds.PatientName = "John Doe" ds.PixelData = raw_pixel_array.tobytes() ds.save_as("output.dcm") ``` 2. **DICOM → RAW** - 提取像素数据并去除元数据(可能丢失临床信息)。 - 工具:`GDCM`、`SimpleITK`。 --- ### 五、实际应用场景 - **RAW 的典型使用**: - 开发新型重建算法(如低剂量 CT 去噪)。 - 研究不同扫描参数对图像质量的影响。 - **DICOM 的典型使用**: - 放射科医生阅片诊断。 - 跨医院共享患者影像数据。 --- ### 六、常见问题 1. **为何临床不直接使用 RAW 数据?** - RAW 数据未校准且无元数据,无法直接用于诊断。 - DICOM 标准化确保数据可追溯性安全性。 2. **DICOM 能否包含 RAW 数据?** - 是,部分厂商通过私有 Tag 嵌入 RAW 数据,但需专用工具解析。 --- ### 总结 - **RAW 图像**是医疗影像的“原始底片”,适合深度处理研究。 - **DICOM 图像**是临床工作的“标准化成品”,整合了图像与诊疗信息。 - 两者互补:RAW 为研究提供源头数据DICOM 为临床提供结构化信息流。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值