医站点医维基

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2484|回复: 0

Paraview图像处理-ParaviewWeb获取渲染图像过程

[复制链接]

336

主题

411

回帖

2808

积分

管理员

积分
2808

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2017-4-8 01:10:35 | 显示全部楼层 |阅读模式
  借助于VTK,Paraview提供了强大的图像处理功能。在VTK中,使用vtkImageData来表示图像的数据结构,它保存了图像的像素、维度、像素间隔等信息,不仅可以表示像素,还可以表示体素。另外,它还可以表示几何体以及拓扑关系(vtkImageData represents a geometric structure that is a topological and geometrical regular array of points)。
  vtkImageData继承自vtkDataSet类,该类型的数据是按规则排列在矩形方格中的点和单元的集合,如果数据集的点和单元排列在平面上,称此数据集为像素映射、位图或者图像,如果排列在三维上,则称为体。vtkImageData由一维的线、二维的像素或三维的体素组成,其几何结构以及拓扑结构都是规则的。

  vtkImageData中的像素数据采用连续的数组保存,可参看vtkDataArray,对于RGB颜色数据,每个数组是由多个分量组成的,因此采用元组(tuple),来表示数据数组的子数组。因此可以使用SetNumberOfComponents(num)来设置元组的组分个数,SetNumberOfTuples(num)设置元组的个数,SetComponent(i,j,k)即设置第i元组中第j个组分的值为k。

  

  在vtk中RGB值采用如下图的方式来保存
  

  vtk中图像像素值的访问方法有两种。
  第一种:直接访问vtkImageData的数据数组。vtkImageData提供了GetScalarPointer()函数获取数据数组指针;
  第二种:通过vtkImageData类实现迭代器。
  

  在ParaviewWeb中,客户端通过远程过程调用stillRender方法,在python中调用Paraview在C++中根据VTK编写的函数StillRenderToString,来获取渲染结果,此时渲染结果经过JPEG压缩以及base64编码之后,返回到python文件的stillRender方法中,通过远程调用返回给客户端,在客户端javascript解码之后,将图像显示在客户端的视口区域。
  接下来介绍VTK中StillRenderToString怎么获取base64编码结果。
  StillRenderToString在ParaviewWeb的vtkPVWebApplication.h文件中,而该文件是根据vtkWebApplication.h来编写的。vtkWebApplication定义了ParaviewWeb的应用程序接口,获得图片,base64编码;获得WebGL数据,场景数据都封装在这里。StillRender,InteractiveRender,StillRenderToString三个方法用于渲染场景并且获取渲染图片。StillRender中判断是否需要重新渲染图片还是从缓冲区中读取图片,并创建vtkImageData对象image来获取图片,此时会调用GetRenderWindow()方法,获取渲染视口,然后调用vtkWindowToImageFilter,获取绘制图像信息,此时将图像信息保存在capture中,返回到image中。vtkWindowToImageFilter夺取绘制窗口缓冲器,并转换到vtkImageData。

  获取图像信息之后,此时只是像素信息,需要对其编码,所以调用Encoder。在vtkDataEncoder.cxx中,调用vtkJPEGWriter对图像像素进行压缩,并写入writer中,writer是一个vtkJPEGWriter模板类的对象,然后便可以通过writer->GetResult()来获取JPEG编码之后的数据,交给data,data是vtkUnsignedCharArray类型。然后通过vtkBase64Utilities对data进行base64编码。(this->Internals->Encoder->PushAndTakeReference(view->GetGlobalID(),image, quality);位于vtkPVWebApplication.cxx)。此后,将数据逐层返回,通过StillRenderToString返回给python中的reply。
  

  另外,python与C++之间相互传递,使用vtkPVWebApplicationPython.cxx,封装vtkPVWebApplication,编译之后可以在python中调用vtkPVWebApplication的方法。

来源:CSDN {occurl}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于我们|医维基|网站地图|Archiver|手机版|医疗之家 ( 沪ICP备2023001278号-1 )  

GMT+8, 2024-5-4 09:07 , Processed in 0.155803 second(s), 27 queries .

Designed by Medical BBS

快速回复 返回顶部 返回列表