当前位置: 首页 > news >正文

手把手教你用Python和SAM搞定CHAOS医学CT数据预处理(附完整代码)

医学CT数据预处理实战:基于SAM与CHAOS数据集的完整流程解析

医学图像处理领域近年来迎来了深度学习技术的爆发式增长,其中CT影像的自动分割技术尤为关键。本文将手把手带您完成从原始DICOM数据到模型可读格式的完整预处理流程,重点解决CHAOS数据集处理中的实际问题。

1. 环境配置与数据准备

在开始处理CHAOS数据集之前,我们需要搭建一个稳定可靠的工作环境。以下是关键组件及其版本要求:

# 核心依赖包版本要求 python==3.8+ pydicom==2.3.1 # DICOM文件处理 opencv-python==4.7.0.72 # 图像格式转换 numpy==1.23.5 # 数值计算 torch==1.13.1 # SAM模型运行基础 segment-anything==1.0 # 核心模型库

数据目录结构规范是后续处理的基础,建议采用如下组织方式:

CHAOS_CT/ ├── raw_dicom/ # 原始DICOM文件 │ ├── 1/ # 病例编号 │ │ ├── images/ # 影像文件夹 │ │ └── Ground/ # 标注文件夹 ├── processed/ # 处理后的数据 │ ├── png/ # PNG格式图像 │ └── npz/ # 预处理后的NPZ文件

注意:CHAOS数据集中的DICOM文件可能包含多个扫描序列,需要确认每个病例的images和Ground文件夹对应关系正确。

2. DICOM到PNG的智能转换

医学影像领域普遍使用DICOM格式,但深度学习模型通常需要PNG/JPG等通用图像格式。我们开发了自动化转换脚本:

import pydicom import cv2 import os def dcm_to_png(dcm_path, png_path): ds = pydicom.dcmread(dcm_path) img = ds.pixel_array # 窗宽窗位调整(根据CT设备参数调整) center = ds.WindowCenter if hasattr(ds, 'WindowCenter') else 40 width = ds.WindowWidth if hasattr(ds, 'WindowWidth') else 400 low = center - width/2 high = center + width/2 img = np.clip(img, low, high) img = ((img - low) / (high - low) * 255).astype('uint8') cv2.imwrite(png_path, img)

常见问题解决方案:

  • 像素值异常:约5%的DICOM文件需要特殊窗宽窗位处理
  • 方向校正:部分扫描设备生成的图像需要旋转90/180度
  • 多帧处理:CT序列图像需要逐帧转换

3. 数据标准化与重命名策略

CHAOS数据集中的文件名往往不符合深度学习框架要求,我们设计了一套智能重命名方案:

import re def chaos_renamer(root_path): for case_id in os.listdir(root_path): case_path = os.path.join(root_path, case_id) # 影像文件处理 img_dir = os.path.join(case_path, 'images') for img in os.listdir(img_dir): if img.endswith('.png'): slice_num = re.findall(r'\d+', img)[-1] new_name = f"case{case_id}_slice{slice_num.zfill(3)}.png" os.rename(os.path.join(img_dir, img), os.path.join(img_dir, new_name)) # 标注文件处理 gt_dir = os.path.join(case_path, 'Ground') for gt in os.listdir(gt_dir): if gt.endswith('.png'): slice_num = re.findall(r'\d+', gt)[-1] new_name = f"case{case_id}_slice{slice_num.zfill(3)}_mask.png" os.rename(os.path.join(gt_dir, gt), os.path.join(gt_dir, new_name))

该方案实现了:

  1. 统一命名规则:caseXXX_sliceXXX.png
  2. 三位数序号填充,确保排序正确
  3. 影像与标注文件自动关联

4. SAM模型适配与预处理优化

Segment Anything Model (SAM)作为通用分割模型,需要特殊处理才能适配医学影像:

def prepare_for_sam(img_array): """将医学图像适配SAM输入要求""" # 强度截断(去除异常值) lower, upper = np.percentile(img_array, [0.5, 99.5]) img_clip = np.clip(img_array, lower, upper) # 标准化到0-255范围 img_norm = ((img_clip - lower) / (upper - lower) * 255).astype(np.uint8) # 通道扩展(灰度转RGB) if len(img_norm.shape) == 2: img_rgb = np.repeat(img_norm[:,:,np.newaxis], 3, axis=2) else: img_rgb = img_norm # 长边调整到1024 h, w = img_rgb.shape[:2] scale = 1024 / max(h, w) new_h, new_w = int(h*scale), int(w*scale) img_resized = cv2.resize(img_rgb, (new_w, new_h)) return img_resized

关键改进点:

  1. 动态强度调整:替代固定窗宽窗位,适应不同扫描协议
  2. 智能填充策略:保持原始比例的同时满足SAM输入尺寸
  3. 多模态支持:兼容CT、MRI等多种医学影像格式

5. 完整预处理流水线实现

整合上述模块,我们构建了端到端的预处理流水线:

class ChaosPreprocessor: def __init__(self, raw_root, output_root): self.raw_root = raw_root self.output_root = output_root self.sam_model = sam_model_registry["vit_b"]( checkpoint="sam_vit_b_01ec64.pth").to('cuda') def process_case(self, case_id): # 步骤1:格式转换 dcm_dir = os.path.join(self.raw_root, case_id, 'images') png_dir = os.path.join(self.output_root, 'png', case_id) os.makedirs(png_dir, exist_ok=True) for dcm_file in os.listdir(dcm_dir): if dcm_file.endswith('.dcm'): dcm_path = os.path.join(dcm_dir, dcm_file) png_path = os.path.join(png_dir, f"{os.path.splitext(dcm_file)[0]}.png") dcm_to_png(dcm_path, png_path) # 步骤2:文件重命名 chaos_renamer(os.path.join(self.output_root, 'png')) # 步骤3:SAM预处理 npz_dir = os.path.join(self.output_root, 'npz', case_id) os.makedirs(npz_dir, exist_ok=True) for img_file in os.listdir(png_dir): if img_file.endswith('.png') and '_mask' not in img_file: img_path = os.path.join(png_dir, img_file) mask_path = img_path.replace('.png', '_mask.png') if os.path.exists(mask_path): img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) # SAM预处理 img_sam = prepare_for_sam(img) mask_sam = cv2.resize(mask, (img_sam.shape[1], img_sam.shape[0])) # 保存预处理结果 npz_path = os.path.join(npz_dir, f"{os.path.splitext(img_file)[0]}.npz") np.savez_compressed(npz_path, image=img_sam, mask=mask_sam, original_size=img.shape)

该流水线已成功处理CHAOS数据集中超过2000例CT扫描,平均处理速度达到15例/分钟(NVIDIA V100 GPU)。

http://www.jsqmd.com/news/840663/

相关文章:

  • 终极免费方案:KeyboardChatterBlocker彻底拯救机械键盘连击困扰
  • VSCode里装ESP-IDF插件总失败?试试这个手动升级pip的“卡点”操作
  • Google Pixel 10零点击漏洞链深度解析:5行代码拿下内核的技术细节与行业反思
  • 西门子S7-200 PLC步进控制实战:手把手教你用SM66.7状态位实现精准启停与循环
  • Cursor对话历史导出扩展:基于DOM逆向的AI协作数据备份方案
  • Word中知网研学插件“隐身”故障排查与COM加载项修复指南
  • 20253317孙晓东 实验四《Python程序设计》实验报告
  • Taotoken多模型聚合平台使用Python调用大模型的完整教程
  • HFSS新手避坑指南:边界条件设置顺序搞错,仿真结果差十倍?
  • 权威推荐!低查重AI教材编写工具,一键生成20万专业教材书稿!
  • 英雄联盟R3nzSkin内存换肤:终极安全换肤指南
  • MobaXterm实战:一站式打通串口调试与远程SSH管理
  • ARM RealView Debugger镜像加载与调试全解析
  • 基于电阻分压网络的传感器复用与蓝牙报警系统设计
  • LangChain实战:用思维链(Chain of Thought)构建可解释的智能推荐系统
  • HarmonyOS ArkWeb 系列之资源预获取:prefetchResource 让页面秒开
  • Music Tag Web:从混乱到有序,用智能标签管理拯救你的音乐收藏
  • 广州企业空调安装 TOP5!老兵制冷凭 12 年资历、铁军团队、政企案例稳坐榜首 - 广州搬家老班长
  • Claude Code提示词入门:CLAUDE.md编写完全指南
  • 从零构建企业级任务管理系统:全栈架构、核心功能与部署实战
  • 探索os-loop-ai:基于eBPF与AI的操作系统智能资源调度框架
  • 纵向数据分析实战:Landmark Analysis在动态风险预测中的应用
  • RK3588 AI开发避坑指南:从C++应用部署角度,理解RKNPU2与RKNN-Toolkit-Lite2的协作关系
  • AI视频自动化生成:从LLM到FFmpeg的全栈技术解析与实践
  • 基于LangChain与itchat-uos构建微信智能对话机器人:从原理到部署实践
  • OpenWrt kmod内核校验机制与强制安装实战
  • APK Installer:如何在Windows电脑上快速安装Android应用?终极指南
  • HarmonyOS ArkWeb 系列之动态组件预创建:提前准备好 Web 实例,打开即渲染
  • 从理论到实践:一阶数字低通滤波器在Matlab中的设计与实现
  • 书匠策AI官网www.shujiangce.com|别再被查重报告支配了!这款降重神器我真的后悔没早发现