如何获取DICOM CT图像的3D体积?Python DICOM图像处理咨询
把CT DICOM切片转为Volume并可视化的实用方案
嘿,刚入门DICOM图像处理太正常了,咱们一步步来搞定这个问题~你提到的初始化空白矩阵构建Volume的思路完全正确,先把所有切片的pixel_array整合为三维数组,之后就能轻松做可视化和后续运算了。
第一步:构建3D Volume矩阵
首先得把散列的DICOM切片按扫描顺序整合,这里要注意:文件夹里的切片文件名不一定是按扫描顺序排列的,必须用DICOM元数据里的位置信息排序,不然Volume会乱序。
用pydicom库实现的代码示例:
import pydicom import numpy as np import os # 替换成你的CT切片文件夹路径 dicom_folder = "./ct_slices" # 读取文件夹内所有DICOM文件 dicom_slices = [] for filename in os.listdir(dicom_folder): if filename.endswith(".dcm"): filepath = os.path.join(dicom_folder, filename) dicom_slices.append(pydicom.dcmread(filepath)) # 关键:按Z轴位置排序(保证切片顺序正确) dicom_slices.sort(key=lambda slice: slice.ImagePositionPatient[2]) # 获取单张切片的尺寸 height, width = dicom_slices[0].pixel_array.shape slice_count = len(dicom_slices) # 初始化空白Volume矩阵(维度:height × width × slice_count) volume = np.zeros((height, width, slice_count), dtype=np.int16) # 填充每个切片的像素值 for idx, slice in enumerate(dicom_slices): volume[:, :, idx] = slice.pixel_array
小提示:如果需要真实的CT值(HU值),记得把原始像素值转换一下:
# 转换为HU值,更贴近真实组织密度 rescale_slope = dicom_slices[0].RescaleSlope rescale_intercept = dicom_slices[0].RescaleIntercept volume = volume * rescale_slope + rescale_intercept
第二步:Volume可视化的三种常用方法
1. Matplotlib:快速查看平面切片(入门首选)
适合快速查看不同方位的切片(轴向、冠状位、矢状位),不需要复杂配置:
import matplotlib.pyplot as plt # 显示轴向中间切片 plt.figure(figsize=(8, 8)) plt.imshow(volume[:, :, slice_count//2], cmap="gray") plt.title("轴向中间切片") plt.axis("off") plt.show() # 显示冠状位中间切片 plt.figure(figsize=(8, 8)) plt.imshow(volume[:, slice_count//2, :], cmap="gray") plt.title("冠状位中间切片") plt.axis("off") plt.show()
2. Mayavi:真3D体渲染(专业直观)
Mayavi能生成高质量的3D体绘制效果,适合直观展示整个Volume的结构,需要先安装:pip install mayavi
from mayavi import mlab # 创建3D体绘制窗口 mlab.figure(bgcolor=(0, 0, 0)) # 将Volume转为标量场 src = mlab.pipeline.scalar_field(volume) # 设置体渲染的阈值和透明度,vmax可以调整来突出不同组织 mlab.pipeline.volume(src, vmin=np.min(volume), vmax=np.max(volume)*0.5) mlab.title("CT Volume 3D可视化") mlab.show()
3. Plotly:交互式3D可视化(适合网页分享)
Plotly生成的可视化支持鼠标拖拽旋转、缩放,非常适合网页展示或交互式分析:
import plotly.graph_objects as go fig = go.Figure(data=go.Volume( z=np.arange(volume.shape[2]), y=np.arange(volume.shape[1]), x=np.arange(volume.shape[0]), value=volume, isomin=np.percentile(volume, 10), # 调整下限阈值 isomax=np.percentile(volume, 90), # 调整上限阈值 opacity=0.1, # 整体透明度 surface_count=20, # 等值面数量 colorscale="gray" )) fig.update_layout(title="交互式CT Volume可视化") fig.show()
小提醒
- 维度顺序:不同可视化库对数组维度的要求可能不同,如果显示异常,可以用
np.transpose(volume, (2, 0, 1))调整轴的顺序。 - 性能优化:如果切片数量多、分辨率高,建议先对Volume做降采样(比如
volume = volume[::2, ::2, ::2]),避免可视化卡顿。
有其他细节问题比如参数调整、HU值校准之类的,随时问就行~
内容的提问来源于stack exchange,提问作者1369
相关产品推荐
相关产品推荐

