医学图像处理入门:.nii与DICOM格式的查看与分析方法

张开发
2026/5/24 1:07:47 15 分钟阅读
医学图像处理入门:.nii与DICOM格式的查看与分析方法
1. 医学图像处理入门为什么选择.nii和DICOM格式当你第一次接触医学图像处理时可能会被各种文件格式搞得晕头转向。在众多格式中.nii和DICOM是最常见的两种它们就像是医学图像界的普通话和方言——各有特点但都不可或缺。.nii格式Neuroimaging Informatics Technology Initiative是神经影像学领域的标准格式它最大的特点是把图像数据和元信息打包在一个文件中就像把照片和照片的拍摄参数都装进一个信封里。这种格式特别适合做脑部MRI等三维图像分析我在处理阿尔茨海默症患者的脑部扫描时90%的数据都是.nii格式。DICOMDigital Imaging and Communications in Medicine则是医院影像科室的通用语言从X光片到CT扫描几乎所有的医疗设备输出的原始数据都是这个格式。它有点像老式相机用的胶片——每张图像单独存储但通过特殊的标记DICOM Tag记录拍摄参数和患者信息。记得我第一次处理DICOM数据时发现同一个病人的胸部CT可能分散在几百个文件中这和其他图像格式很不一样。这两种格式之所以成为医学图像处理的首选主要是因为标准化程度高全球医疗机构和科研团队都在使用信息完整不仅存储图像还包含关键的医学元数据工具生态丰富有大量专业软件和开源库支持提示如果你是临床医生转行做研究可能更熟悉DICOM如果是计算机背景进入医学AI领域可能会先接触.nii格式。2. 零基础查看.nii文件的两种实用方法2.1 用ITK-SNAP实现三维可视化ITK-SNAP是我推荐给新手的第一个工具它就像医学图像界的Photoshop但操作要简单得多。最新版本可以从官网直接下载安装过程和其他Windows软件没什么区别。这里分享一个实用技巧安装时记得勾选将.nii文件关联到ITK-SNAP这样以后双击文件就能直接打开。打开一个脑部MRI的.nii文件后你会看到类似MRI机器的操作界面——三个窗口分别显示横断面Axial、矢状面Sagittal和冠状面Coronal。我最喜欢的功能是用鼠标滚轮快速切换切片就像翻书一样查看大脑的每一层。对于肿瘤分析可以按住Shift鼠标左键来测量病灶尺寸这个功能在临床诊断中特别实用。进阶用法是加载分割结果。比如你有一个脑肿瘤分割的.nii文件直接拖到主窗口在弹出对话框选择Label Map就能看到半透明的彩色标注覆盖在原始图像上。不过要注意ITK-SNAP对同时显示多个分割结果确实支持有限这时候就需要我们的第二种方法了。2.2 用Python代码灵活分析.nii图像如果你需要更灵活的分析方式PythonSimpleITK组合是我的首选方案。先安装必要的库pip install SimpleITK numpy matplotlib下面这段代码可以显示带有多重标注的.nii图像import SimpleITK as sitk import matplotlib.pyplot as plt # 加载图像和分割结果 image sitk.ReadImage(brain_mri.nii) tumor_mask sitk.ReadImage(tumor_seg.nii) ventricle_mask sitk.ReadImage(ventricle_seg.nii) # 转换为numpy数组 image_array sitk.GetArrayFromImage(image) tumor_array sitk.GetArrayFromImage(tumor_mask) ventricle_array sitk.GetArrayFromImage(ventricle_mask) # 创建带轮廓的可视化 plt.figure(figsize(10,8)) plt.imshow(image_array[100,:,:], cmapgray) # 显示第100层切片 plt.contour(tumor_array[100,:,:], colorsr, linewidths0.5) plt.contour(ventricle_array[100,:,:], colorsb, linewidths0.5) plt.show()这种方法最大的优势是可以自定义显示方式。比如你想比较算法分割结果和医生标注的差异可以用不同颜色显示两种轮廓这在论文结果可视化时特别有用。另外通过调节cmap参数可以快速尝试不同的灰度映射方案找到最适合当前图像的显示效果。3. DICOM文件查看的实战技巧3.1 MicroDicom轻量级查看器入门MicroDicom是我电脑里常备的DICOM查看工具它的安装包只有20MB左右但对基础查看功能来说已经足够。第一次使用时要注意在Options→Settings里把默认窗宽窗位Window Level调成适合你专业领域的预设值比如肺部CT常用窗宽1500、窗位-600。查看DICOM序列有个小技巧把整个文件夹拖到MicroDicom窗口它会自动按切片位置排序。这时候按键盘上下键就能像翻动画书一样浏览整个扫描序列。我经常用这个功能快速检查数据质量比如查看是否有明显的运动伪影。测量工具是临床中最实用的功能之一。点击工具栏上的Length按钮在图像上两点间划线就能自动计算实际尺寸单位是mm。这个功能在评估肿瘤大小时特别重要记得我刚开始用时经常忘记先校准显示器DPI导致测量结果偏差很大。3.2 RadiAnt的高级三维重建虽然RadiAnt Viewer的免费版有功能限制但它的三维重建确实做得不错。加载DICOM序列后点击3D→MPR就能进入多平面重建模式。这里有个实用技巧按住Ctrl键的同时拖动鼠标可以同时调整三个切面的位置这在定位小病灶时效率特别高。对于需要定量分析的研究者RadiAnt的ROI感兴趣区域统计功能很实用。画一个区域后软件会自动计算该区域的均值、标准差、最大/最小像素值等统计量。我在做肝脏脂肪含量分析时就靠这个功能快速获取ROI内的CT值分布。不过要注意RadiAnt对DICOM标签的处理比较严格。如果遇到无法打开的文件可能是私有标签导致的兼容性问题。这时候可以先用MicroDicom打开并另存为标准DICOM文件通常就能解决问题。4. Python处理医学图像的进阶方法4.1 用pydicom解析DICOM元数据DICOM文件里藏着大量宝藏信息从扫描参数到患者基本信息都记录在标签中。pydicom库让提取这些信息变得非常简单import pydicom ds pydicom.dcmread(CT0001.dcm) print(f患者姓名{ds.PatientName}) print(f扫描设备{ds.Manufacturer}) print(f层厚{ds.SliceThickness}mm) print(fCT管电压{ds.KVP}kV) # 获取图像像素数据 import numpy as np pixel_data ds.pixel_array print(f图像尺寸{pixel_data.shape})在实际项目中我经常用这些元数据来自动分类不同扫描序列。比如通过SeriesDescription字段识别是平扫还是增强CT或者通过ImagePositionPatient计算切片间距当SliceThickness字段不可靠时特别有用。4.2 用SimpleITK进行图像配准.nii格式特别适合做图像配准Registration这类高级处理。下面是一个简单的配准示例把PET图像对齐到CT图像import SimpleITK as sitk # 加载图像 fixed_image sitk.ReadImage(CT.nii, sitk.sitkFloat32) moving_image sitk.ReadImage(PET.nii, sitk.sitkFloat32) # 初始化配准器 initial_transform sitk.CenteredTransformInitializer( fixed_image, moving_image, sitk.Euler3DTransform(), sitk.CenteredTransformInitializerFilter.GEOMETRY) # 执行配准 registration_method sitk.ImageRegistrationMethod() registration_method.SetMetricAsMattesMutualInformation(numberOfHistogramBins50) registration_method.SetOptimizerAsGradientDescent(learningRate1.0, numberOfIterations100) registration_method.SetInitialTransform(initial_transform) final_transform registration_method.Execute(fixed_image, moving_image) # 应用变换并保存结果 resampled_image sitk.Resample(moving_image, fixed_image, final_transform, sitk.sitkLinear, 0.0) sitk.WriteImage(resampled_image, PET_registered.nii)这个流程在肿瘤放疗计划系统中很常见把功能影像PET和解剖影像CT对齐后医生能更准确地确定放疗靶区。配准过程中最关键的参数是相似性度量Metric和优化器Optimizer需要根据图像特点调整。4.3 医学图像的可视化技巧用matplotlib直接显示医学图像经常会遇到对比度不足的问题。这里分享几个实用技巧# 自适应窗宽窗位 def auto_window_level(image, sigma3.0): mean np.mean(image) std sigma * np.std(image) vmin max(image.min(), mean - std) vmax min(image.max(), mean std) return vmin, vmax # 显示DICOM图像 plt.imshow(pixel_data, cmapgray, vminauto_window_level(pixel_data)[0], vmaxauto_window_level(pixel_data)[1]) plt.colorbar() plt.title(fCT值范围[{pixel_data.min():.0f}, {pixel_data.max():.0f}])对于.nii格式的三维数据可以使用ipywidgets创建交互式查看器from ipywidgets import interact def scroll_through_volume(volume, slice_idx0): plt.imshow(volume[slice_idx,:,:], cmapgray) plt.title(fSlice {slice_idx}) interact(scroll_through_volume, volumefixed(volume_array), slice_idx(0, volume_array.shape[0]-1))这种交互式查看方式在数据清洗阶段特别有用可以快速浏览整个扫描序列检查是否有异常切片或伪影。我在处理公开数据集时经常用这个方法发现数据质量问题比如患者移动导致的模糊切片。

更多文章