2. Dicom文件格式转mhd,raw文件格式

   介绍:

    医学图像通常是通过dicom文件格式进行存储的,但为了便于读取和使用也常常将其转化为:每个病人一个mhd文件和一个同名的raw文件的格式,mhd即meta header data,数据头部信息,raw存储了像素信息,如下:


    其中mhd文件存储了dicom的头部信息,由于头部信息很多生成mhd的方法有所不同,所以这里展示了通过ITK(ITK是美国国家卫生院下属的国立医学图书馆开发的一款医学图像处理软件包,是一个开源的、跨平台的影像分析扩展软件工具。)产生mhd文件的文件内容,有以下头部信息


实现

下面是实现的代码,里面有详细的注释:

import cv2
import os
import pydicom
import numpy
import SimpleITK

# 路径和列表声明
PathDicom = "./DicomResource/"  # 与python文件同一个目录下的文件夹,存储dicom文件
SaveRawDicom = "./SaveRaw/"     # 与python文件同一个目录下的文件夹,用来存储mhd文件和raw文件
lstFilesDCM = []

# 将PathDicom文件夹下的dicom文件地址读取到lstFilesDCM中
for dirName, subdirList, fileList in os.walk(PathDicom):
	for filename in fileList:
		if ".dcm" in filename.lower():  # 判断文件是否为dicom文件
			print(filename)
			lstFilesDCM.append(os.path.join(dirName, filename))  # 加入到列表中

# 第一步:将第一张图片作为参考图片,并认为所有图片具有相同维度
RefDs = pydicom.read_file(lstFilesDCM[0])  # 读取第一张dicom图片

# 第二步:得到dicom图片所组成3D图片的维度
ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM)) # ConstPixelDims是一个元组

# 第三步:得到x方向和y方向的Spacing并得到z方向的层厚
ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))

# 第四步:得到图像的原点
Origin = RefDs.ImagePositionPatient

# 根据维度创建一个numpy的三维数组,并将元素类型设为:pixel_array.dtype
ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)  # array is a numpy array

# 第五步:遍历所有的dicom文件,读取图像数据,存放在numpy数组中
i = 0
for filenameDCM in lstFilesDCM:
	ds = pydicom.read_file(filenameDCM)
	ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array
	cv2.imwrite("out_" + str(i) + ".png", ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)])
	i += 1

# 第六步:对numpy数组进行转置,即把坐标轴(x,y,z)变换为(z,y,x),这样是dicom存储文件的格式,即第一个维度为z轴便于图片堆叠
ArrayDicom = numpy.transpose(ArrayDicom, (2, 0, 1))

# 第七步:将现在的numpy数组通过SimpleITK转化为mhd和raw文件
sitk_img = SimpleITK.GetImageFromArray(ArrayDicom, isVector=False)
sitk_img.SetSpacing(ConstPixelSpacing)
sitk_img.SetOrigin(Origin)
SimpleITK.WriteImage(sitk_img, os.path.join(SaveRawDicom, "sample" + ".mhd"))

   结果:

    将dicom文件进行转化,产生mhd和raw文件

<think>嗯,用户问的是CNN模型是否支持直接处理rawmhd文件。我需要先弄清楚这两种文件格式的特点,以及CNN模型通常的输入要求。 首先,raw文件通常是未经处理的原始二进制数据,可能没有包含元数据,比如图像的尺寸、数据类型等信息。而mhd文件通常是MetaImage格式的一部分,包含描述数据的元信息,比如维度、间距、数据类型等,配合raw文件一起使用。所以,处理这两种文件可能需要先读取元数据,然后将raw数据换为适合CNN输入的格式。 CNN模型本身处理的是张量数据,比如图像数据会换成多维数组,例如三维的(高度,宽度,通道数)或者四维的(批次大小,高度,宽度,通道数)。因此,无论原始数据是什么格式,只要最终能换成这些张量形式,CNN就可以处理。关键问题在于数据预处理阶段。 接下来,我需要检查用户提供的引用内容。引用[1]提到在处理LUNA16数据集时,需要将mhdraw文件路径等信息添加到列表中,这说明在代码中需要明确读取这些文件。引用[3]和[4]都提到了3D CNN模型,比如V-Net和多层级3D CNN,这些模型处理3D数据,可能需要特定的预处理步骤。 所以,用户可能是在处理医学图像数据,比如CT扫描,这些数据通常以mhdraw格式存储。用户想知道是否需要换格式,或者CNN能否直接读取这些文件。实际上,CNN本身不直接处理文件格式,而是依赖于数据预处理流程将文件换为张量。因此,回答需要说明预处理步骤的重要性,并提供一些常用的方法,比如使用SimpleITK或PyTorch的Dataset类来加载这些文件。 另外,用户可能对具体的代码实现感兴趣,可能需要示例代码来说明如何读取mhdraw文件,并将其换为数组。引用[1]中的代码片段显示他们使用了os.path.join来构建文件路径,这可能是在数据加载环节的一部分。因此,在回答中可以引用这一点,说明需要将文件路径正确传递给数据处理流程。 还需要注意不同框架的兼容性,比如TensorFlow和PyTorch都有自己的数据加载工具,但处理自定义格式通常需要自己编写读取代码。因此,建议用户使用现有的库来处理这些医学图像格式,如SimpleITK,这样可以简化预处理步骤。 总结来说,回答的结构应该是:首先说明CNN模型不直接支持这些格式,但可以通过预处理换;然后分步骤解释如何处理这些文件,包括读取、换为张量、输入到模型;最后给出示例代码和引用相关的资料,比如用户提供的引用[1]和[3]中的V-Net应用。</think>CNN模型本身不直接支持特定医学影像格式(如`.raw`和`.mhd`)的原始文件输入,但可以通过**数据预处理**将其换为CNN可处理的张量格式。以下是具体分析: --- ### 一、文件格式与CNN输入的关系 1. **`.mhd`文件特性** `.mhd`文件是医学影像中常见的元数据描述文件,包含图像尺寸、空间坐标、数据类型等参数,需配合二进制`.raw`文件使用[^1]。例如LUNA16数据集的原始格式便是这种组合。 2. **CNN输入要求** 无论是2D CNN还是3D CNN,输入数据最终需换为**张量格式**(如三维数组$(H \times W \times C)$或四维数组$(D \times H \times W \times C)$),并通过标准化处理(如归一化)。 --- ### 二、实现步骤 1. **数据读取** 使用医学图像处理库(如`SimpleITK`或`ITK`)读取`.mhd`和`.raw`文件: ```python import SimpleITK as sitk image = sitk.ReadImage("example.mhd") array = sitk.GetArrayFromImage(image) # 换为NumPy数组 ``` 2. **张量换** 将NumPy数组换为深度学习框架支持的张量格式: ```python import torch tensor = torch.from_numpy(array).float() # PyTorch张量 ``` 3. **输入模型** 通过自定义`Dataset`类实现批量加载,例如引用[1]中代码的改进版: ```python class MedicalDataset(torch.utils.data.Dataset): def __init__(self, file_list): self.samples = file_list # 包含.mhd路径和坐标信息 def __getitem__(self, idx): image = sitk.ReadImage(self.samples[idx][0]) array = sitk.GetArrayFromImage(image) return torch.tensor(array) ``` --- ### 三、3D CNN的特殊支持 针对医学影像的3D特性,可采用**3D卷积神经网络**(如V-Net[^3]、多层级3D CNN[^4])进行建模。例如V-Net通过跳跃连接处理3D数据中的空间特征,其输入需满足$(Depth \times Height \times Width)$的三维结构。 --- ### 四、扩展应用 1. **多模态数据处理** 若需要结合DICOM等格式,可扩展预处理流程,统一不同数据源的张量维度。 2. **性能优化** 使用内存映射(Memory Mapping)加速大型.raw文件的读取,或使用预处理缓存机制。 ---
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值