1.VTK图像数据结构
数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本信息,主要包括原点位置(Origin)、像素间隔(Space)和维数(Dimension)。通过这三个参数即可以确定图像空间位置和大小。图像可以看作空间中的一个规则的网格,网格中的每个最小单元称为像素(二维)或体素(三维),网格在每个方向上的像素或体素个数即为图像在该方向的维数。像素索引表示每个像素在图像网格中的位置,是图像内部的网格坐标(x,y,z)。对于普通的一张图像而言,z方向维数为1。
图像数据即为图像像素的像素值,一般采用一维数组来表示和存储。VTK中图像数据结构由类vtkImageData来表示。这种数据类型是结构化的,这意味着只要用很少的参数(原点位置、像素间隔和维数)就能准确定义每个数据点的位置。
virtual void *GetScalarPointer(int coordinates[3]);// 根据给定的像素索引得到指定的像素值,注意:此处返回的是第(x,y,z)个像素值的地址
virtual void *GetScalarPointer(int x, int y, int z);//根据给定的像素索引得到指定的像素值,注意:此处返回的是第(x,y,z)个像素值的地址
virtual void *GetScalarPointer();//返回图像数据数组的头指针,然后根据头指针可以一次访问并设置索引像素,图像数据数组采用一维数组
vtkSmartPointer<vtkBMPReader> reader =
vtkSmartPointer<vtkBMPReader>::New();
reader->SetFileName(argv[1]);
reader->Update();
int dims[3];
reader->GetOutput()->GetDimensions(dims);
double origin[3];
reader->GetOutput()->GetOrigin(origin);
//reader->GetOutput()->SetOrigin(10,0,0);
double space[3];
reader->GetOutput()->SetSpacing(20, 20, 1);
reader->GetOutput()->GetSpacing(space);
std::cout << dims[0] << " " << dims[1] << " " << dims[2] << endl;
std::cout << origin[0] << " " << origin[1] << " " << origin[2] << endl;
std::cout << space[0] << " " << space[1] << " " << space[2] << endl;
int nbOfComp;
nbOfComp = reader->GetOutput()->GetNumberOfScalarComponents();//获取像素的元组组分数,确定是灰度图、梯度图还是RGB图
for(int k=0; k<dims[2]; k++)
{
for(int j=0; j<dims[1]; j++)
{
for(int i=0; i<dims[0]; i++)
{
if(i<100 && j<100)
{
unsigned char * pixel =
(unsigned char *) ( reader->GetOutput()->GetScalarPointer(i, j, k) );
*pixel = i;
*(pixel+1) = j;
*(pixel+2) = 0;
}
}
}
}