itk::Image 是遵循范型编程思想的类,其类型是由算法行为的类演化而来。ITK 支持任何像素类型和空间维的图像

1.创建图像

        这部分源代码在 Examples/DataRepresentation/Image/Image.cxx 中。
        这个例子阐述了如何人为地创建一个 itk::Image 类,下面是对图像类进行实例化、声明和创建的最简单程序代码。

//首先,必须包含图像类的头文件:
#include “itkImage.h”//然后必须决定像素的类型和图像的维,用这两个参数对图像类进行实例化。下面是创建一个三维、像素是无符号短字符数据类型的图像的程序:
typedef itk::Image< unsigned short, 3 > ImageType;//然后就可以调用 New( )操作创建图像并将结果分配到 itk::SmartPointer。
ImageType::Pointer image = ImageType::New( );
        在 ITK 中,图像以一个或多个区域组合的形式存在。一个区域是图像的一个子集,并有可能是系统中其他类所占有图像的一部分。一个比较普遍的区域是 LargePossibleRegion是一个完全定义的图像。其他重要的区域还有:BufferedRegion 是内存中图像的一部分;RequestedRegion 是在对图像进行操作时被滤波器或其他类要求的一部分。
        如上所述,在 ITK 中人为地创建图像需要对图像进行实例化,并将描述图像的区域与图像结合起来
        一个区域是由两个类来定义的:itk::Index 和 itk::Size 类。与图像结合的图像中的原始区域是由 Index 来定义的。区域的延伸或大小是由 Size 来定义的。Index 是由一个 n 维数列来表示的,在拓扑图像结构中这些表示图像最初的像素的数列的元素都是整数。当人为创建图像时,用户就需要定义图像的大小和图像的起始位置。有了这两个参数,就可以选择处理的区域。
       图像的起始点是由一个 Index 类定义的,这个类中存放了一个 n 维数列,数列中的元素都是整数,表示图像中各维上最初的像素值。
ImageType::IndexType start;//起点位置
start[0] = 0; // first index on X
start[1] = 0; // first index on Y
start[2] = 0; // first index on Z//区域大小是用一个相同大小的图像数列来表示的(使用 Size 类),数列中的元素是无符号
整数,表示图像像素在各个方向上的延伸。
ImageType::SizeType size;//各方向尺寸
size[0] = 200; // size along X
size[1] = 200; // size along Y
size[2] = 200; // size along Z//定义了起始地址和图像大小这两个参数就可以创建一个 ImageRegion 对象,这个区域是
用图像的起始地址和大小来初始化的。
ImageType::RegionType region;
region.SetSize( size );
region.SetIndex( start );

最后,这个区域传递给图像对象来定义其延伸和初始地址SetRegion 方法同时设定了LargePossibleRegion、BufferedRegion 和 RequestedRegion。注意:并未执行任何操作来给图像像素数据分配内存,调用 Allocate( )来进行分配内存,直到给区域分配了足够的内存来存放信息分配都不需要任何指令。

image->SetRegions( region );
image->Allocate( );
        实际上,很少直接给图像分配内存和对图像进行初始化,图像通常都是从一个源文件直接读取的,比如从一个文件或从硬件获取数据。

2.从文件中读取图像

ImageType::Pointer image = reader->GetOutput( );
        在 Reader 运行之前任何访问图像数据的企图都将产生一个无像素数据的图像,正如未对图像初始化必将导致程序崩溃一样。

3.访问像素数据

        本小节的源代码在文件 Examples/DataRepresentation/Image/Image3.cxx 中。
        这个例子阐述了 SetPixel( ) GetPixel( )方法的用法这两个方法可以直接访问图像中包含的像素数据。考虑到这两种方法相对缓慢,在高性能的访问需求中不宜使用。图像迭代器是有效访问图像像素数据的合适机制(有关图像迭代器的信息参见第十一章)。
        图像中每个像素的位置是由一个特定的 index 来区分的。一个 index 是一个整数数列,它定义了像素在图像中位置的坐标值。index 类型可以由图像自动定义并可以被像 itk::Index这样的操作访问。数列的长度必须与对应图像的大小相匹配。
        下面的代码是对一个 index 变量的声明并对其成员值进行分配。注意:index 并不是用智能指针进行访问的,这是因为 index 是不对任何对象共享的轻度对象。这些小对象产生出多样的版本,比使用智能指针机制分享它们更加有效。
        下面的代码是对 index 类型实例的声明并进行初始化,以便与其在图像中的像素位置进行联系:
ImageType::IndexType pixelIndex;
pixelIndex[0] = 27; // x position
pixelIndex[1] = 29; // y position
pixelIndex[2] = 37; // z position
        用 index 定义了像素位置后,就可以访问图像中像素的内容。GetPixel( )方法将可得到像素值
ImageType::PixelType pixelValue = image->GetPixel( pixelIndex ); 

        SetPixel( )方法可设定像素值
image->SetPixel( pixelIndex, pixelValue+1 );

        请注意 GetPixel( )使用拷贝来返回像素值,所以该方法不能用来更改图像数据的值。
        记住 SetPixel( )和 GetPixel( )这两种方法都是低效率的,只能用来调试或支持交互,例如点击鼠标查询像素值。

4.定义原点和间距

        本小节的源代码在文件 Examples/DataRepresentation/Image/Image4.cxx 中。
        尽管 ITK 可以执行一般图像处理的任务,但是这个平台的基本目的是处理医学图像数据,因此必须强制增加图像额外的信息。特别地,在一些坐标系中同像素和图像之间的物理空间位置相关联的信息极其重要。
        图像原点和间距是很多应用的基础。例如配准就是在物理坐标中执行的。在这样的处理中没有定义合适的原点和间距必将导致不一致的结果。没有空间信息的医学图像不能被用于医学诊断、图像分析、特征提取、放射辅助治疗和图像指导手术。换句话说,缺乏空间信息的医学图像不仅仅是无用的,而且是很危险的。
        图 4-1 阐述了与 itk::image 相关的几个重要几何概念。在这个图表中,圆卷表示像素的中心像素值假定为像素中心的单位脉冲函数像素间距是像素中心之间的距离,在各个坐标方向上可以是不同的图像原点是图像中第一个像素的坐标一个像素就是含有数据值的像素中心周围的矩形区域,如图 4-1 中右图所示,它可以被认为是图像网格中的一个单元。图像值的线性内插法就是在以这些像素中心为拐点的 Delaunay 区域中执行的。
        图像间距是在一个大小与图像坐标相匹配的 FixedArray 中表示的。为了人为地设定图像的间距,必须创建一个和图像数据类型相一致的数列。然后将这个数列的元素用相邻像素中心的间距来进行初始化。
        下面的程序代码阐述了图像类中处理原点和间距的方法

ImageType::SpacingType spacing;
// Note: measurement units (e.g., mm, inches, etc.) are defined by the application.
spacing[0] = 0.33; // spacing along X
spacing[1] = 0.33; // spacing along Y
spacing[2] = 1.20; // spacing along Z

        使用 SetSpacing( )方法来指向数列
image->SetSpacing( spacing );

        使用GetSpacing( )方法可以从图像中得到间距信息。这种方法返回一个FixedArray的值。
        返回对象可以用来读取数列的内容。注:关键字 const 表示数列是不可修改的。

const ImageType::SpacingType& sp = image->GetSpacing( );
std::cout << "Spacing = ";
std::cout << sp[0] << ", " << sp[1] << ", " << sp[2] << std::endl;

        图像原点的处理方式和间距是相似的。必须首先分配好合适的尺寸。任何一个组成部分都可以指定为原点坐标。这些坐标和图像中第一个像素的位置相一致,图像可以用物理空间中的任意参考系统,用户必须确保同一个应用下的所有图像都是使用相同的参考系统,这在图像配准应用中极其重要。
        下面的代码阐述了初始化图像原点的变量的创建和分配:

ImageType::PointType origin;
origin[0] = 0.0; // coordinates of the first pixel in N-D
origin[1] = 0.0;
origin[2] = 0.0;
image->SetOrigin( origin );

        使用 GetOrigin( )方法也可以从图像中得到原点。这将产生一个返回值,这个返回值可以用来读取数列中的内容。再次提醒注意:关键字 const 表示数列是不可修改的。

const ImageType::PointType& orgn = image->GetOrigin( );
std::cout << "Origin = ";
std::cout << orgn[0] << ", " << orgn[1] << ", " << orgn[2] << std::endl;

        图像原点和间距一经初始化,就会以物理空间坐标来正确映射到图像像素。下面的代码阐述了如何将物理空间映射到读取最近像素内容的图像 index 中。
        首先,必须声明一个 itk::Point 类型。这个 Point 类型在用来表示坐标的类型和空间大小之上模块化。在这种特殊的情况下,Point 的大小必须和图像的大小相匹配。
typedef itk::Point< double, ImageType::ImageDimension > PointType;

        像itk::Index一样,Point类是一个相对较小、较简单的对象。由于这个原因,它不用像ITK中大的数据对象那样引用计数,从而它也不能同itk::SmartPointers一起操作使用。Point对象像其他C++类实例一样简单进行声明。Point一经声明,就可以使用传统的数列符号来访问它的成员。特别地,允许使用[ ]操作。出于效率原因,在使用index访问一个特殊的Point成员时并不用执行任何校验限制。用户必须确认index在有效范围{0,−1}内。

PointType point;
point[0] = 1.45; // x coordinate
point[1] = 7.21; // y coordinate
point[2] = 9.28; // z coordinate

        图像将使用当前的原点和间距把 point 映射到 index必须提供一个 index 对象来接收映射结果。可以用图像类型中定义的 IndexType 来对 index 对象进行实例化:
ImageType::IndexType pixelIndex;

        图像类的 TransformPhysicalPointToIndex( )方法可以计算出与提供的 point 最接近的像素index。这个方法将核对这个 index 是否被包含在一个当前的缓冲像素数据里。这个方法返回一个布尔类型数据,表示这个 index 结果是否在这个缓冲区间内。当返回值是 false 时,表示输出的 index 无用。
        下面的代码阐述了 Point 到 index 的映射和访问图像像素数据的像素 index 的用法:

bool isInside = image->TransformPhysicalPointToIndex( point, pixelIndex );
if ( isInside )
{
ImageType::PixelType pixelValue = image->GetPixel( pixelIndex );
pixelValue += 5;
image->SetPixel( pixelIndex, pixelValue );
}

        GetPixel( )和 SetPixel( )方法都是非常低效的访问像素数据的方法,当需要大量访问像素数据时应该使用图像迭代器。

ITK 数据表达(图像)相关推荐

  1. 基于C++的ITK图像分割与配准学习笔记1(图像数据表达-图像)

    ITK学习参考资料整理汇总(包含 ItkSoftwareGuide.PDF英文版.ItkSoftwareGuide-2.4.0-中文版.医学图像分割与配准(1ITK初步分册) (1)PDF. 医学图像 ...

  2. ITK读取RGB图像像素值

    /*这个程序接收输入参数作为文件路径, 读取指定的图片数据(RGB), 并显示指定位置的像素值.(这里是[0,0]位置) */ #include "itkImage.h" #inc ...

  3. 斯坦福大学数据可视化课程学习笔记:第二节 从数据到图像

    <斯坦福大学数据可视化课程学习笔记>课程资源来自于斯坦福大学数据可视化课程,是我所在团队实习生提升计划的一部分.本系列是 "秉姝" 同学在学习过程中记录和整理的学习笔记 ...

  4. 5 | PyTorch加载真实数据:图像、表格、文本,one-hot

    在实际的工作中,常见的机器学习处理的数据大概分成三种,一种是图像数据,图像数据通常是RGB三通道的彩色数据,图像上的每个像素由一个数值表示,这个其实比较容易处理:一种是文本数据,文本数据挖掘就是我们通 ...

  5. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字、并为类型数据添加图像符号标签

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字.并为类型数据添加图像符号标签 目 ...

  6. Graphviz:利用可视化工具Graphviz将dot数据进行图像可视化或者图像保存(两大方法)之详细攻略

    Graphviz:利用可视化工具Graphviz将dot数据进行图像可视化或者图像保存(两大方法)之详细攻略 目录 graph_feature函数:为给定的特征生成特征谱系图

  7. Facebook开源数据高效图像Transformer,媲美SOTA CNN

    作者|魔王.小舟.杜伟 来源|机器之心 将自然语言处理领域主流模型 Transformer 应用在视觉领域似乎正在成为趋势.最近,Facebook 研究人员提出一项新技术--数据高效图像 Transf ...

  8. 计算机视觉:数据预处理-图像增广方法

    计算机视觉:数据预处理-图像增广方法 数据预处理 随机改变亮暗.对比度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 图像增广方法汇总 批量数据读取与加速 数据预处理 在计算 ...

  9. ITK:处理3D图像的2D切片

    ITK:处理3D图像的2D切片 内容提要 C++实现代码 内容提要 此示例说明了从3D体积中提取2D切片的常见任务.在该切片上执行一些处理,然后将其粘贴到与输入中的卷相同大小的输出卷上. C++实现代 ...

最新文章

  1. AI在医疗行业的最新进展
  2. 【编程大系】Java资源汇总
  3. mysql 添加用户_mysql创建用户与授权
  4. Java字符类isUpperCase()方法与示例
  5. 前端学习(768):构造对象与对象区别
  6. .NET二级域名共享Session
  7. CarMaker快速入门
  8. 使用hydra离线破解windows密码
  9. 论文中的三线表及表格规范
  10. 质因数分解的一些讨论(Pollard-Rho算法)
  11. 快车解密php,PHP迅雷、快车、旋风下载专用链转换代码
  12. Python面向对象案例之语音计算器
  13. APP推广:app推广的渠道有哪些既简单又有效的?
  14. 点灯科技——小爱同学/RFID/四路继电器
  15. 基于yolov5与改进VGGNet的车辆多标签实时识别算法
  16. Python 中 Logging 模块使用详情
  17. Android Amazon S3 功能接入
  18. 2020 年度开发工具 Top 100
  19. jieba分词自定义词典
  20. 开源IM项目OpenIM每周迭代版本发布-群管理 阅后即焚等-v2.0.6

热门文章

  1. 在windows下安装yii2框架
  2. Debian11_kubeadm1.23.5使用ingress-nginx暴露dashboard(3)
  3. 屏蔽QQ群消息的简单方法(转)
  4. hive on spark 线上问题排查案例分享
  5. linux下nginx安装与配置说明
  6. 华为的鸿蒙河图名字,华为地图起名“河图”,再次震撼国人
  7. 基于HTML旅游网站设计与实现 途游网站制作 学生DW静态旅游网页设计 html静态旅游风景区网页设计制作 web前端课程设计 web前端课程设计代码 web课程设计
  8. android 获取移动网络,Android获取移动当前APP移动流量的方法
  9. 防卫厅,采用VE合约制度
  10. pipenv install 包名 报错问题解决