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

如何使用Python查找3D CT扫描图像连通分量并将无关区域强度设为-1000

3D CT图像无关区域去除的Python实现方案

通常有两种常用实现路径,前者适配医学影像场景的原生需求,后者适合通用数值处理场景:

方案1:SimpleITK实现(推荐医学影像场景使用)

原生支持医学影像空间信息保留,无需额外处理坐标、间距等元数据:

  • 先对CT做阈值分割,区分前景(有效扫描区域)和背景(空气),阈值可根据你的CT取值范围调整
  • 计算3D连通分量,默认采用3D场景下的26邻域判断连通性
  • 统计各连通分量的体积,筛选要保留的目标连通分量(通常有效扫描区是体积最大的连通分量)
  • 把非目标区域的强度值统一设为-1000
import SimpleITK as sitk

# 读取3D CT图像,支持nii、nii.gz、dicom序列等常见医学影像格式
ct_image = sitk.ReadImage("你的CT文件路径")

# 生成二值mask:仅保留强度高于-950的区域为前景,阈值可按需调整
binary_mask = sitk.BinaryThreshold(ct_image, lowerThreshold=-950, upperThreshold=3000, insideValue=1, outsideValue=0)

# 计算3D连通分量
connected_components = sitk.ConnectedComponent(binary_mask)
# 统计每个连通分量的属性
label_stats = sitk.LabelShapeStatisticsImageFilter()
label_stats.Execute(connected_components)

# 找到体积最大的连通分量(即有效扫描区域)
max_volume = -1
target_label = 1
for label in label_stats.GetLabels():
    current_volume = label_stats.GetPhysicalSize(label)
    if current_volume > max_volume:
        max_volume = current_volume
        target_label = label

# 生成仅保留目标连通分量的mask
keep_mask = sitk.Equal(connected_components, target_label)
# 无关区域赋值为-1000
processed_ct = sitk.Mask(ct_image, keep_mask, outsideValue=-1000)

# 保存处理后的CT,自动保留原空间元信息
sitk.WriteImage(processed_ct, "处理后的CT保存路径")

方案2:scipy.ndimage实现(通用数值处理场景)

适合无医学影像格式依赖的纯数组处理场景:

  • 读取CT为numpy数组后做阈值二值化
  • 调用ndimage.label计算3D连通分量,可自定义邻域规则
  • 筛选目标连通分量后替换无关区域数值
import numpy as np
from scipy import ndimage
import nibabel as nib # 仅用于读取nifti格式CT,若已拿到数组可省略

# 读取CT数据
ct_nib = nib.load("你的CT文件路径")
ct_array = ct_nib.get_fdata()
ct_affine = ct_nib.affine

# 生成二值mask
binary_mask = ct_array > -950
# 计算3D连通分量,传入structure=np.ones((3,3,3))表示采用26邻域,默认是6邻域
labels, _ = ndimage.label(binary_mask, structure=np.ones((3,3,3)))

# 统计各连通分量的体素数量,找到最大的非背景分量
label_count = np.bincount(labels.flatten())
target_label = label_count[1:].argmax() + 1 # 排除背景标签0

# 替换无关区域为-1000
processed_array = np.where(labels == target_label, ct_array, -1000)

# 保存处理后的CT
nib.save(nib.Nifti1Image(processed_array, ct_affine), "处理后的CT保存路径")

注意事项:如果你的有效区域不是体积最大的连通分量,可以修改筛选逻辑,比如保留体积排名前N的分量、或者根据空间位置、平均强度等特征筛选需要保留的连通分量即可。

内容的提问来源于stack exchange,提问作者a_variable

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:05