使用Python读取DICOM序列

DICOM(Digital Imaging and Communications in Medicine,数字成像和医疗通信)是一种医疗成像的标准格式,广泛用于存储和传输医学图像,如CT、MRI和X射线。对于从事医学影像分析或机器学习的开发者而言,能够高效地读取和处理DICOM文件显得尤为重要。本文将介绍如何使用Python读取DICOM序列,并提供示例代码。

DICOM文件的基本结构

一个DICOM文件由多个组成部分构成,包括:

  • 数据集:包含各种图像数据和元数据(如患者信息、成像参数等)。
  • 文件头:存储DICOM文件的元信息,例如文件格式版本等。

安装必要的库

在Python中,处理DICOM文件的常用库有pydicomnumpy。首先,我们需要安装这两个库。可以使用以下命令进行安装:

pip install pydicom numpy

使用pydicom读取DICOM文件

读取单个DICOM文件

在能够读取整个DICOM序列之前,我们先从读取单个DICOM文件开始。以下是加载一个DICOM文件的基本示例:

import pydicom
import matplotlib.pyplot as plt

# 读取DICOM文件
file_path = "path/to/dicom/file.dcm"  # 替换为你的DICOM文件路径
dicom_data = pydicom.dcmread(file_path)

# 打印DICOM的基本信息
print("Patient's Name:", dicom_data.PatientName)
print("Patient ID:", dicom_data.PatientID)
print("Study Date:", dicom_data.StudyDate)

# 显示图像
plt.imshow(dicom_data.pixel_array, cmap=plt.cm.bone)
plt.title("DICOM Image")
plt.axis('off')
plt.show()

读取DICOM序列

实际应用中,通常需要处理DICOM序列(比如CT扫描的多张切片)。下例展示了如何读取一个文件夹中的所有DICOM文件并将它们存储为NumPy数组。

假设你的DICOM文件存放在一个文件夹中,代码如下:

import os
import pydicom
import numpy as np

def read_dicom_series(folder_path):
    dicom_files = [pydicom.dcmread(os.path.join(folder_path, file)) for file in os.listdir(folder_path) if file.endswith('.dcm')]
    dicom_files.sort(key=lambda x: x.InstanceNumber)  # 按照切片序号排序

    # 提取像素数组
    images = np.array([file.pixel_array for file in dicom_files])
    
    return images

folder_path = "path/to/dicom/series"  # 替换为你的文件夹路径
dicom_images = read_dicom_series(folder_path)

# 显示第一张切片
plt.imshow(dicom_images[0], cmap=plt.cm.bone)
plt.title("First Slice of DICOM Series")
plt.axis('off')
plt.show()

处理DICOM元数据

除了图像数据,DICOM还包含丰富的元数据,下面是如何提取和打印不同类型信息的示例代码:

def print_dicom_metadata(dicom_data):
    print("Study Instance UID:", dicom_data.StudyInstanceUID)
    print("Modality:", dicom_data.Modality)
    print("Manufacturer:", dicom_data.Manufacturer)
    print("Slice Thickness:", dicom_data.SliceThickness)

# 示例:读取并打印元数据
dicom_metadata = pydicom.dcmread(file_path)
print_dicom_metadata(dicom_metadata)

DICOM类图

以下是DICOM相关类的类图,展示了如何在Python中组织相关操作。

classDiagram
    class DICOMReader {
        +read_dicom(file_path: str)
        +read_series(folder_path: str)
    }
    class DICOMMetadata {
        +print_metadata(dicom_data)
    }
    DICOMReader --> DICOMMetadata : Uses

使用DICOM序列进行图像处理

在读取了DICOM序列后,你可能需要进行图像处理,比如重建图像、图像分析等。可以使用Python中的其他库,如OpenCVscikit-image等进行高级处理。

结尾

通过以上内容,我们简要介绍了如何使用Python读取DICOM文件及序列,包括提取图像和元数据。DICOM文件的灵活性和拓展性使其在医学影像分析中不可或缺。掌握这一技能对于从事医学影像研究、机器学习和图像处理的开发者而言具有重要意义。希望本文能为你在医学影像的探索中提供一些帮助。