5.4 vtkImageData基本操作
图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息,访问和修改图像像素值,图像显示,图像类型转换等等。熟练掌握这些基本操作有助于使用VTK进行图像处理的快速开发。
5.4.1图像信息访问和修改
vtkImageData中提供了多个函数用于访问或者获取图像的基本信息,这些函数通常使用Set或者Get加上相应的信息名的形式,例如获取图像维数的方法定义为GetDimensions()。当然这里主要从类的层次上进行VTK的学习,这里不再具体赘述每个函数的基本名称和使用,用户可以查阅相应的类文档。下面通过一个例子来说明怎样访问图像的基本信息。程序运行如图5.8所示。
1: vtkSmartPointer<vtkBMPReader>reader =
2: vtkSmartPointer<vtkBMPReader>::New();
3: reader->SetFileName ( "..\\lena.bmp");
4: reader->Update();
5:
6: int dims[3];
7: reader->GetOutput()->GetDimensions(dims);
8: std::cout<<"图像维数:"<<dims[0]<<" "<<dims[1]<<""<<dims[2]<<std::endl;
9:
10: double origin[3];
11: reader->GetOutput()->GetOrigin(origin);
12: std::cout<<"图像原点:"<<origin[0]<<" "<<origin[1]<<""<<origin[2]<<std::endl;
13:
14: double spaceing[3];
15: reader->GetOutput()->GetSpacing(spaceing);
16: std::cout<<"像素间隔:"<<spaceing[0]<<" "<<spaceing[1]<<""<<spaceing[2]<<std::endl;
17:
18:
19: vtkSmartPointer<vtkImageViewer2>imageViewer =
20: vtkSmartPointer<vtkImageViewer2>::New();
21: imageViewer->SetInputConnection(reader->GetOutputPort());
22: vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor=
23: vtkSmartPointer<vtkRenderWindowInteractor>::New();
24: imageViewer->SetupInteractor(renderWindowInteractor);
25: imageViewer->Render();
26: imageViewer->GetRenderer()->ResetCamera();
27: imageViewer->Render();
28:
29: renderWindowInteractor->Start();
图5.8 VTK图像基本信息获取
上例中主要获取了图像的三个信息,图像维数,图像原点和像素间隔。VTK中二维和三维图像都用vtkImageData表示,因此第六行中定义图像维数为dims[3],然后利用GetDimensions()函数获取图像的维数;图像的原点和像素间隔都是物理空间数值,因此都是定义double类型。本例读入了二维lena图像,上图中显示了获取的图像信息。其中,图像维数为512*512*1,通过维数可以看成z方向的维数为1,说明该图像为二维图像;而图像的原点为(0,0,0)点,而像素间隔为(1,1,1)。
vtkChangeImageInformation
vtkImageData中提供了多个Set函数用于设置图像的基本信息。当对一个管线的输出修改图像信息后,如果管线重新Update,那么这些修改都会恢复回原来的值。而vtkChangeImageInformation可以作为管线中的一个filter来修改图像信息。利用这个filter可以修改图像的原点,像素间隔,以及范围起点(extent),另外还