(7)医学图像配准综述:SimpleITK + SimpleElastix + Elastix + ITKElastix + PyElastix

文章目录

  • 前言
  • 一、常见的图像配准工具
    • 1.0、ITK + VTK —— 科学界最大与最早的开源免费项目之一
    • 1.1、ITK系列:ITK + SimpleITK + SimpleElastix
    • 1.2、Elastix系列:Elastix + ITKElastix + PyElastix
  • 二、图像配准
    • 2.1、SimpleITK图像配准
    • 2.2、SimpleElastix图像配准
      • 2.2.1、一行代码(配准)
      • 2.2.2、Rigid + affine + bspline(配准)
    • 2.3、Elastix图像配准
    • 2.4、ITKElastix图像配准
      • 2.4.1、一行代码(配准)
      • 2.4.2、rigid + affine + bspline(配准)
    • 2.5、PyElastix图像配准

前言

工具配准的再开发可视化开发的主要需求:
(1)转换编程语言
(2)简化配准流程

简单的本质:调用默认的配准参数(即:对大多数图像都达到较好效果的参数)

  • (1)配准正常:只适用于图像的复杂度不高,对比度明显、前背景的灰度强度明显等等;
  • (2)配准异常:需要针对每个变换模型的参数文件进行调参(较复杂)—— 每个文件的参数最少有50+,且参数之间以及参数文件之间具有一定联系

总结:初学可以,科研不行。

一、常见的图像配准工具

图像配准(Image Registration) 用于将多幅图像或图像的不同部分进行对齐,以便在后续分析中进行比较、融合或提取信息。配准的目标是找到一个变换,将不同图像中的相应特征或区域对准,使它们在同一坐标系中重叠。广泛应用于在医学影像、遥感图像、计算机视觉等领域。
在这里插入图片描述

1.0、ITK + VTK —— 科学界最大与最早的开源免费项目之一

用途支持语言支持机构应用领域
分析工具:ITK(Insight Segmentation and Registration Toolkit)用于多维图像处理、分割和配准C++、Python由美国国家卫生研究院(NIH)、美国国家计算科学研究所(NCSA)科学研究和医学领域(如:CT、MRI)
可视化工具:VTK(Visualization Toolkit)用于3D图像处理、图像建模、体积渲染、可视化 和2D绘图。主C++、部分Python封装最早由美国洛斯阿拉莫斯国家实验室(LANL)发起,现在由Kitware公司维护。医学、生物学、地球科学和工程学等

❤️ VTK资源

  • 文档 Documentation:适合新老 VTK 用户的综合资源,其中包括教程、示例和最佳实践,可帮助您充分发挥 VTK 高级算法和渲染技术的全部功能。
  • 教科书 Book:PDF可下载
  • Python示例(代码 + 图解):在 Python 中使用 VTK
    (同理示例:C#、C++、Java)

1.1、ITK系列:ITK + SimpleITK + SimpleElastix

工具特点平台语言特点文档Github教程
ITKITK是科学界最大、最早的开源项目之一开源、免费、跨平台C++开发、支持Python接口、Java绑定访问、TCL简易接口用于 N 维科学图像处理、分割和配准。ITK-DocumentationITK源码ITK-快速入门
SimpleITK基于ITK的封装工具开源、免费、跨平台C++、Python、Java、R、Ruby、C#、Lua和TCLITK的简化编程接口SimpleITK-DocumentationSimpleITK源码Jupyter示例
SimpleElastix基于SimpleITK的扩展工具(现已成为SimpleITK的一部分)开源、免费、跨平台C++、Python、Java、R、Ruby、C#、Lua 和 TCL只需几行代码即可完成配准任务SimpleElastix-DocumentationSimpleElastix源码

1.2、Elastix系列:Elastix + ITKElastix + PyElastix

工具特点平台语言特点文档Github
Elastix基于ITK的命令行工具开源、免费CMD命令行用于刚性和非刚性图像配准Elastix-DocumentationElastix源码
ITKElastix基于ITK+Elastix的封装工具开源、免费为Elastix提供ITK Python、JavaScript 和 WebAssembly 接口ITKElastix网页版应用ITKElastix源码
PyElastixPython封装的Elastix工具开源、免费PyElastix源码

二、图像配准

2.1、SimpleITK图像配准

import SimpleITK as sitk

# (1)读取固定图像和移动图像
fixed = sitk.ReadImage(r"F:\other\fixedImage.tif", sitk.sitkFloat32)
moving = sitk.ReadImage(r"F:\other\movingImage.tif", sitk.sitkFloat32)

# (2)创建图像配准方法对象
R = sitk.ImageRegistrationMethod()

# (3)配置参数(默认参数)
####################################################################################
# 3.1、设置一个初始变换
# R.SetInitialTransform(sitk.TranslationTransform(fixed.GetDimension()))  # 平移变换
# R.SetInitialTransform(sitk.AffineTransform(fixed.GetDimension()))  # 仿射变换
# R.SetInitialTransform(sitk.BSplineTransform(fixed.GetDimension(), 3))  # 平移变换。BSpline阶数=3

# 3.2、创建一个复合变换(平移、仿射和插值)
composite_transform = sitk.CompositeTransform(fixed.GetDimension())
composite_transform.AddTransform(sitk.TranslationTransform(fixed.GetDimension()))
composite_transform.AddTransform(sitk.AffineTransform(fixed.GetDimension()))
composite_transform.AddTransform(sitk.BSplineTransform(fixed.GetDimension(), 3))
R.SetInitialTransform(composite_transform)
####################################################################################

# (4)开始配准
outTx_result = R.Execute(fixed, moving)

# (5)保存结果
sitk.WriteTransform(outTx_result, r'F:\other\displaceMeth1.hdf5')
sitk.WriteImage(sitk.Resample(moving, fixed, outTx_result), r'F:\other\displaceMeth1.tif')

2.2、SimpleElastix图像配准

SimpleElastix是基于SimpleITK的扩展工具(现已成为SimpleITK的一部分
官网源码:SimpleElastix Documentation

2.2.1、一行代码(配准)

import SimpleITK as sitk

resultImage = sitk.Elastix(sitk.ReadImage("fixedImage.nii"), sitk.ReadImage("movingImage.nii"))

2.2.2、Rigid + affine + bspline(配准)

import SimpleITK as sitk

# (1)SimpleITK实例化
elastixImageFilter = sitk.ElastixImageFilter()

# (2)加载图像
elastixImageFilter.SetFixedImage(sitk.ReadImage("fixedImage.nii"))
elastixImageFilter.SetMovingImage(sitk.ReadImage("movingImage.nii"))

# (3)配置参数(默认参数)
elastixImageFilter.SetParameterMap(sitk.GetDefaultParameterMap("rigid"))
# elastixImageFilter.SetParameterMap(sitk.GetDefaultParameterMap("affine"))
# elastixImageFilter.SetParameterMap(sitk.GetDefaultParameterMap("bspline"))

# (4)开始配准
elastixImageFilter.Execute()

# (5)保存结果
sitk.WriteImage(elastixImageFilter.GetResultImage())

2.3、Elastix图像配准

(1)Elastix图像配准:原理 + 源码(详解)
(2)Elastix图像配准:参数文件(配准精度的关键)
(3)Elastix图像配准:2D图像
(4)Elastix图像配准:3D图像
(5)Elastix图像配准:点集配准(局部区域的精度微调)
(6)Elastix图像配准:可视化配准工具

2.4、ITKElastix图像配准

2.4.1、一行代码(配准)

import itk

registered_image, params = itk.elastix_registration_method(itk.imread('fixed_image.mha'), itk.imread('moving_image.mha'))

2.4.2、rigid + affine + bspline(配准)

ITKElastix:Elastix源码

################################
# run ITKElastix on MacOs
################################
from itk import itkElastixRegistrationMethodPython
import itk
from itkwidgets import compare, checkerboard

# (1)加载图像
fixed_image = itk.imread('data/CT_2D_head_fixed.mha', itk.F)
moving_image = itk.imread('data/CT_2D_head_moving.mha', itk.F)

# (2)配置参数(默认参数)
parameter_object = itk.ParameterObject.New()
default_parameter_map = parameter_object.GetDefaultParameterMap('rigid')
# default_parameter_map = parameter_object.GetDefaultParameterMap('affine')
# default_parameter_map = parameter_object.GetDefaultParameterMap('bspline')
parameter_object.AddParameterMap(default_parameter_map)

#####################################################################
# (3)开始配准
# 方法一、调用配准函数
result_image, result_transform_parameters = itk.elastix_registration_method(fixed_image, moving_image, parameter_object=parameter_object, log_to_console=False)

# 方法二、加载 Elastix 图像过滤器对象
elastix_object = itk.ElastixRegistrationMethod.New()  # 创建 Elastix 配准方法对象
elastix_object.SetFixedImage(fixed_image)  # 设置固定图像
elastix_object.SetMovingImage(moving_image)  # 设置移动图像
elastix_object.SetParameterObject(parameter_object)  # 设置参数对象(包含配准算法的参数)
elastix_object.SetLogToConsole(False)  # 设置是否在控制台输出日志信息(可选)

elastix_object.UpdateLargestPossibleRegion()  # 更新过滤器对象
result_image = elastix_object.GetOutput()  # 获取配准后的图像结果
result_transform_parameters = elastix_object.GetTransformParameterObject()  # 获取配准后的变换参数
#####################################################################

# (4)可视化结果
checkerboard(fixed_image, result_image, pattern=5)  # 以棋盘形式比较固定图像和配准结果
compare(fixed_image, result_image, link_cmap=True)  # 以对比方式显示固定图像和配准结果

2.5、PyElastix图像配准

import pyelastix

# 假设 im1 和 im2 是你的输入图像

# 获取默认参数
params = pyelastix.get_default_params()

# 设置配准的参数
params.MaximumNumberOfIterations = 200
params.FinalGridSpacingInVoxels = 10

# 进行图像配准
im1_deformed, field = pyelastix.register(im1, im2, params)

# im1_deformed 是配准后的图像
# field 是配准变换的场(transform field),可用于进一步分析或可视化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS从入门到精通4-1:Docker安装与常用命令总结

目录 0 专栏介绍1 Docker与机器人应用2 Docker安装步骤3 Docker常用命令3.1 创建与启动容器3.2 暂停与删除容器3.3 容器文件拷贝3.4 构建镜像与上下文 0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进…

(2021|ICLR,LoRA,秩分解矩阵,更少的可训练参数)LoRA:大语言模型的低秩自适应

LoRA: Low-Rank Adaptation of Large Language Models 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 问题陈述 3. 现有的解决方案不够好吗? 4. 我们的方法 …

stack和queue及优先级队列和适配器(包括deque)的介绍

stack stack的介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组…

Coil:Android上基于Kotlin协程的超级图片加载库

Coil:Android上基于Kotlin协程的超级图片加载库 1. coil简介 在当今移动应用程序的世界中,图片加载是一个不可或缺的功能。为了让应用程序能够高效地加载和显示图片,开发人员需要依赖于强大的图片加载库。而今天,我将向大家介绍…

小程序插件测试

1、下载微信小程序开发者工具,下载地址: 微信开发者工具下载地址与更新日志 | 微信开放文档 选择稳定版下载: 2、下载并解压测试项目(此处根据公司的项目来,可问开发要) 3、导入解压后的文件夹&#xff…

Flink cdc3.0动态变更表结构——源码解析

文章目录 前言源码解析1. 接收schema变更事件2. 发起schema变更请求3. schema变更请求具体处理4. 广播刷新事件并阻塞5. 处理FlushEvent6. 修改sink端schema 结尾 前言 上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题,本篇来看下新功能之一的动态变更表结…

通过Navicat for MySQL排查sql语句错误

开发的软件用到MySQL数据库,但在进行某个sql操作时执行失败了: 我们可以用Navicat for MySQL来排查sql语句是否存在语法错误等问题。将该sql语句复制 打开Navicat for MySQL,连接该软件所用到的MySQL数据库,点击“新建查询”。将刚…

AI嵌入式K210项目(26)-二维码识别

文章目录 前言一、什么是二维码?二、实验准备三、实验过程四、API接口总结 前言 本章介绍基于机器视觉实现二维码识别,主要包含两个过程,首先检测图像中是否有二维码,如果有则框出并打印二维码信息; 一、什么是二维码…

Re-understanding of data storytelling tools from a narrative perspective

作者:任芃锟, 王轶 & 赵凡 发表:Visual Intelligence,新刊,实行单盲同行评议制度。由施普林格以开放获取 (Open Access) 模式出版。获2022“中国科技期刊卓越行动计划高起点新刊”项目资助,目前出版不收取文章处理…

瑞幸CNY营销又整了哪些花活?媒介盒子分享

还有不到一周时间,龙年春节就要来了,在这场龙年营销大战中,咖啡界的“显眼包”瑞幸又又又凭借花式营销成功出圈,从产品到物料包装,从联名合作到粉丝营销,海陆空全方位上线,那瑞幸具体怎么整的活…

深入探索CoT有效性和推理步长对于LLM性能的影响

思想链(CoT)对于提高大型语言模型(LLM)的推理能力具有重要意义。 然而,CoT 的有效性与提示中推理步骤的长度之间的相关性仍然很大程度上未知。 为了阐明这一点,多家研究机构(西北大学、罗格斯大…

【UE 材质】扇形材质

目录 效果 步骤 (1)控制扇形的弧宽度 (2)控制扇形的角度 (3)完整节点 效果 步骤 (1)控制扇形的弧宽度 创建一个材质,混合模式设置为“Additive”,着色…

【Java 数据结构】String进阶

字符串常量池 1. 创建对象的思考2. 字符串常量池(StringTable)3. 再谈String对象创建 1. 创建对象的思考 下面两种创建String对象的方式相同吗? public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 …

JVM 性能调优 - Java 中的四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

070:vue+cesium: 利用canvas设置径向渐变色材质

相关API参考: https://cesium.com/learn/cesiumjs/ref-doc/ColorMaterialProperty.html 第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. …

centos间文件传输

scp /home/vagrant/minio zx192.168.56.34:/home/zx /home/vagrant/minio 是你要传输的文件而且是当前机器登录用户有权限操作的文件 zx是目标机器的用户192.168.56.34是目标机器的地址 /home/zx是要传到这个文件夹下 要确保zx有/home/zx这个文件夹的操作权限 本质就是ssh文…

[leetcode] 27. 移除元素

文章目录 题目描述解题方法双指针java代码复杂度分析 相似题目 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O ( 1 ) O(1) O(1) …

分布(一)利用python绘制直方图

分布(一)利用python绘制直方图 直方图(Histogram)简介 直方图主要用来显示在连续间隔(或时间段)的数据分布,每个条形表示每个间隔(或时间段)的频率,直方图的…

2024年考PMP还有什么用?

PMP 是项目管理专业人士资格认证的意思,也是项目管理领域通用的证书, 做项目的基本都会去考。 要说 PMP 有啥作用? 个人感觉 PMP 证书更多的是跳槽、转行的敲门砖的作用,因为现在很多公司都要 PMP 证书,有了可以加分…

VS Code+Live Server插件开发游戏并结合内网穿透分享好友异地访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…