VTK学习笔记(七)vtkImageData基本操作
1、vtkImageData基本操作
- 图像数据在VTK 中是用vtkImageData 类表示的,对于不同的图像文件类型,VTK 提供相对应的类对图像文件进行读写操作。比如,前面章节中所提的vtkBMPReader 是用于读取BMP 图像,vtkJPEGReader 用于读取JPG 图像。VTK 除了支持BMP、JPG 图像格式之外,还支持其他多种图像格式的读写。
- 图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息,访问和修改图像像素值,图像显示,图像类型转换等等。熟练掌握这些基本操作有助于使用VTK进行图像处理的快速开发。
1.1、图像信息访问和修改
vtkImageData中提供了多个函数用于访问或者获取图像的基本信息,这些函数通常使用Set或者Get加上相应的信息名的形式,例如获取图像维数的方法定义为GetDimensions()。当然这里主要从类的层次上进行VTK的学习,这里不再具体赘述每个函数的基本名称和使用,用户可以查阅相应的类文档。下面通过一个例子来说明怎样访问图像的基本信息。
vtkSmartPointerreader = vtkSmartPointer::New();
reader->SetFileName ( “..\lena.bmp”);
reader->Update();
int dims[3];
reader->GetOutput()->GetDimensions(dims);
std::cout<<”图像维数:”<
1.2、图像赋值
#include <vtkImageData.h>
#include <vtkImageIterator.h>
#include <vtkNew.h>
int main(int, char*[])
{
// Create an image data
vtkNew<vtkImageData> imageData;
// Specify the size of the image data
imageData->SetDimensions(10, 20, 30);
imageData->AllocateScalars(VTK_DOUBLE, 3);
// Fill every entry of the image data with x,y,z
int* dims = imageData->GetDimensions();
double* ptr = static_cast<double*>(imageData->GetScalarPointer(0, 0, 0));
for (int z = 0; z < dims[2]; z++)
{
for (int y = 0; y < dims[1]; y++)
{
for (int x = 0; x < dims[0]; x++)
{
*ptr++ = z;
*ptr++ = y;
*ptr++ = x;
}
}
}
// Define the extent to be extracted
int extent[6];
extent[0] = 2;
extent[1] = 5;
extent[2] = 2;
extent[3] = 5;
extent[4] = 15;
extent[5] = 15;
// Retrieve the entries from the image data and print them to the screen
vtkImageIterator<double> it(imageData, extent);
while (!it.IsAtEnd())
{
double* valIt = it.BeginSpan();
double* valEnd = it.EndSpan();
while (valIt != valEnd)
{
// Increment for each component
double x = *valIt++;
double y = *valIt++;
double z = *valIt++;
std::cout << "(" << x << "," << y << "," << z << ") ";
}
std::cout << std::endl;
it.NextSpan();
}
return EXIT_SUCCESS;
}