如何快速去除胸部CT中的床板与体外区域 —— 基于阈值与连通域的简易方法(附完整代码)

如何快速去除胸部CT中的床板与体外区域 —— 基于阈值与连通域的简易方法(附完整代码) 背景在进行胸部CT影像分析或深度学习建模前常需要去除胸腔以外的无关区域。例如床板、床垫、身体外部空气等。这些区域不仅占用存储空间还会对模型训练造成噪声干扰。我们会介绍基于传统的方法和深度学习的方法。本文重点介绍一种基于阈值分割 连通域提取的简易方案既稳健又易于批量处理。方法原理Step 1. 阈值分割ThresholdingCT图像中的灰度值是以HUHounsfield Unit表示空气约为-1000 HU软组织、肺间质大于-700 HU骨骼在300 HU以上。因此只要设定一个阈值例如-700 HU 就可以将空气区域去除保留人体及床板部分。Step 2. 3D 连通域分析Connected Component Labeling人体通常是扫描体积中最大的连通区域而床板、被单、噪声等属于较小的独立结构。我们对前景进行 3D 连通域标记并保留体积最大的一个。Step 3. 后处理填洞 去小碎片为了让掩膜更平滑、连贯可进行简单的形态学修补具体代码如下air_threshold -700 # 阈值可根据数据调整 # 1️⃣ 阈值分割去除空气区域 fg arr air_threshold # True 表示可能是身体、床板等实体False 表示空气 # 2️⃣ 3D 连通域分析找到哪些体素连在一起前景团块 # connectivity1 表示6邻域保守不易粘连不同结构 lab label(fg, connectivity1) # 3️⃣ 选出体素最多的那一团最大连通域通常对应人体 if lab.max() 0: body_mask np.zeros_like(fg, dtypebool) else: counts np.bincount(lab.ravel()) # 统计每个标签的体素数量 largest_label counts[1:].argmax() 1 # 找出面积最大的标签编号跳过背景0 body_mask (lab largest_label) # 得到人体主体掩膜 # 4️⃣ 打印一下人体区域占比越接近1说明占整幅图像比例越高 body_ratio body_mask.mean() print(人体区域占比, round(body_ratio, 4))提取的人体mask如下Step 4. 应用掩膜并保存结果将人体掩膜外的区域全部置为空气-1024 HU得到“去床板”的干净CT体积# 应用掩膜并保存结果 # 关键思路 # - 用刚才生成的人体掩膜把人体以外的区域床板、空气等全部置为空气值 background_hu -1024.0 # 空气的典型 HU 值 arr_clean arr.copy() arr_clean[~body_mask] background_hu # 掩膜外全部设为空气 # 输出路径设置 out_dir os.path.dirname(nifti_path) base os.path.basename(nifti_path).replace(.nii.gz,) out_img_path os.path.join(out_dir, f{base}_masked.nii.gz) nib.save(nib.Nifti1Image(arr_clean.astype(np.float32), affine, header), out_img_path) print(已保存清理后图像, out_img_path)优点与适用场景✅ 优点无需模型与GPU处理速度快可批量运行对存在空气缝隙的CT非常稳定。⚠️ 局限:若身体与床板紧贴无空气间隙可能粘连若手臂或被单与床板连接会误保留。比如以下案例本次实验代码采用jupyter形式更方便大家学习。代码展示如下批量代码对这部分感兴趣的同学可以联系我要完整的代码改成你的数据集就可以使用。里面由非常多的中文说明。文章持续更新可以关注微公【Radiology AI Camp】获取最新动态。人手有限文中涉及的链接前往微公对应文章查看。关注Tina姐一起学习进步~我是Tina, 我们下篇博客见~白天工作晚上写文呕心沥血觉得写的不错的话最后求点赞评论收藏。或者一键三连