用到的头文件:#include<itkImage.h>
整体思路: 首先创建一个Image图像对象,然后创建一个区域并且对该区域的原点和大小进行初始化,最后关联区域和图像,并且为图像分配内存。
我的理解就是
ITK创建图像对象是没有初始化位置和图像范围的,所以要创建一个区域对象,对他进行位置和范围赋值,然后告诉图像:你要到那个区域去(也就是将图像与区域关联)**
itk:: Image<TPixel,VImageDimeniton>模板类
TPixel:像素类型
VImageDimeniton:图像维度
带着这两个参数我们可以实例化Image类
可以使用
using ImageType = itk::Image<unsigned short,3>
或者
typedef itk::Image<unsigned short, 3> ImageType;
语句来创建一个 像素类型为unsigned short的3D图像。
(这个还是比较好理解的,如果有不太懂得可以去百度一下Typedef的用法)
ImageType::Pointer image = ImageType::New();
利用Image类自带的智能指针Pointer通过New()方法来创建image图像
图像区域
(翻译自官网,可能会不太准确)
在 ITK 中,图像以一个或多个区域组合的形式存在。一个区域是图像的一个子集,并有可能是系统中其他类所占有的图像的一部分。
LargePossibleRegion 是一个以完整部分定义的图像。
BufferedRegion 是内存中图像的一部分
RequestedRegion 是在对图像进行操作时被滤波器或其他类要求的一部分。
在ITK中,手动创建一个图像需要如前所示实例化该图像,然后将描述该图像的区域与其关联。
区域由两个类定义:Index和Size类。
-
图像的起始点是由 Index 类定义的,这个类中存放了一个 n 维数列,数列中的元素都是整数,表示图像中各维上最初的像素值。
ImageType::IndexType start; start[0] = 0; start[1] = 0; start[2] = 0;
-
区域大小由Size类定义,由与图像相同维度的数组表示。数组的组成部分是无符号整数,表示图像沿每个维度的像素范围。
ImageType::SizeType size; size[0] = 200; size[1] = 200; size[2] = 200;
在定义了起始索引和图像大小之后,我们用他们来创建一个区域对象region,并且赋值。
ImageType::RegionType region;
region.SetSize(size);
region.SetIndex(start);
然后我们要利用SetRegions()来将定义好的区域传递给Image对象,来定义图像对象的原点和范围(SetRegions()方法是同时设置LargestPossibleRegion,BufferedRegion和RequestedRegion的)。
最后,到目前为止我们还没有为图像像素数据分配内存,所以我们要调用Allocate()来分配内存
image->SetRegions(region);
image->Allocate();
完整代码
#include "itkImage.h"
int main(int, char *[]) {
using ImageType = itk::Image<unsigned short, 3>;
ImageType::Pointer image = ImageType::New();
ImageType::IndexType start;
start[0] = 0;
start[1] = 0;
start[2] = 0;
ImageType::SizeType size;
size[0] = 200;
size[1] = 200;
size[2] = 200;
ImageType::RegionType region;
region.SetSize(size);
region.SetIndex(start); 、
image->SetRegions(region);
image->Allocate();
return EXIT_SUCCESS;
}
参考:https://itk.org/Doxygen/html/Examples_2DataRepresentation_2Image_2Image1_8cxx-example.html
https://blog.csdn.net/gxuan/article/details/7630100