目录

  • 1.概述
  • 2.过程讲解
  • 3.代码
  • 4.结果

1.概述

Itk::PointSet 类是与图像类交互的。因此点集中的点可以很方便地保存从图像计算得到的值。与点相关的值被指定为PixelType像素类型,以便使它跟图像术语保持一致。工具包中的泛型编程方式提供的灵活性,使得用户可以按自己的意愿来定义类型。PixelType像素类型是点集PointSet 的第一个模板参数。

2.过程讲解

下面的代码为像素类型定义了一个特殊的类型,并用它实例化一个点集PointSet类。

typedef unsigned short PixelType;
typedef itk::PointSet< PixelType, 3 > PointSetType;

使用SetPointData( )方式可以对点集PointSet 插入数据。该方法要求用户提供一个标识符。数据将和具有相同标识符的点相关联。用户需要负责验证插入点和插入数据之间的适当匹配。

下面一行程序阐述了SetPointData( )方法的用法

unsigned int dataId = 0;
PixelType value = 79;
pointSet->SetPointData( dataId, value );

使用GetPointData( )方法可以从点集PointSet 读入与点相关的数据。该方法要求用户提供点的标识符和一个能够安全写入像素数据的位置的有效指针。当这个标识符和点集PointSet 中的标识符不相匹配时,将返回false,并且返回的像素值也是无效的。用户负责在使用点集数据之前检查返回的布尔值。

const bool found = pointSet->GetPointData( dataId, & value );
if( found )
{std::cout << "Pixel value = " << value << std::endl;
}

SetPointData( )GetPointData( )并不是得到点中存储数据的最有效方法。使用PointDataContainer提供的迭代器来得到数据会更加有效。

与点相关的数据储存在PointDataContainers 内部。与点使用的方式相同,使用的实际容器类型取决于点集PointSet的方式是静态的还是动态的。静态点集使用itk::VectorContainer,而动态点集使用itk::MapContainer。数据容器的类型是作为点集PointSet 的一个特性来定义的。下面阐述了这个类型如何从特性中提取,并如何用来方便地声明全局命名空间上的一个相似类型:

typedef PointSetType::PointDataContainer PointDataContainer;

现在使用这个类型就可以创建一个数据容器的实例。这是一个标准的引用计数对象,因此使用New( )方法来创建对象并将刚创建的对象分配给一个智能指针。

PointDataContainer::Pointer pointData = PointDataContainer::New();

使用InsertElement( )方法将像素数据插入到容器中。这种方式需要为每个点数据提供一个标识符。

unsigned int pointId = 0;
PixelType value0 = 34;
PixelType value1 = 67;
pointData->InsertElement( pointId++ , value0 );
pointData->InsertElement( pointId++ , value1 );

最后使用SetPointData( ) 方法将点数据容器PointDataContainer 分配给点集PointSet。这将替代点集PointSet 上以前存在的任何PointDataContainer

使用GetPointData( )方法可以从点集PointSet 得到PointDataContainer。该方法返回点集PointSet拥有的实际容器的指针(分配给一个智能指针)。

PointDataContainer::Pointer pointData2 = pointSet->GetPointData();

顺序访问点数据的最有效方式是使用PointDataContainer提供的迭代器。Iterator类型属于PointsContainer 类的特性。迭代器不是一个引用计数类,所以它可以直接从特性创建而不必使用智能指针。

typedef PointDataContainer::Iterator PointDataIterator;

迭代器的后继使用与STL迭代器类似。使用Begin( )方法从容器得到第指向一个点的迭代器,并分配给另一个迭代器。

PointDataIterator pointDataIterator = pointData2->Begin();

迭代器中的++操作符可以被用来从一个点指向下一个点。迭代器指向的PixelType的实际值可以使用Value( )方法得到。通过比较当前迭代器和用End( )方法返回的点容器PointsContainer,就可以控制循环遍历所有的点数据。下面的代码阐述了遍历点数据的典型循环:

PointDataIterator end = pointData2->End();
while( pointDataIterator != end )
{PixelType p = pointDataIterator.Value(); // access the pixel data
std::cout << p << std::endl; // print the pixel data
++pointDataIterator; // advance to next pixel/point
}

注意:与STL中一样,使用End( )方法返回的迭代器不是一个有效的迭代器。这是一个表示越过末端的,在访问了容器的最后一个元素后再前进一步的迭代器值。

3.代码

 //  `Itk::PointSet` 类是与图像类交互的。因此点集中的点可以很方便地保存从图像计算得到的值。
// 与点相关的值被指定为`PixelType`像素类型,以便使它跟图像术语保持一致。工具包中的泛型编程方式提供的灵活性,
// 使得用户可以按自己的意愿来定义类型。`PixelType`像素类型是点集`PointSet` 的第一个模板参数。#include "itkPointSet.h"int
main(int, char *[])
{//  下面的代码为像素类型定义了一个特定的类型,并用它实例化一个PointSet类。using PixelType = unsigned short;using PointSetType = itk::PointSet<PixelType, 3>;// 这里实例化了一个点集PointSetType::Pointer pointSet = PointSetType::New();//  使用`SetPointData( )`方式可以对点集PointSet 插入数据。该方法要求用户提供一个标识符。// 数据将和具有相同标识符的点相关联。用户需要负责验证插入点和插入数据之间的适当匹配。 // 下面一行程序阐述了SetPointData( )方法的用法unsigned int dataId = 0;PixelType    value = 79;pointSet->SetPointData(dataId, value);////  使用GetPointData( )方法可以从点集PointSet 读入与点相关的数据。该方法要求用户提供点的标识符和一个能够安全写入像素数据的位置的有效指针。// 当这个标识符和点集PointSet 中的标识符不相匹配时,将返回false,并且返回的像素值也是无效的。用户负责在使用点集数据之前检查返回的布尔值。const bool found = pointSet->GetPointData(dataId, &value);if (found){std::cout << "Pixel value = " << value << std::endl;}//  SetPointData( )和GetPointData( )并不是访问点中存储数据的最有效方法。使用PointDataContainer提供的迭代器来得到数据会更加有效。//  与点相关的数据储存在PointDataContainers内部。与点使用的方式相同,// 使用的实际容器类型取决于点集PointSet的方式是静态的还是动态的。静态点集使用itk::VectorContainer,而动态点集使用itk::MapContainer。// 数据容器的类型是作为点集PointSet 的一个特性来定义的。下面阐述了这个类型如何从特性中提取,并如何用来方便地声明全局命名空间上的一个相似类型://using PointDataContainer = PointSetType::PointDataContainer;////  现在使用这个类型就可以创建一个数据容器的实例。这是一个标准的引用计数对象,因此使用`New( )`方法来创建对象并将刚创建的对象分配给一个智能指针。PointDataContainer::Pointer pointData = PointDataContainer::New();//  使用InsertElement( )方法将像素数据插入到容器中。这种方式需要为每个点数据提供一个标识符。unsigned int pointId = 0;PixelType value0 = 34;PixelType value1 = 67;pointData->InsertElement(pointId++, value0);pointData->InsertElement(pointId++, value1);// 最后使用SetPointData( ) 方法将点数据容器PointDataContainer 分配给点集PointSet。这将替代点集PointSet 上以前存在的任何PointDataContainer。pointSet->SetPointData(pointData);////  使用GetPointData( )方法可以从点集PointSet 得到PointDataContainer。该方法返回点集PointSet拥有的实际容器的指针(分配给一个智能指针)。PointDataContainer::Pointer pointData2 = pointSet->GetPointData();// 顺序访问点数据的最有效方式是使用PointDataContainer提供的迭代器。Iterator类型属于PointsContainer 类的特性。// 迭代器不是一个引用计数类,所以它可以直接从特性创建而不必使用智能指针。using PointDataIterator = PointDataContainer::Iterator;// 迭代器的后续使用遵循了STL迭代器的要求。使用\code{Begin()}方法从容器中获得指向第一点的迭代器,并将其赋给另一个迭代器。PointDataIterator pointDataIterator = pointData2->Begin();////  迭代器中的++操作符可以被用来从一个点指向下一个点。迭代器指向的PixelType的实际值可以使用Value( )方法得到。// 通过比较当前迭代器和用End( )方法返回的点容器PointsContainer,就可以控制循环遍历所有的点数据。下面的代码阐述了遍历点数据的典型循环:PointDataIterator end = pointData2->End();while (pointDataIterator != end){PixelType p = pointDataIterator.Value(); // access the pixel datastd::cout << p << std::endl;             // print the pixel data++pointDataIterator;                     // advance to next pixel/point}// 注意:与STL中一样,使用End( )方法返回的迭代器不是一个有效的迭代器。这是一个表示越过末端的,在访问了容器的最后一个元素后再前进一步的迭代器值。return EXIT_SUCCESS;
}

4.结果

ITK入门教程(13)点集之得到点中的存储数据相关推荐

  1. ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门

    ASP.NET Core 入门教程 8.ASP.NET Core + Entity Framework Core 数据访问入门 原文:ASP.NET Core 入门教程 8.ASP.NET Core ...

  2. ITK入门教程(11)点集之创建一个点集

    目录 1.概述 2.过程 3.代码 4.结果 1.概述 Itk::PointSet 是一种在n 维空间中以点集的形式来表示几何图形的基类.它是为itk::Mesh提供操作点集的必要方法的基类.点具有和 ...

  3. ITK入门教程(10)ITK从缓冲器中导入图像数据

    目录 1.概述 2.过程分析 3.代码样例 4.结果展示 1.概述 这个例子阐述了如何导入数据到itk::Image类中.这在和其它软件系统接口时非常有用.许多系统使用连续的内存块作为图像像素数据的缓 ...

  4. mysql数据库入门教程(1):数据库的相关概念,存储特点,软件安装教程,数据库启动,服务端登录退出

    1为什么使用数据库 使用 内存(数组,集合)存储数据,一断电容易消失数据. 使用文件存储数据,断电不消失.但存储大量数据时难以查找. 数据库:能实现数据持久化,方便查询 2数据库相关概念 DB(dat ...

  5. ITK入门教程(12)点集之得到存储的点

    目录 1.概述 2.过程 3.代码 4.结果 1.概述 Itk::PointSet 类使用一个内部容器来管理itk::Points的存储.一般来说,通过使用点容器的直接访问方法来管理点将更加有效. 2 ...

  6. ITK入门教程(15)向量作为像素类型

    目录 1.概述 2.过程详解 3.代码 4.结果展示 1.概述 这个例子阐述了如何参数化一个点集来管理一个特定的像素类型.将向量值和点相关联以创建一个几何表示是很普遍的. 下面的代码展示了如何使用向量 ...

  7. 零基础CSS入门教程(13)–边框样式

    点此查看 所有教程.项目.源码导航 本文目录 1. 前言 2. 边框的样式 3. 边框宽度 4. 边框颜色 5. 简写属性 6. 单独设定各边样式 7. 小结 1. 前言 边框是使用频率很高的样式,图 ...

  8. ITK入门教程(17)nii,mhd,stl之间的相互转换

    本文细说一下医学图像中常见的文件格式之间的转换. 1.如何将raw/mhd转换为Nifti/nii 您应该能够使用 SimpleITK 来完成.你会做这样的事情: import SimpleITK a ...

  9. ITK入门教程(6)ITK图像数据访问与修改(低效版本)

    主要内容 1.概述 2.代码展示 3.结果展示 参考目录 1.概述 本节阐述SetPixel( )和GetPixel( )方法的用法.这两个方法可以直接访问图像中包含的像素数据.考虑到这两种方法相对缓 ...

最新文章

  1. linux安装识别硬盘比raid小,如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
  2. lucene,基于QueryParser的搜索
  3. 【Laravel-海贼王系列】第十三章,路由控制器解析
  4. emq数据储存到mysql_EMQ X 规则引擎系列(三)存储消息到 InfluxDB 时序数据库
  5. 【ubuntu-qt-dlib】 配置问题 (二) terminate called after throwing an instance of 'dlib::image_load_error'
  6. IntelliJ IDEA for Mac 如何设置在HTML和XML文件编辑窗口显示浏览器图标
  7. 关于ping命令的工作原理
  8. python对角线图_python对角线图_python – 在Seaborn Jointplot上绘制对角线(相等的线)...
  9. IOS微信API异常:unrecognized selector sent to instance 0x17005c9b0'
  10. 虹软人脸识别在 linux中so文件加载不到的问题
  11. 炼丹手册——数据增广
  12. Linux笔记(一)——虚拟机的安装与Centors安装,安装vmtools,虚拟机的克隆,虚拟机的快照,共享文件的使用
  13. 我的电脑(ACER 4750G)升级
  14. matlab的setup阶跃曲线图,matlab 绘制系统的单位阶跃响应曲线 并编写程序求峰值时间 超调量 | 学步园...
  15. [论文阅读] Beyond part models: Person retrieval with refined part pooling
  16. JavaScript中栈内存与堆内存分别是什么?
  17. print log trace (I forgot it )
  18. 尼玛尼玛尼玛。大神来分析下?大马小马你妹的马
  19. JavaScript初学笔记总汇
  20. 热血江湖服务端开服搭建需要准备什么

热门文章

  1. collectionView的每一组的组头部和尾部的设置
  2. centos添加桌面快捷方式
  3. 将10件商品的英文名称存储在数组中,输出名称的第3个字符是‘b‘的所有商品英文名称;再输出名称的长度小于6个字符的商品英文名称。
  4. excel表格如何转换成word表格_Word如何制作表格?Word制作表格超实用技巧
  5. C#下usb条码扫描枪的钩子实现的改进
  6. 使用谷歌浏览器查看ws消息
  7. SEO主要是做什么的?零基础能学习吗?
  8. 静静的分析华为Mate X的部分“亮点”,静静的围观它装逼!
  9. 背阔肌(04):杠铃俯身划船
  10. 呼叫系统的技术实现原理和运作流程