【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,则快速行进会产生距初始活动点的近似距离函数。FastMarchingImageFilterReinitializeLevelSetImageFilter 对象中使用,以创建距零水平集的有符号距离函数。

通过设置适当的停止值可以提前终止算法,当处理时间大于停止值时,算法终止。

FastMarchingImageFilter输出的是一个时间交叉图,对每一个像素,表达了到达这个像素位置之前所花费的时间。有两种方法可以指定输出图像信息(LargestPossibleRegionSpacingOrigin):(a) 直接从输入速度图像复制 (b) 由用户指定,如果用户未指定所有信息,则使用默认值。

输出信息计算如下。 如果速度图像为 nullptrOverrideOutputInformation 设置为 true,则根据用户指定的参数设置输出信息。 这些参数可以使用 SetOutputRegion()SetOutputSpacing()SetOutputDirection()SetOutputOrigin() 方法指定。 否则,如果速度图像不为nullptr,则从输入速度图像复制输出信息。

可能的改进:在当前的实现中,std::priority_queue只允许从前面取出节点并从后面放入节点,要更新堆上已有的值,需要将新节点添加到堆中,失效的旧节点留在堆上,当它从顶部移除时,它将被识别为无效并且不被使用,未来的实现可以以不同的方式实现堆,从而允许更新值,这通常需要一些上移和下移函数以及从图像到堆的反向指针图像,以便找到要更新的节点。

常用的成员函数

  • Set/GetStoppingValue():设置/获取快速行进算法停止值,当最小尝试点的值大于停止值时,算法终止
  • Set/GetSpeedConstant():设置/获取速度常数,如果速度图像为nullptr,则SpeedConstant值将用于整个级别集,默认情况下,SpeedConstant`设置为 1.0
  • Set/GetTrialPoints():设置/获取代表初始前沿的试验点容器,试验点表示为 LevelSetNodesVectorContainer`
  • SetOutsidePoints():设置不打算评估的点的容器
  • Set/GetOutputRegion/Size/Spacing/Origin/Direction():设置/获取输出的最大可能值、大小、间距、原点、方向计算,如果速度图像为nullptrOverrideOutputInformationtrue,则根据用户指定的参数设置输出信息,如果速度图像不为nullptr`,则从输入速度图像复制输出信息
  • Set/GetOverrideOutputInformation():同上
  • Set/GetCollectPoints():设置/获取收集点标志,检测算法以收集其访问过的所有节点的容器,对于为支持窄带的水平集算法创建窄带很有用
  • Set/GetAlivePoints():设置/获取代表初始前沿的活动点容器,活动点表示为LevelSetNodesVectorContainer`
  • 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 参数可用于在向外传播(正缩放参数)与向内传播(负缩放参数)之间切换。
可以使用PropagationScalingCurvatureScaling参数的组合来调整生成的轮廓/表面的平滑度。CurvatureScaling参数越大,生成的轮廓越平滑,为了使该算法正确运行,CurvatureScaling 参数应为非负数。 为了遵循 Malladi 等人论文中的实现,将 PropagationScaling 设置为 ±1.0,将 CurvatureScaling设置为 ϵ。

请注意,此过滤器没有平流项,设置平流缩放不会产生任何效果。

输出
滤波器输出单个标量实值图像,输出图像中的负值表示分割区域的内部,图像中的正值表示分割区域的外部,图像的零交叉点对应于传播前沿的位置。
有关详细信息,请参阅 SparseFieldLevelSetImageFilterSegmentationLevelSetImageFilter

常用的成员函数

  • 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;
}

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

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

相关文章

STM32 ADC采样调试笔记

最近在搞STM32L051系列一个小MCU&#xff0c;要用这个去采集两路ADC作为输入。期间也碰到过一些问题&#xff0c;顺便记录下。 ADC采集原理不说了&#xff0c;主要采集电压&#xff0c;用数字进行细分&#xff0c;这样就可以知道输入电压多少了&#xff0c;网上也有很多相关文…

220v免驱动led驱动芯片:SM2082EDS适用于LED 球泡灯,筒灯

220V免驱动LED驱动芯片是一种电源管理芯片&#xff0c;它可以在接入220V交流电后&#xff0c;将电压转换为适合LED灯珠工作的直流电压&#xff0c;从而点亮LED灯珠。这种驱动芯片通常具有较高的转换效率和稳定性&#xff0c;能够有效地降低能耗和延长LED灯珠的寿命。 SM2082EDS…

基于SpringBoot的教学管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

​软件测试面试:关键问题解析

在软件开发领域&#xff0c;测试是确保软件质量的重要环节。面试是评估软件测试人员技能和经验的关键时刻。在一个软件测试面试中&#xff0c;面试官通常会问一系列问题来评估面试者的知识、技能和解决问题的能力。本文将介绍一些常见的软件测试面试问题&#xff0c;并给出一些…

【2024最新版】接口自动化测试基础(基础篇)

接口自动化测试基础 目录 1、什么是接口自动化测试 2、接口自动化测试要素 3、常用的落地方案 什么是接口自动化测试 PART 01 1.1什么是接口自动化测试 接口自动化测试是一种通过编写脚本或使用工具来自动化执行应用程序接口来验证接口正确性的测试方法。接口自动化测试的…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

【Python】使用tkinter设计开发Windows桌面程序记事本(3)

上一篇&#xff1a;【Python】使用tkinter设计开发Windows桌面程序记事本&#xff08;2&#xff09;-CSDN博客 下一篇&#xff1a; 作者发炎 本文章与"记事本项目"的第一篇文章类似。这里是重新创建新的"页面设置"子窗口&#xff0c;进行开发设计。 那为…

自动化测试的三种等待方式

自动化测试的等待方式主要有三种&#xff1a;强制等待、隐式等待和显式等待。 1. 强制等待&#xff08;Sleep&#xff09; 通过在代码中使用Thread.sleep()方法来实现的&#xff0c;该方法会阻塞当前线程的执行&#xff0c;程序会暂停指定的时间。 这种方式没有条件判断&…

SpringMVC 域对象共享数据

文章目录 2、使用ModelAndView向request域对象共享数据3、使用Model向request域对象共享数据4、使用map向request域对象共享数据5、使用ModelMap向request域对象共享数据6、Model、ModelMap、Map的关系7、向session域共享数据8、向application域共享数据 1、使用ServletAPI向re…

钉钉java登录

获取token &#xff1a;API Explorer 获取部门列表&#xff1a;获取部门列表 - 钉钉开放平台

通过wireshark抓取的流量还原文件(以zip为例)

wireshark打开流量包&#xff0c;通过zip关键字查找 追踪流可查看详细信息 选中media Type右键&#xff0c; 点击导出分组字节流选项 将生成的文件进行命名&#xff0c;需要时什么格式就以什么格式后缀

leetcode:LCR 159. 库存管理 III(python3解法)

难度&#xff1a;简单 仓库管理员以数组 stock 形式记录商品库存表&#xff0c;其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量&#xff0c;返回 顺序不限。 示例 1&#xff1a; 输入&#xff1a;stock [2,5,7,4], cnt 1 输出&#xff1a;[2]示例…

探秘人工智能大会:揭示未来技术发展趋势与学习之道

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面。 参加人工智能大会&#xff0c;不仅能够洞察到最前沿的技术动态&#xff0c;还能与业界专家、学者交流思想&#xff0c;共同探讨AI的未来发展。本文将带您探秘人工智能大…

nuxt pm2使用、启动、问题解决方案

pm2简介 pm2是一个进程管理工具,可以用它来管理node进程&#xff0c;并查看node进程的状态&#xff0c;当然也支持性能监控&#xff0c;进程守护&#xff0c;负载均衡等功能&#xff0c;在前端和nodejs的世界中用的很多 pm2安装 安装pm2: $ npm install -g pm2查看pm2的安装…

TinyLlama-1.1B(小羊驼)模型开源-Github高星项目分享

简介 TinyLlama项目旨在在3万亿tokens上进行预训练&#xff0c;构建一个拥有11亿参数的Llama模型。经过精心优化&#xff0c;我们"仅"需16块A100-40G的GPU&#xff0c;便可在90天内完成这个任务&#x1f680;&#x1f680;。训练已于2023-09-01开始。项目地址&#…

2024在视频号开店怎么样?平台现状如下,有电商经验者优先!

我是王路飞。 现在开网店、做电商的平台有很多&#xff0c;但是有着绝对流量优势的&#xff0c;除了抖音之外就是视频号了。 但是抖音跟视频号相比&#xff0c;已经属于一个很成熟的平台了&#xff0c;商家们也开始进入到内卷阶段了。 所以&#xff0c;如果你们2024年想做电…

[AutoSar]基础部分 RTE 07 VFB虚拟功能总线

目录 关键词平台说明一、VFB1.1VFB是什么1.1VFB的好处1.2VFB的坏处 二、VFB在ECU内部的描述2.1Components2.2 Port-Interfaces2.3 Port2.4 Compositions 关键词 嵌入式、C语言、autosar、VFB 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0…

【Java后端】——JAVA后端学习路线

前言 hello小伙伴们&#xff0c;博主学后端也有一段时间了&#xff0c;感觉后端的知识确实比较多&#xff0c;对于逻辑思维的要求和基础要求也比较高。接下来咱们就一起捋一捋后端的学习路线&#xff0c;然后咱们就开始按顺序对每一块知识进行复习&#xff0c;总结和串联。 j…

bmp图像文件格式超详解

0 BMP简介 BMP(Bitmap-File)图形文件&#xff0c;又叫位图文件&#xff0c;是Windows采用的图形文件格式&#xff0c;在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。一个BMP文件由四部分组成&#xff1a; B…

Redis-Cluster 与 Redis 集群的技术大比拼

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis-Cluster 与 Redis 集群的技术大比拼 前言概念与原理对比Redis-Cluster&#xff1a;基于哈希槽的分布式解决方案传统 Redis 集群&#xff1a;主从架构下的数据分片方式 搭建与配置的异同Redis-Cl…