一个专业的医学图像分割结果可视化工具,用于对比多个深度学习模型的分割效果,支持.nii.gz格式的3D医学图像。
- 多模型对比:支持2-10个文件夹同时对比(1个原始图像 + 1个GT + 最多8个模型预测)
- 智能切片过滤:自动检测并只显示GT中包含掩膜的切片,跳过空白切片
- 双重可视化:
- 2D切片视图:原始图像 + 淡红色半透明掩膜叠加
- 3D投影视图:最大强度投影(MIP)显示完整分割结构
- 实时指标计算:
- 3D指标:Dice系数、clDice系数(加载时计算一次)
- 2D指标:当前切片的Dice系数、clDice系数(切换切片时实时更新)
- 鼠标滚轮:向上/向下滚动切换切片
- 键盘快捷键:
- 左箭头:切换到上一个.nii.gz文件
- 右箭头:切换到下一个.nii.gz文件
- 滑动条:拖动浏览不同切片
- 按钮控制:点击按钮切换文件
┌─────────────────────────────────────────────────────────────┐
│ 文件信息 | 有效切片统计 │
├──────────────┬──────────────┬──────────────┬────────────────┤
│ Image │ GT │ Model1 │ Model2 │
├──────────────┼──────────────┼──────────────┼────────────────┤
│ 原始图像 │ 图像+GT掩膜 │ 图像+预测掩膜 │ 图像+预测掩膜 │
├──────────────┼──────────────┼──────────────┼────────────────┤
│ 指标汇总 │ 3D投影可视化 │ 3D投影可视化 │ 3D投影可视化 │
│ (所有模型) │ │ │ │
└──────────────┴──────────────┴──────────────┴────────────────┘
│ [上一个文件] [切片滑动条] [下一个文件] │
└─────────────────────────────────────────────────────────────┘
- Python 3.7+
- Windows/Linux/macOS
# 克隆或下载项目
cd medical_image_viewer
# 安装依赖
pip install -r requirements.txtnumpy: 数组计算nibabel: 读取.nii.gz医学图像格式PyQt5: GUI界面框架scipy: 图像处理(旋转、缩放、距离变换)scikit-image: 骨架化算法(用于clDice计算)
将你的数据组织成以下结构:
root_folder/ # 根文件夹(任意名称)
├── Images/ # 原始图像文件夹(必须命名为Images)
│ ├── case_001.nii.gz
│ ├── case_002.nii.gz
│ └── ...
├── Labels/ # 真实标注文件夹(必须命名为Labels)
│ ├── case_001.nii.gz
│ ├── case_002.nii.gz
│ └── ...
├── UNet/ # 模型1预测结果(文件夹名即为模型名)
│ ├── case_001.nii.gz
│ ├── case_002.nii.gz
│ └── ...
├── ResNet/ # 模型2预测结果
│ ├── case_001.nii.gz
│ ├── case_002.nii.gz
│ └── ...
└── Transformer/ # 模型3预测结果(可选,最多8个模型)
├── case_001.nii.gz
├── case_002.nii.gz
└── ...
重要规则:
- 根文件夹下必须包含
Images和Labels两个子文件夹(大小写不敏感) - 其他子文件夹会被自动识别为模型预测结果,文件夹名即为模型显示名称
- 所有文件夹中的文件名必须完全相同且一一对应
- 最多支持8个模型文件夹(加上Images和Labels共10个)
打开 medical_image_viewer_qt.py,找到 main() 函数,只需修改一行:
def main():
# 只需修改这一行,指向你的根文件夹
root_folder = r"E:\Data\MyProject" # 修改为你的根文件夹路径
# 其他代码无需修改
...python medical_image_viewer_qt.py程序会自动:
- 扫描根文件夹下的所有子文件夹
- 识别
Images和Labels文件夹 - 将其他文件夹作为模型预测结果
- 按字母顺序显示模型
- 在控制台输出检测到的文件夹信息
-
浏览切片:
- 使用鼠标滚轮向上/向下滚动
- 拖动底部滑动条
- 程序自动跳过GT中没有掩膜的切片
-
切换文件:
- 按键盘左箭头键或点击"上一个文件"按钮
- 按键盘右箭头键或点击"下一个文件"按钮
-
查看指标:
- Image列下方显示所有模型的指标汇总
- 3D指标:整个3D体积的评估结果
- 2D指标:当前切片的评估结果
- 范围:0-1,越高越好
- 含义:衡量预测分割与真实标注的重叠程度
- 计算公式:
Dice = 2 * |A ∩ B| / (|A| + |B|)
- 范围:0-1,越高越好
- 含义:专门用于评估细长结构(如血管)的分割质量
- 特点:对拓扑结构敏感,比普通Dice更适合血管分割评估
Images或images:原始图像文件夹(必需)Labels或labels:真实标注文件夹(必需)- 其他任意名称:模型预测结果文件夹(文件夹名即为显示的模型名)
- 最少:2个(原始图像 + GT)
- 最多:10个(原始图像 + GT + 8个模型)
- 支持格式:
.nii.gz(NIfTI压缩格式) - 文件名:所有文件夹中的文件名必须完全一致
- 颜色:淡红色(RGB: 255, 100, 100)
- 透明度:40%
- 阈值:像素值 > 0.1 被视为掩膜区域
A: 检查以下几点:
- 文件夹路径是否正确
- 文件夹中是否包含.nii.gz文件
- 所有文件夹中的文件名是否完全一致
A: GT文件夹中的所有.nii.gz文件都是空的(全为0),请检查GT数据是否正确。
A: clDice需要进行骨架化和距离变换,对于大尺寸3D图像会比较耗时。3D clDice在加载文件时只计算一次,2D clDice在切换切片时实时计算。
A: 修改 create_overlay_image() 函数中的参数:
alpha = 0.4 # 透明度(0-1)
red_color = np.array([255, 100, 100], dtype=np.float32) # RGB颜色A: 可以调整 create_3d_visualization() 函数中的旋转角度:
angle = 15 # 旋转角度(度)使用最大强度投影(Maximum Intensity Projection, MIP):
- 对3D数据进行轻微旋转(默认15度)获得透视效果
- 沿深度方向取最大值生成2D投影
- 添加深度阴影增强立体感
- 3D指标只在加载文件时计算一次
- 2D指标使用高效的numpy向量化计算
- 图像缩放使用Qt的平滑变换算法
MIT License
医学图像处理工具
- 初始版本发布
- 支持多模型对比
- 实现Dice和clDice指标计算
- 添加3D MIP可视化
- 智能切片过滤功能