前言:基于多模板配准的心腔分割算法作为一种新兴的技术方法,正在吸引越来越多的关注。该算法利用多个已标记的心脏图像模板进行配准,通过将这些模板与待分割图像进行比较,可以实现对心腔结构的精确分割。相较于传统的手动或半自动分割方法,基于多模板配准的心腔分割算法具有更高的准确性和稳定性,并且能够适应不同个体之间的解剖差异。
本文所涉及所有资源均在传知代码平台可获取
概述
本文复现论文 地址 提出的心腔分割算法:
对于心脏子结构的精确划分、模型构建和深入分析,在临床应用开发中具有至关重要的作用。尽管如此,对所有心脏的子结构进行分割仍然是一个巨大的挑战,并且目前还主要依赖于手工操作。为了克服这个挑战,这篇论文介绍了一种依赖于多模板图像配准技术的自动全心分割方法。
这篇论文介绍了一种方法,用于对患者CT图像的中心脏区域的七个子部分进行图像划分。
子结构涵盖了以下部分:左心室腔、右心室血液腔、左心房腔、右心房血液腔、左心室心肌,以及从主动脉瓣至心房上部的上行主动脉干和从肺动脉瓣至分叉点的肺动脉干。这篇论文所介绍的算法主要分为三个阶段:获取感兴趣的区域、进行精确的分割以及结果的整合。
演示效果
项目代码的运行环境可通过如下命令进行配置:
pip install numpy
pip install itk-elastix
pip install scikit-learn
pip install matplotlib
pip install tqdm
解压附件压缩包并进入。如果是Linux系统,请使用如下命令:
unzip Multi-Atlas-Registration.zip
cd Multi-Atlas-Registration
实验数据可通过如下链接进行下载:训练集;测试集 ,将下载好的数据放置在Multi-Atlas-Registration/dataset目录下的合适位置,完整的目录结构应当如下图所示:
Multi-Atlas-Registration
│
├──datasets
│ │
│ ├── ct_train
│ │ ├── ct_train_1001_image.nii.gz
│ │ ├── ct_train_1001_label.nii.gz
│ │ ├── ct_train_1002_image.nii.gz
│ │ ├── ct_train_1002_label.nii.gz
│ │ └── ...
│ │
│ └── ct_test
│ ├── ct_test_2001_image.nii.gz
│ ├── ct_test_2002_image.nii.gz
│ └── ...
│
├──results
│ │
│ └── example
│ ├── example_image.nii.gz
│ └── example_predicted.npy
├──config.json
├──heart_seg.py
├──utils.py
├──main.py
├──example.py
└──README.md
为了节约时间,我提供了一个已完成分割的测试样例(请从百度网盘链接下载并放到results/example/目录下,验证码ccc2)。若想要查看它,请运行如下命令:
python example.py
如果希望测试完整的算法(时间很长),请运行如下命令:
python main.py
结果将保存在目录Multi-Atlas-Registration/results下,并以程序开始的时间(年月日_时分秒)作为名称。 如果希望使用自己的文件路径或改动其他实验设置,请在文件Multi-Atlas-Registration/config.json中修改对应参数。以下是参数含义对照表:
| 参数名 | 含义 |
|---|---|
| train_path | 训练(模板)图像、标签目录 |
| test_path | 测试(患者CT)图像目录 |
| train_num | 训练图像数 |
| test_num | 测试图像数 |
| result_path | 结果存储目录 |
| example_path | 样例目录 |
| atlas_num | 筛选模板数 |
配置环境并下载示例后,运行附件目录中的example.py脚本,效果如下:
核心代码
论文所提算法包括三个主要步骤:
步骤1、得到感兴趣区ROI(Region of Interest)。
首先对病人的CT图像和模板图像进行均匀的下采样,形成低清晰度图像;接下来,我们采用仿射配准(Affine registration)技术,将病人的图像与预设的模板图像进行匹配;最后利用输出配准参数转化模板心脏标签图像得到ROI。
步骤2,准确分割心脏。
首先用ROI剪除原病人CT图像;然后,基于两步配准(仿射配准、B-样条配准)将裁剪后图像与模板图像进行配准;最后利用输出配准参数转换模板中每个标签图像得到准确分割出病人CT图像中心脏。
步骤3,对模板进行筛选和结果集成。
首先,在两步配准过程中,利用仿射配准结果的互信息MI(Mutual Information)对模板进行了排序和筛选,并挑选了特定数量的模板来参与后续的步骤;然后再利用B-样条进行非刚性配准,得到准确的病人CT图像心脏分割结果;最后以各模板互信息为权重通过投票融合分割结果得到最终结果。
由于官方数据集并没有提供全心脏标签,原文也未对全心脏标签的获取方法进行解释,故本文删去了原算法的裁剪步骤,具体的核心逻辑如下所示:
from utils import config_read
from heart_seg import affine_registration, bspline_registration, label_transform
import os
import itk
import numpy as np
from sklearn.metrics import mutual_info_score
from datetime import datetime
if __name__ == "__main__":
# 读取配置
args = config_read("./config.json")
# 新建结果目录
result_path = os.path.join(args.result_path, datetime.now().strftime("%Y%m%d_%H%M%S"))
if not os.path.exists(result_path):
os.mkdir(result_path)
# 测试样本地址
test_path_list = [os.path.join(args.test_path, "ct_test_%s_image.nii.gz"%str(i+2001)) for i in range(args.test_num)]
for test_id in range(len(test_path_list)):
# 读取测试图像
test_path = test_path_list[test_id]
test_image = np.asarray(itk.imread(test_path, itk.F))
# 训练样本地址
train_path_list = [os.path.join(args.train_path, "ct_train_%s_image.nii.gz"%str(i+1001)) for i in range(args.train_num)]
atlas_mi = []
for train_path in train_path_list:
# 读取训练图像
train_image = np.asarray(itk.imread(train_path, itk.F))
# 利用仿射配准对齐患者CT与模板图像
train_image_affine, _ = affine_registration(test_image, train_image)
# 计算患者图像与变换后模板图像的互信息
mi = mutual_info_score(test_image.ravel(), train_image_affine.ravel())
atlas_mi.append(mi)
# 筛选模板
choosed_ids = sorted(range(len(atlas_mi)), key=lambda i: atlas_mi[i], reverse=True)[:args.atlas_num]
logits = np.zeros((test_image.shape[0], test_image.shape[1], test_image.shape[2], 7), dtype=np.float32)
for id in choosed_ids:
train_image = np.asarray(itk.imread(train_path_list[id], itk.F))
# 利用B-样条配准对齐患者CT与模板图像
_, transform_parameters = bspline_registration(test_image, train_image)
# 读取模板标签
label_image = np.asarray(itk.imread(os.path.join(args.train_path, "ct_train_%s_label.nii.gz"%str(id+1001)), itk.F))
# 利用B-样条配准结果的变换参数对模板图像的子结构标签图像进行变换,获得对患者心脏的精确分割。
transformed_labels = label_transform(label_image, transform_parameters)
# 利用之前获取的互信息作为权重,以投票的方式融合各个模板的精确分割结果。
logits = logits + transformed_labels * atlas_mi[id]
predicted = np.argmax(logits, dim=-1)
# 存储最终的分割结果
np.save(os.path.join(result_path, "ct_test_%s_predicted.npy"%str(test_id+2001)), predicted)
写在最后
基于多模板配准的心腔分割算法在解决心脏图像分割难题方面具有显著的优势。与传统的手动或半自动分割方法相比,该算法能够实现更高的准确性和稳定性,且不受个体解剖差异的影响。这为心脏疾病的诊断和治疗提供了可靠的技术支持。总的来说,基于多模板配准的心腔分割算法为医学图像处理领域的研究和应用带来了新的思路和方法。我们期待这项技术能够为心脏疾病的早期诊断、个性化治疗以及医学影像的自动化分析提供更多的支持,为人类健康事业作出更大的贡献。
详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。
【传知科技】关注有礼 公众号、抖音号、视频号