基于多模板配准的心腔分割算法

🏡作者主页:点击! 

🤖编程探索专栏:点击!

⏰️创作时间:2024年11月18日20点09分


神秘男子影,
  秘而不宣藏。
泣意深不见,
男子自持重,
   子夜独自沉。

论文链接

点击开启你的论文编程之旅icon-default.png?t=O83Ahttps://www.aspiringcode.com/content?id=17102812998312

概述

本文复现论文 Automatic Whole Heart Segmentation in CT Images Based on Multi-atlas Image Registration[1] 提出的心腔分割算法。

整个心脏子结构的准确分割、建模和分析对于临床应用的开发非常重要。然而,对全部心脏子结构的分割十分具有挑战性,且目前仍然依赖手动操作。为了解决这一难题,该论文提出了一种基于多模板图像配准的自动全心分割算法

论文所提出的方法对患者CT图像中心脏部分的七个子结构进行图像分割。子结构包含:左心室腔、右心室血液腔、左心房腔、右心房血液腔、左心室心肌、从主动脉瓣到心房上部水平的上行主动脉干、从肺动脉瓣到分叉点的肺动脉干。

论文提出的算法主要包含三个步骤:感兴趣区域获取、精确分割、结果融合。

该论文基于多模态全心脏分割挑战赛(MM-WHS 2017)数据集进行测试。该数据集包含:训练数据(20张CT图像)和测试数据(40张CT图像),且所有数据均为从真实的临床环境中获取。其中每张CT图像附带了一张标记了七个心脏子结构的标签图像。

算法原理

论文提出的算法主要包含三步:

  • 第一步,获取感兴趣区域ROI(Region of Interest)。首先,将患者CT图像与模板图像统一下采样为低清晰度图像;然后,使用仿射配准(Affine registration)将患者图像与模板图像配准;最后,使用输出的配准参数对模板的心脏标签图像进行变换,获取ROI。
  • 第二步,对心脏进行精确分割。首先,利用ROI对原始的患者CT图像进行裁剪;然后,基于两步配准(仿射配准、B-样条配准)将裁剪后图像与模板图像进行配准;最后,使用输出的配准参数对模板的各标签图像进行变换,获取对患者CT图像中心脏的精确分割。
  • 第三步,筛选模板并集成结果。首先,基于两步配准中仿射配准结果的互信息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 datetimeif __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)

以上代码仅作展示,更详细的代码文件请参见附件。

效果演示

配置环境并下载示例后,运行附件目录中的example.py脚本,效果如下:

使用方式

  • 代码的运行环境可通过如下命令进行配置:
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
  • 实验数据可通过如下链接进行下载:
    • 训练数据图像、训练数据标签、测试数据图像下载链接见附件READ.ME
    • 测试数据标签下载链接见附件READ.ME(非必要)
  • 将下载好的数据放置在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/目录下。若想要查看它,请运行如下命令:
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

筛选模板数

(以上内容皆为原创,请勿转载)

参考文献

[1] Yang G, Sun C, Chen Y, et al. Automatic whole heart segmentation in CT images based on multi-atlas image registration[C]//International Workshop on Statistical Atlases and Computational Models of the Heart. Cham: Springer International Publishing, 2017: 250-257.

成功的路上没有捷径,只有不断的努力与坚持。如果你和我一样,坚信努力会带来回报,请关注我,点个赞,一起迎接更加美好的明天!你的支持是我继续前行的动力!"

"每一次创作都是一次学习的过程,文章中若有不足之处,还请大家多多包容。你的关注和点赞是对我最大的支持,也欢迎大家提出宝贵的意见和建议,让我不断进步。"

神秘泣男子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474007.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ScubaGear:用于评估 Microsoft 365 配置是否存在安全漏洞的开源工具

ScubaGear 是由网络安全和基础设施安全局 (CISA) 创建的开源工具,用于自动评估 Microsoft 365 (M365) 配置中是否存在潜在的安全漏洞。 ScubaGear 分析组织的 M365 租户配置,提供可操作的见解和建议,以帮助管理员解决安全漏洞并加强 Microso…

PgSQL汇总

SQL sql执行顺序 1.from 2.on 3.join 4.where 5.group by(开始使用select中的别名,后面的语句中都可以使用) 6. avg,sum.. 7.having 8.select 9.distinct 10.order by 11.limit⭐流程控制语句 CASE 写法一: CASE case_valueWHEN when_value THENsta…

.NET 简介

文章目录 一、组件二、免费且开源三、支持四、.NET 生态系统 .NET 是一个免费的跨平台开放源代码开发人员平台,用于生成多种类型的应用程序。 .NET 可以运行使用多种语言编写的程序,其中 C# 是最常用的语言。 .NET 依赖于许多大规模应用在生产中使用的高…

Linux之vim模式下全选命令

在Linux系统中,使用Vim编辑器进行全选操作可以通过以下几种方式实现: 1.使用键盘快捷键 按下 ”ggVG”(先按下”g”,再按下”g”,再按下”V”,最后按下”G”)可以全选当前文件内容。其中 ”g…

【学习笔记】大模型调优(llms_tuning)

项目地址:GitHubchunhuizhang/llms_tuning 文章目录 01 TRL SFTTrainer 中的 formatting_func 与 DataCollatorForCompletion02 accelerate ddp 与 trl SFTTrainer03 finetune_llama3_for_RAG04 optimizer Trainer 优化细节(AdamW,grad clip、…

剧本杀门店预约小程序,解锁沉浸式推理体验

一、开发背景 剧本杀作为一种热门娱乐游戏,深受大众的欢迎,但随着市场的快速发展,竞争也在不断加大,对于剧本杀线下商家来说面临着发展创新。 剧本杀线下门店数量目前正在逐渐增加,竞争激烈,而门店的获客…

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测,主要用于评估用户是否眨眼。 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

candence : 如何利用EXCEL 绘制复杂、多管脚元件

如何利用EXCEL 绘制复杂、多管脚元件 前面的步骤直接略过 我们以STM32F407VEXX 系列 100pin 芯片为例讲解: 1、新建好一个空元件 2、使用阵列,放置管脚 点击 “ ok ” 3、选中所有管脚 右键 “edit properites” 出现如下页面 4、点击 左上角&…

Java多线程回顾总结

目录 一.线程与创建线程方式简介 二.Thread继承 三.实现Runnable接口 四.Callable接口 五.使用线程池 一.线程与创建线程方式简介 线程与进程的区别: 1、一个进程至少包含一个线程 2、比如电脑上QQ,运行起来就是一个进程,QQ可以聊天同时也可以传文…

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理,希望对读者有所帮助。 前置知识: 深度学习基础练习:从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…

Java连接MySQL(测试build path功能)

Java连接MySQL(测试build path功能) 实验说明下载MySQL的驱动jar包连接测试的Java代码 实验说明 要测试该情况,需要先安装好MySQL的环境,其实也可以通过测试最后提示的输出来判断build path是否成功,因为如果不成功会直…

DQN系列算法详解

代码链接见文末 1. Q-learning 1.1 概述 Q-Learning是一种强化学习算法,目的是通过选择能带来最大长期收益的行为来完成任务。 做事包含瞬时奖励和记忆经验奖励: 在Q-Learning中,每个动作都会带来“瞬时奖励”,同时也会根据过去的经验记住哪些行为更有利。瞬时奖励: 这里…

七、箭头函数及简写、arguments、剩余参数、展开运算符、解构数组与对象、数组常见方法(forEach、map、join、reduce)

1. 箭头函数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址&#xff1a;功能展示项目结构项目引用1. 新建模型2. Data层&#xff0c;依赖EF Core&#xff0c;实现数据库增删改查3. Bussiness层&#xff0c;实现具体的业务逻辑4. Service层&am…

【蓝桥杯备赛】深秋的苹果

# 4.1.1. 题目解析 要求某个区间内的数字两两相乘的总和想到前缀和&#xff0c;但是这题重点在于两两相乘先硬算&#xff0c;找找规律&#xff1a; 比如要算这串数字的两两相乘的积之和&#xff1a; 1, 2, 3 1*2 1*3 2*3 1*(23) 2*3 前缀和数组&#xff1a; 1 3 6 发现…

通过 Docker 对 MySQL 做主从复制的时候,因为ip不对导致不能同步。后又因为二进制的偏移量写的不对,导致不能同步的问题

问题一&#xff1a;Error connecting to source slave127.0.0.1:3307. This was attempt 3/86400, with a delay of 30 seconds between attempts. Message: Cant connect to MySQL server on 127.0.0.1:3307 (111) 就是因为这个ip不对&#xff0c;导致的异常。 解决方式&…

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版&#xff0c;外加输入法、IDEA等&#xff0c;我想将这个虚拟机里的系统直接搬到物理机中&#xff0c;那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了&#xff0c;那直接说干就干。 本教程基于Ubuntu24.0…

VMware 中 虚拟机【Linux系统】固定 ip 访问

注意&#xff1a;这里的 参考链接 VMWare虚拟机设置固定ip_vmware虚拟机修改ip地址-CSDN博客 VMwareCentOS 7 静态IP设置方法&#xff08;保姆级教程&#xff0c;建议收藏&#xff09;-阿里云开发者社区 1&#xff09;查看宿主机中 VMnet8 的网络配置 ipconfig 2&#xff…

Windows环境GeoServer打包Docker极速入门

目录 1.前言2.安装Docker3.准备Dockerfile4.拉取linux环境5.打包镜像6.数据挂载6.测试数据挂载7.总结 1.前言 在 Windows 环境下将 GeoServer 打包为 Docker&#xff0c;可以实现跨平台一致性、简化环境配置、快速部署与恢复&#xff0c;同时便于扩展集成和版本管理&#xff0c…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…