VTK之图像处理

在VTK中,图像数据被作为一种特别的数据类型来处理,由vtkImageData表示,这种数据类型是结构化的,这意味着每个数据点的位置可隐含由图像数据的原点(第一张图像左下角在世界坐标系中的位置)、数据点间距(沿坐标方向相邻两个数据点的距离,或体素的长宽高)和维数(沿坐标方向体素或数据点的数目)确定。
 
VTK为图像数据提供了很多处理类,这里给出运行成功的代码示例(pReader读取图像文件):
 
(1)计算梯度:
 
 vtkImageGradient* pGradient = vtkImageGradient::New();
 pGradient->SetInput((vtkDataObject*)pReader->GetOutput());
 pGradient->SetDimensionality(3);
 
 vtkImageViewer* pViewer = vtkImageViewer::New();
 pViewer->SetInput(pGradient->GetOutput());
 pViewer->SetColorLevel(127.5);
 pViewer->SetColorWindow(256);
 pViewer->GetActor2D()->SetPosition(0,0);
 
 vtkRenderWindow* pRenWnd = vtkRenderWindow::New();
 pRenWnd->AddRenderer(pViewer->GetRenderer());
 pRenWnd->SetSize(512, 512);
 
 vtkRenderWindowInteractor* pRenWndInact = vtkRenderWindowInteractor::New();
 pRenWndInact->SetRenderWindow(pRenWnd);
 pRenWndInact->Initialize();
 pRenWndInact->Start();
 
(2)高斯平滑:
 
 vtkImageGaussianSmooth* pGaussian = vtkImageGaussianSmooth::New();
 pGaussian->SetInput((vtkDataObject*)pReader->GetOutput());
 pGaussian->SetDimensionality(2);
 pGaussian->SetStandardDeviations(1, 1);
 
 vtkImageViewer* pViewer = vtkImageViewer::New();
 pViewer->SetInput(pGaussian->GetOutput());
 pViewer->SetColorLevel(127.5);
 pViewer->SetColorWindow(256);
 pViewer->GetActor2D()->SetPosition(0,0);
 
 vtkRenderWindow* pRenWnd = vtkRenderWindow::New();
 pRenWnd->AddRenderer(pViewer->GetRenderer());
 pRenWnd->SetSize(512, 512);
 
 vtkRenderWindowInteractor* pRenWndInact = vtkRenderWindowInteractor::New();
 pRenWndInact->SetRenderWindow(pRenWnd);
 pRenWndInact->Initialize();
 pRenWndInact->Start();
 
(3)直方图:
 
 double range[2];
 vtkImageData* pImg = (vtkImageData*)pReader->GetOutput();
 pImg->Update();
 pImg->GetScalarRange(range);
 
 vtkImageAccumulate* pHistgram = vtkImageAccumulate::New();
 pHistgram->SetInput((vtkDataObject*)pReader->GetOutput());
 pHistgram->SetComponentExtent(0, static_cast<int>(range[1] - range[0]), 0, 0, 0, 0);
 pHistgram->SetComponentOrigin(range[0], 0, 0);
 pHistgram->UpdateWholeExtent();
 
 vtkXYPlotActor* plot = vtkXYPlotActor::New();
 plot->ExchangeAxesOff();
 plot->SetLabelFormat("%g");
 plot->SetXRange(range[0], range[1]);
 plot->SetYRange(0, 4096);
 plot->SetXTitle("Gray Level");
 plot->SetYTitle("");
 plot->AddInput(pHistgram->GetOutput());
 plot->SetXValuesToValue();
 
 vtkRenderer* pRender = vtkRenderer::New();
 pRender->AddActor(plot);
 
 vtkRenderWindow* pRenWnd = vtkRenderWindow::New();
 pRenWnd->AddRenderer(pRender);
 pRenWnd->SetSize(512, 512);
 
 vtkRenderWindowInteractor* pRenWndInact = vtkRenderWindowInteractor::New();
 pRenWndInact->SetRenderWindow(pRenWnd);
 pRenWndInact->Initialize();
 pRenWndInact->Start();
(4)布尔逻辑计算:
 vtkImageEllipsoidSource* psrc1 = vtkImageEllipsoidSource::New();
 vtkImageEllipsoidSource* psrc2 = vtkImageEllipsoidSource::New();
 psrc1->SetCenter(100, 100, 0);
 psrc2->SetCenter(170, 100, 0);
 psrc1->SetRadius(70, 70, 70);
 psrc2->SetRadius(70, 70, 70);
 
 vtkImageLogic* pxor = vtkImageLogic::New();
 pxor->SetInput1((vtkDataObject *)psrc1->GetOutput());
 pxor->SetInput2((vtkDataObject *)psrc2->GetOutput());
 pxor->SetOperationToXor();
 pxor->SetOutputTrueValue(150);
 vtkImageViewer* pViewer = vtkImageViewer::New();
 pViewer->SetInput(pxor->GetOutput());
 pViewer->SetColorWindow(255);
 pViewer->SetColorLevel(127.5);
 vtkRenderWindow* pRenWnd = vtkRenderWindow::New();
 pRenWnd->AddRenderer(pViewer->GetRenderer());
 pRenWnd->SetSize(270, 200);
 vtkRenderWindowInteractor* pRenWndInact = vtkRenderWindowInteractor::New();
 pRenWndInact->SetRenderWindow(pRenWnd);
 pRenWndInact->Initialize();
 pRenWndInact->Start();

 

trackback:http://blog.csdn.net/bingo_gmwu/article/details/4747038 
 

posted @ 2012-07-29 21:26  大有|元亨  阅读(2004)  评论(0编辑  收藏  举报