【ITK库学习】使用itk库进行图像分割(四):水平集分割
目录
- 1、水平集
 - 2、itkFastMarchingImageFilter 快速步进分割
 - 3、itkShapeDetectionLevelSetImageFilter 快速步进分割
 
1、水平集
水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算,进行水平集分割。在itk中,所有基于分割滤波器水平集必须用浮点精度来进行操作,输出的数字化类型默认为浮点型,也可以被转换为双精度,但是不能使用整型或者无符号数据类型。
2、itkFastMarchingImageFilter 快速步进分割
该类使用快速行进求解Eikonal方程,其中速度始终为非负且仅取决于位置。
使用熵满足方案执行更新,其中仅使用“逆风”邻域。 Fast Marching 的此实现使用 std::priority_queue 来定位下一个要更新的正确网格位置。快速行进以 (N log N) 步扫描 N 个网格点,以获得锋面传播通过网格时的到达时间值。
当图像梯度很高时前面的传播速率很慢而梯度很低的区域传播速率快。此方法可是轮廓不断传播直到图像中的解剖结构边缘在那写边缘前将速率降低下来。
此类基于水平集图像类型和速度图像类型进行模板化,初始前沿由两个容器指定:一个包含已知点,另一个包含试验点。 活动点是那些已经是对象一部分的点,并且考虑包含试验点。 为了使过滤器不断发展,至少必须指定一些试验点。 例如,可以将它们指定为活动点周围的像素层。
速度函数可以指定为速度图像或速度常数,速度图像使用 SetInput() 方法设置。 如果速度图像为nullptr,则使用恒速函数,并使用SetSpeedConstant()方法指定。
如果速度函数恒定且值为1,则快速行进会产生距初始活动点的近似距离函数。FastMarchingImageFilter 在 ReinitializeLevelSetImageFilter 对象中使用,以创建距零水平集的有符号距离函数。
通过设置适当的停止值可以提前终止算法,当处理时间大于停止值时,算法终止。
FastMarchingImageFilter输出的是一个时间交叉图,对每一个像素,表达了到达这个像素位置之前所花费的时间。有两种方法可以指定输出图像信息(LargestPossibleRegion、Spacing、Origin):(a) 直接从输入速度图像复制 (b) 由用户指定,如果用户未指定所有信息,则使用默认值。
输出信息计算如下。 如果速度图像为 nullptr 或 OverrideOutputInformation 设置为 true,则根据用户指定的参数设置输出信息。 这些参数可以使用 SetOutputRegion()、SetOutputSpacing()、SetOutputDirection() 和 SetOutputOrigin() 方法指定。 否则,如果速度图像不为nullptr,则从输入速度图像复制输出信息。
可能的改进:在当前的实现中,std::priority_queue只允许从前面取出节点并从后面放入节点,要更新堆上已有的值,需要将新节点添加到堆中,失效的旧节点留在堆上,当它从顶部移除时,它将被识别为无效并且不被使用,未来的实现可以以不同的方式实现堆,从而允许更新值,这通常需要一些上移和下移函数以及从图像到堆的反向指针图像,以便找到要更新的节点。
常用的成员函数:
Set/GetStoppingValue():设置/获取快速行进算法停止值,当最小尝试点的值大于停止值时,算法终止Set/GetSpeedConstant():设置/获取速度常数,如果速度图像为nullptr,则SpeedConstant值将用于整个级别集,默认情况下,SpeedConstant`设置为 1.0Set/GetTrialPoints():设置/获取代表初始前沿的试验点容器,试验点表示为LevelSetNodes的VectorContainer`SetOutsidePoints():设置不打算评估的点的容器Set/GetOutputRegion/Size/Spacing/Origin/Direction():设置/获取输出的最大可能值、大小、间距、原点、方向计算,如果速度图像为nullptr或OverrideOutputInformation为true,则根据用户指定的参数设置输出信息,如果速度图像不为nullptr`,则从输入速度图像复制输出信息Set/GetOverrideOutputInformation():同上Set/GetCollectPoints():设置/获取收集点标志,检测算法以收集其访问过的所有节点的容器,对于为支持窄带的水平集算法创建窄带很有用Set/GetAlivePoints():设置/获取代表初始前沿的活动点容器,活动点表示为LevelSetNodes的VectorContainer`Set/GetNormalizationFactor():设置/获取速度图像的标准化因子,速度图像中的值除以该因子,这允许使用具有整数像素类型的图像来表示速度GetProcessedPoints():获取已处理点的容器,如果设置了 CollectPoints 标志,算法将收集所有已处理节点的容器,这对于定义支持窄带的水平集算法创建窄带非常有用GetLabelImage():获取点型标签图像GetLargeValue():获得巨大价值,该值用于表示分配给尚未访问的像素的时间无穷大的概念,该值默认设置为用于表示时间交叉图的像素类型max()的一半
示例代码:
#include "itkImage.h"
#include "itkFastMarchingImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;bool fastMarchingImageFilter(FloatImageType* image, FloatImageType* outImage)
{typedef itk::FastMarchingImageFilter<FloatImageType, FloatImageType> FastMarchingFilterType;typename FastMarchingFilterType::Pointer fastMarching = FastMarchingFilterType::New();using NodeContainer = FastMarchingFilterType::NodeContainer;using NodeType = FastMarchingFilterType::NodeType;auto seeds = NodeContainer::New();FloatImageType::IndexType seedPosition;seedPosition[0] = 256;seedPosition[1] = 256;seedPosition[2] = 100;constexpr double initialDistance = 1.0;const double seedValue = -initialDistance;NodeType node;                   //创建节点作为堆栈变量,并初始化node.SetValue(seedValue);node.SetIndex(seedPosition);     seeds->Initialize();             //初始化seeds->InsertElement(0, node);   //插入每个节点FloatImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();//double stopTime = 100;fastMarching->SetInput(image);fastMarching->SetTrialPoints(seeds);fastMarching->SetSpeedConstant(1.0);fastMarching->SetOutputSize(size);//fastMarching->SetStoppingValue(stopTime);try{fastMarching->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outImage = fastMarching->GetOutput();return true;
}
 
3、itkShapeDetectionLevelSetImageFilter 快速步进分割
该类根据用户提供的边缘电位图分割图像中的结构。
SegmentationLevelSetImageFilter 类和 ShapeDetectionLevelSetFunction 类包含充分了解如何使用此过滤器所需的附加信息。
概述
 此类是水平集方法分段滤波器,初始轮廓向外(或向内)传播,直到它“粘住”形状边界,这是通过使用基于用户提供的边缘电位图的水平集速度函数来完成的,这种分割方法遵循 Malladi 等人 (1995) 的方法。
输入
 该过滤器需要两个输入。
 第一个输入是初始水平集,初始水平集是包含初始轮廓/表面作为零水平集的真实图像,例如,通常使用距初始轮廓/表面的带符号距离函数,请注意,对于此算法,初始轮廓必须完全位于要分割的结构内部(或完全外部)。
 第二个输入是特征图像,对于该滤波器,这是边缘电位图,边缘势图的一般特征是,它在边缘附近的区域中具有接近于零的值,并且在形状本身内部具有接近于1的值。 通常,边缘势图是根据图像梯度计算的,例如:
 
 其中: I 是图像强度,(∇*G) 是高斯算子的导数。
参数
 PropagationScaling 参数可用于在向外传播(正缩放参数)与向内传播(负缩放参数)之间切换。
 可以使用PropagationScaling和CurvatureScaling参数的组合来调整生成的轮廓/表面的平滑度。CurvatureScaling参数越大,生成的轮廓越平滑,为了使该算法正确运行,CurvatureScaling 参数应为非负数。 为了遵循 Malladi 等人论文中的实现,将 PropagationScaling 设置为 ±1.0,将 CurvatureScaling设置为 ϵ。
请注意,此过滤器没有平流项,设置平流缩放不会产生任何效果。
输出
 滤波器输出单个标量实值图像,输出图像中的负值表示分割区域的内部,图像中的正值表示分割区域的外部,图像的零交叉点对应于传播前沿的位置。
 有关详细信息,请参阅 SparseFieldLevelSetImageFilter 和 SegmentationLevelSetImageFilter。
常用的成员函数:
- SetInput():设置初始水平集
 - SetFeatureImage():设置特征图像
 
示例代码:
#include "itkImage.h"
#include "itkShapeDetectionLevelSetImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool shapeDetectionLevelSetImageFilter(FloatImageType* image, FloatImageType* featureImage, FloatImageType* outImage)
{typedef itk::ShapeDetectionLevelSetImageFilter<FloatImageType, FloatImageType> ShapeDetectionLevelSetFilterType;typename ShapeDetectionLevelSetFilterType::Pointer shapeDetection = ShapeDetectionLevelSetFilterType::New();shapeDetection->SetInput(image);                         //初始水平集shapeDetection->SetFeatureImage(featureImage);           //特征图像,一个边缘潜在图像try{shapeDetection->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outImage = shapeDetection->GetOutput();return true;
}
相关文章:
【ITK库学习】使用itk库进行图像分割(四):水平集分割
目录 1、水平集2、itkFastMarchingImageFilter 快速步进分割3、itkShapeDetectionLevelSetImageFilter 快速步进分割 1、水平集 水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算,进行水平集分割。在itk中,所…...
Kali Linux——aircrack-ng无线教程
目录 一、准备 二、案例 1、连接usb无线网卡 2、查看网卡信息 3、开启网卡监听 4、扫描wifi信号 5、抓取握手包 6、强制断开连接 7、破解握手包 三、预防 一、准备 1、usb无线网卡(笔记本也是需要用到) 2、密码字典(Kali 系统自带…...
15.vdo管理
vdo管理 文章目录 vdo管理一、VDO基本概念二、常用操作三、验证VDO卷 一、VDO基本概念 VDO(Virtual Data Optimize虚拟数据优化) 通过压缩或删除存储设备上的数据来优化存储空间。VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部。这些块设备也…...
安全漏洞周报(2024.01.01-2023.01.08)
漏洞速览 ■ 用友CRM系统存在逻辑漏洞 漏洞详情 1. 用友CRM系统存在逻辑漏洞 漏洞介绍: 某友CRM系统是一款综合性的客户关系管理软件,旨在帮助企业建立和维护与客户之间的良好关系。它提供了全面的功能,包括销售管理、市场营销、客户服…...
msckf-vio 跑Euroc数据集,并用evo进行评估
所需材料: Euroc数据集主页:https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码:https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码,可参考https://blog.csdn.ne…...
大模型LLM在 Text2SQL 上的应用实践
一、前言 目前,大模型的一个热门应用方向Text2SQL,它可以帮助用户快速生成想要查询的SQL语句,再结合可视化技术可以降低使用数据的门槛,更便捷的支持决策。本文将从以下四个方面介绍LLM在Text2SQL应用上的基础实践。 Text2SQL概…...
数据库:园林题库软件(《城市绿地设计规范》答题卷一 )
《城市绿地设计规范》答题卷一 填空题 1、城市绿地设计应贯彻人与自然和谐共存、可持续发展、经济合理等基本原则,创造良好生态和景观效果,促进人的身心健康。 2、城市绿地 urban green space 以植物为主要存在形态,用于改善城市生态&am…...
MySQL之视图外连接、内连接和子查询的使用
目录 一. 视图 1.1 含义 1.2 视图的基本语法 1.3 视图的实操 二. 外连接、内连接和子查询的使用 2.1 SQL脚本 2.2 使用外连接、内连接和子查询进行解答 三. 思维导图 一. 视图 1.1 含义 视图(view)是一种虚拟存在的表,是一个逻辑表&#x…...
MoE模型性能还能更上一层楼?一次QLoRA微调实践
Fine-Tuning Mixtral 8x7B with QLoRA:Enhancing Model Performance 🚀 编者按:最近,混合专家(Mixture of Experts,MoE)这种模型设计策略展现出了卓越的语言理解能力,如何在此基础上进一步提升 MoE 模型的性能成为业界…...
Java线程学习笔记
1、判断线程存活 1. 当线程run()或者call()方法执行结束,线程进入终止状态 2. 当线程内发生异常,并且异常没有被捕获,线程进入终止状态 3. 线程调用stop()方法后,线程进入终止状态(不推荐使用) 当主线程结束时,其他线程…...
平面光波导_三层均匀平面光波导_射线分析法
平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导: 折射率沿 x x x 方向有变化,沿 y y y、 z z z 方向没有变化三层:芯区( n 1 n_1 n1) > > > 衬底( n 2 n_2 n2) ≥ \geq ≥ 包层( n 3 n_3 n3)包层通常为空…...
IPV6学习记录
IPV6的意义 从广义上来看IPV6协议包含的内容很多: IPV6地址的生成与分配 IPV6的报头的功能内容 IPV4网络兼容IPV6的方案 ICMPv6的功能(融合了arp和IGMP功能) IPV6的路由方式 ipv6的诞生除了由于ipv4的地址枯竭外,很大程度上也是因为ipv4多年的发展产生了很多…...
使用proteus进行主从JK触发器仿真失败原因的分析
在进行JK触发器的原理分析的时候,我首先在proteus根据主从JK触发器的原理进行了实验根据原理图,如下图: 我进行仿真,在仿真的过程中,我向电路图中添加了外部的置0/1端口,由此在proteus中得到下面的电路图 …...
Golang基础入门及Gin入门教程(2024完整版)
Golang是Google公司2009年11月正式对外公开的一门编程语言,它不仅拥有静态编译语言的安全和高性能,而 且又达到了动态语言开发速度和易维护性。有人形容Go语言:Go C Python , 说明Go语言既有C语言程序的运行速度,又能达到Python…...
202312 青少年软件编程(C/C++)等级考试试卷(四级)电子学会真题
2023年12月 青少年软件编程(C/C)等级考试试卷(四级)电子学会真题 1.移动路线 题目描述 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增…...
leetcode-合并两个有序数组
88. 合并两个有序数组 题解: 这是一个经典的双指针问题,我们可以使用两个指针分别指向nums1和nums2的最后一个元素,然后比较两个指针所指向的元素大小,将较大的元素放入nums1的末尾,并将对应的指针向前移动一位。重复…...
网站怎么做google搜索引擎优化?
网站想做google搜索引擎优化,作为大前提,您必须确保网站本身符合google规范,我们不少客户实际上就连这点都无法做到 有不少客户公司自己本身有技术,就自己弄一个网站出来,做网站本身不是难事,但前提是您需要…...
TDengine 签约西电电力
近年来,随着云计算和物联网技术的迅猛发展,传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上,电力行业构建了信息网络、通信网络和能源网络,致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…...
赛门铁克OV代码签名证书一年多少钱?
在当前,软件和应用程序的安全性变得尤为重要。为了保护软件的完整性和安全性,越来越多的开发者和厂商开始采用代码签名的方式来确保软件的真实性和完整性。赛门铁克OV代码签名证书成为了其中一个备受信任的选择。那么,赛门铁克OV代码签名证书…...
Dockerfile详解
文章目录 一、Dockerfile介绍二、常用指令三、Dockerfile示例四、最佳实践 一、Dockerfile介绍 Dockerfile是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据Dockerfile的内容构建镜像。 一般的,Dockerfile分为四部分:基础…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
