对于TIFF图像的读取时候,TIFF reader所读取和存储的是点格式,即point data in the "Tiff Scalars" array name; 对于体素需要转化为cell data。对于volume image的可视化 in a sort of parametric dimensions (namely pixel width, pixel height, number of tiff images).。使用 transform filters to scale to physical dimensions.
以下是使用VTK进行可视化的一个例子:
#include <vtkSmartPointer.h> #include <vtkImageViewer2.h> #include <vtkTIFFReader.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include<vtkImageStack.h> #include<vtkImageReader.h> #include<vtkImageMapper3D.h> #include<vtkImageData.h> #include<vtkVolumeProperty.h> #include<vtkStructuredPointsReader.h> #include<vtkPiecewiseFunction.h> #include<vtkColorTransferFunction.h> #include<vtkVolumeRayCastCompositeFunction.h> #include<vtkVolumeRayCastMapper.h> int main() { vtkTIFFReader *reader =vtkTIFFReader::New(); vtkImageData *image =vtkImageData::New(); reader->SetFilePrefix ("E:\\VTK_examples\\testdata\\" ); reader->SetDataExtent(0,2062,0,1490,0,13); reader->SetFilePattern("%s%01d.tif"); reader->Update(); //image=reader->GetOutput(); /* int dims[3]; reader->GetOutput()->GetDimensions(dims); std::cout<<"图像维数:"<<dims[0]<<" "<<dims[1]<<" "<<dims[2]<<std::endl; double origin[3]; reader->GetOutput()->GetOrigin(origin);*/ //std::cout<<"图像原点:"<<origin[0]<<" "<<origin[1]<<" "<<origin[2]<<std::endl; //double spaceing[3]; //reader->GetOutput()->GetSpacing(spaceing); //std::cout<<"像素间隔:"<<spaceing[0]<<" "<<spaceing[1]<<" "<<spaceing[2]<<std::endl; //int* dim_s = image->GetDimensions(); // // int dims[3]; // can't do this // // std::cout << "维数: " << " x: " << dim_s[0] << " y: " << dim_s[1] << " z: " << dim_s[2] << std::endl; // std::cout << "Number of points: " << image->GetNumberOfPoints() << std::endl;//所有像素点的个数 // std::cout << "Number of cells: " << image->GetNumberOfCells() << std::endl;//Standard vtkDataSet API methods. //image->CopyStructure(reader->GetOutput()); //stack->AddImage(reader) /* reader->Update(); image->Update();*/ //3D的显示 // 创建标准的渲染器与映射器。 vtkRenderer *ren1=vtkRenderer::New(); vtkRenderWindow *renWin=vtkRenderWindow::New(); renWin->AddRenderer(ren1); vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin); // 创建标量到不透明度的转移函数。 vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New(); opacityTransferFunction->AddPoint( 0.0, 0.0); opacityTransferFunction->AddPoint(255, 1.8); // 创建标量的颜色的转移函数。 vtkColorTransferFunction *colorTransferFunction=vtkColorTransferFunction::New(); /* colorTransferFunction->AddRGBPoint( 0.0, 0.0, 0.0, 0.0); colorTransferFunction->AddRGBPoint( 128.0, 1.0, 0.0, 0.0);*/ colorTransferFunction->AddRGBPoint(128.0, 0.0, 0.0, 1.0); colorTransferFunction->AddRGBPoint(192.0, 0.0, 1.0, 0.0); colorTransferFunction->AddRGBPoint(255.0, 0.0, 0.2, 0.0); // 设置属性,其中包括两个映射函数。 vtkVolumeProperty *volumeProperty=vtkVolumeProperty::New(); volumeProperty->SetColor(colorTransferFunction); volumeProperty->SetScalarOpacity(opacityTransferFunction); volumeProperty->ShadeOn(); volumeProperty->SetInterpolationTypeToLinear(); // 光线投射映射器知道如何渲染数据。 vtkVolumeRayCastCompositeFunction *compositeFunction= vtkVolumeRayCastCompositeFunction::New(); vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New(); volumeMapper->SetVolumeRayCastFunction(compositeFunction); volumeMapper->SetInputConnection(reader->GetOutputPort()); // vtkVolume掌管映射器和属性对象,可控制体数据的位置和朝向 vtkVolume *volume=vtkVolume::New(); volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty); ren1->AddVolume(volume); ren1->SetBackground(1, 1, 1); renWin->SetSize(600, 600); renWin->Render(); iren->Initialize(); iren->Start(); return 0; }