1、vtkImageActor
1)概述
一个三维图像渲染 Actor,通过纹理映射将图像映射到一个多边形上进行显示。使用 vtkImageActor 较 vtklmageViewer2要复杂一些,需要建立完整的渲染管线:包括 vtklmageActor、vtkRender、vtkRenderWindow 和 vtkRenderWindowInteractor。另外,作为二维图像浏览器,不需要在三维空间中进行旋转操作,因此还需要为vtkRenderWindowInteractor定义一个 vtkInteractorStylelmage 对象。
2)使用
private void TestImageActor(){vtkBMPReader reader = vtkBMPReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\bin\\Debug\\data\\lena.bmp");reader.Update();vtkImageActor actor = vtkImageActor.New();actor.SetInputData(reader.GetOutput());vtkRenderer renderer = vtkRenderer.New();renderer.AddActor(actor);renderer.SetBackground(0.4, 0.5, 0.6);vtkRenderWindow renderWindow = renderWindowControl.RenderWindow;renderWindow.AddRenderer(renderer);renderWindow.Render();}
2、图像融合
1)概述
在实际应用中经常需要在窗口中同时显示多幅图像,这就会用到图像融合技术。图像融合是利用图像的不透明度来合成图像。在 VTK 中,用类vtkImageBlend 实现图像的融合,
2)vtkImageBlend
vtkImageBlend 可以接收多个图像输入,其输出为融合图像。输出图像的像素间隔、原点、范围以及像素组分个数与第一个图像一致。该类提供了两种融合式。
第一种是标准模式,也是默认的融合方式。
第二种是混合模式(Compound)。该模式下输出结果利用不透明度的和做归一化。当像素的不透明度 alpha*opacity 小于或等于阈值 threshold 时,该像素会被忽略。
private void TestImageBlend(){vtkJPEGReader reader = vtkJPEGReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\bin\\Debug\\data\\lena-gray.jpg");reader.Update();vtkImageCanvasSource2D imageSource = vtkImageCanvasSource2D.New();imageSource.SetNumberOfScalarComponents(1);imageSource.SetScalarTypeToUnsignedChar();imageSource.SetExtent(0, 600, 0, 600, 0, 0);imageSource.SetDrawColor(0.0);imageSource.FillBox(0, 600, 0, 600);imageSource.SetDrawColor(255.0);imageSource.FillBox(0, 600, 0, 600);imageSource.Update();vtkImageBlend imageBlend = vtkImageBlend.New();imageBlend.AddInputData( reader.GetOutput());imageBlend.AddInputData(imageSource.GetOutput());imageBlend.SetOpacity(0, 0.4); //设置对应图像的不透明度imageBlend.SetOpacity(1, 0.6);imageBlend.Update();vtkImageActor originalActor = vtkImageActor.New();originalActor.SetInputData(reader.GetOutput());vtkImageActor imageActor2 = vtkImageActor.New();imageActor2.SetInputData(imageSource.GetOutput());vtkImageActor imageActor3 = vtkImageActor.New();imageActor3.SetInputData(imageBlend.GetOutput());vtkRenderer renderer1 = vtkRenderer.New();renderer1.AddActor(originalActor);renderer1.SetBackground(0.4, 0.5, 0.6);renderer1.SetViewport(0.0, 0.0, 0.33, 1.0);vtkRenderer renderer2 = vtkRenderer.New();renderer2.AddActor(imageActor2);renderer2.SetBackground(0.4, 0.5, 0.6);renderer2.SetViewport(0.33, 0.0, 0.66, 1.0);vtkRenderer renderer3 = vtkRenderer.New();renderer3.AddActor(imageActor3);renderer3.SetBackground(0.4, 0.5, 0.6);renderer3.SetViewport(0.66, 0.0, 1.0, 1.0);vtkRenderWindow renderWindow = renderWindowControl.RenderWindow;renderWindow.AddRenderer(renderer1);renderWindow.AddRenderer(renderer2);renderWindow.AddRenderer(renderer3);renderWindow.Render();}