You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:27:50