如何用Python批量读取DICOM文件并进行深度学习处理
时间: 2025-06-28 21:16:33 浏览: 14
### 使用Python批量读取DICOM文件并进行深度学习处理
为了有效地利用医学影像数据进行深度学习,通常需要先将原始的DICOM格式转换成更适用于机器学习算法的数据格式,比如NII格式[^1]。然而,在某些情况下也可以直接操作DICOM文件来进行预处理和模型训练。
#### 批量读取DICOM文件
可以借助`pydicom`库来加载单个或多个DICOM图像,并提取其中感兴趣的信息字段。对于大批量文件的操作,则可以通过遍历指定目录下的所有`.dcm`扩展名文件完成自动化流程:
```python
import os
import pydicom
from pathlib import Path
def load_dicoms_from_folder(folder_path):
"""Load all DICOM files from a given folder."""
dicom_files = list(Path(folder_path).glob('*.dcm'))
datasets = []
for file_name in dicom_files:
try:
ds = pydicom.dcmread(file_name)
datasets.append(ds)
except Exception as e:
print(f"Could not read {file_name}, skipping... Error: {str(e)}")
return datasets
```
此函数会返回一个包含所有已解析DicomDataset对象列表的结果集,这些对象包含了每张图片及其关联属性。
#### 预处理与增强
一旦获取到了完整的数据集合之后,下一步就是针对具体应用场景执行相应的前处理步骤,例如裁剪、缩放以及标准化等变换;还可以考虑应用随机仿射变化或其他形式的数据扩增技术以增加样本多样性。这里推荐使用像`torchio`这样的专用工具包简化此类任务:
```python
import torchio as tio
class DicomPreprocessor(tio.Transform):
def __init__(self, target_shape=(128, 128), **kwargs):
super().__init__()
self.target_shape = target_shape
def apply_transform(self, subject):
# Resize to fixed dimensions
resize = tio.Resize(target_shape=self.target_shape)
transformed_subject = resize(subject)
return transformed_subject
```
上述自定义类继承自`tio.Transforms`,实现了基本的空间重采样逻辑。实际项目中可能还需要加入更多个性化的调整措施。
#### 构建PyTorch Dataset
最后一步是构建符合框架要求的数据迭代器接口,以便于后续接入神经网络架构之中参与端到端的学习过程。下面给出了一种基于`torch.utils.data.Dataset`抽象基类的具体实现方式:
```python
from typing import List
from torchvision.transforms.functional import normalize
import numpy as np
import torch
class CustomMedicalImageDataset(torch.utils.data.Dataset):
def __init__(
self,
dicom_datasets: List[pydicom.FileDataset],
transform=None
):
"""
Args:
dicom_datasets (List): A list of Pydicom FileDatasets.
transform (callable, optional): Optional transforms to be applied on an image sample.
"""
self.datasets = dicom_datasets
self.transform = transform
def __len__(self):
return len(self.datasets)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
img_data = self.datasets[idx].pixel_array.astype(np.float32)[np.newaxis,...]
sample = {'image': img_data}
if self.transform:
sample['image'] = self.transform(sample)['image']
normalized_image = normalize(
tensor=torch.from_numpy(sample['image']),
mean=[0.5], std=[0.5])
return normalized_image
```
该定制化版本允许传入任意数量经过初步筛选后的DICOM实例作为输入源,并提供了灵活配置外部transformer的能力,从而满足不同实验设计的需求。
阅读全文
相关推荐


















