Paraview圖像處理-ParaviewWeb獲取渲染圖像過程

藉助於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的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章