導讀:VTK是一個功能非常強大的資料視覺化工具,全球在工業軟體,醫學影像等方面有30%以上的市場覆蓋率。
本文講解第一個最為簡單的功能點雲。內容分為三個部分。
1、建立點雲
2、生成正弦隨機序列
3、為點雲建立箭頭
4、為背景增加圖片
5、為點雲建立背景網格
最後的效果,如下圖
1、建立點雲
使用Pyvista建立點雲,非常簡單,只要生成一列點的座標,即可生成點雲。
所謂點雲,就是由很多點組成的一個集合
程式碼如下
import numpy as npimport pyvista as pvnodes = np.random.rand(100, 3)mesh = pv.PolyData(nodes)p = pv.Plotter() # 建一個視窗p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.show()
生成一個隨機的點雲,只需要2行也就是第3行和第四行。
第3行,生成座標矩陣
第4行,生成網格。
第5行開始,是視窗的設定,首先新建一個視窗
第6行,將網格載入到視窗內,並設定點的大小,和顏色,這裡是用球來顯示的。
第7行,show
這個效果已經出來了,但是看起來不是很舒服。我們可以改一下背景顏色。比如改成白色
import numpy as npimport pyvista as pvnodes = np.random.rand(100, 3)mesh = pv.PolyData(nodes)p = pv.Plotter() # 建一個視窗p.background_color = (1,1,1) # 設定背景顏色p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.show()
上面的第6行,將背景顏色修改為白色。
這樣一個點雲,從建立到顯示就已經完成了。
2、生成正弦隨機序列
隨機的0-1之間的點雲,可能不是我們所想的,我們希望這個隨機是基於一個基本的背景的隨機,比如一個正弦函式。
於是,我們還需要對隨機序列進行一個修改。大家看一下程式碼大概就像知道我要做什麼了。我們將這個隨機變成一個正弦函式的擾動。
import mathnodes = np.random.rand(100, 3)for i in range(100): nodes[i,0] += i*0.5 nodes[i, 1] += 0.2*math.sin(i*np.pi / 10) * 10mesh = pv.PolyData(nodes)
點座標的部分,我們修改為上面的幾行。其實只是增加了一個正弦函式,在x,y方向上的值的疊加。如圖
這樣的隨機也許是我們經常會遇到的。實際上這個背景,我們可以根據我們的需要去調整。例如我們就是有一個很好的資料背景,我就想看看增加了隨機之後的效果,我們仍然可以按這個方式來操作。
3、為點雲建立箭頭視覺化
我們當然也希望在這個點雲上有一些其他的視覺化的操作,比如對資料的操作等。如果為每一個點給一個方向,這其實就是這個點雲上的向量場了。
import numpy as npimport pyvista as pvimport mathnodes = np.random.rand(100, 3)for i in range(100): nodes[i,0] += i*0.5 nodes[i, 1] += 0.2*math.sin(i*np.pi / 10) * 10mesh = pv.PolyData(nodes)direction = np.zeros((100,3))for i in range(100): mag = abs(nodes[i,0])+abs(nodes[i,1]) mag = 1*max(mag,1e-20) direction[i,0]=(0-nodes[i,0])/mag direction[i, 1] = (0 - nodes[i, 1])/mag direction[i, 2] = 0p = pv.Plotter() # 建一個視窗p.background_color = (1,1,1) # 設定背景顏色p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.add_arrows(nodes,direction,color = 'blue')p.show()
9-15行,增加了一個direction的向量場,也就是給每一個點賦予了方向。
19行,將箭頭加入到視窗
4、為背景增加圖片
這個背景過於單調,我們也可以將背景設定成圖片,只需要直接設定背景圖片就可以了。
p.add_background_image('./space.jpg')
這裡找了一個太空圖,你也可以自己選擇一個喜歡的圖形。
5、為點雲建立背景網格
總覺得這樣效果還不是很好,我能不能為點雲建立一個背景面呢?
當然可以。
我們只需要增加一個平面作為背景就可以。
import numpy as npimport pyvista as pvimport mathnodes = np.random.rand(100, 3)for i in range(100): nodes[i,0] += i*0.5 nodes[i, 1] += 0.2*math.sin(i*np.pi / 10) * 10floor = pv.Plane(center=[25, 0, -1], direction=[0, 0, 1], i_size=60, j_size=20, i_resolution=30, j_resolution=10)direction = np.zeros((100,3))for i in range(100): mag = abs(nodes[i,0])+abs(nodes[i,1]) mag = 1*max(mag,1e-20) direction[i,0]=(0-nodes[i,0])/mag direction[i, 1] = (0 - nodes[i, 1])/mag direction[i, 2] = 0mesh = pv.PolyData(nodes)p = pv.Plotter() # 建一個視窗# p.camera_position = [(6,3,7),# (0,0,2),# (-0.2,1,-0.2)]# p.background_color = (1,1,1) # 設定背景顏色p.add_background_image('./space.jpg')p.add_axes()p.add_mesh(floor,color='gray',edge_color="green",show_edges=True)p.add_arrows(nodes,direction,color = 'blue')p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.show()
第9行建立了一個plane的網格。
第27行,將這個網格加入到視窗,並且設定顏色,邊的顏色,設定邊可見。
注意:
第26行,我們將座標軸也加進去了。
這樣就得到了我們開始給大家演示的效果。
這裡,我們對背景網格,做了一個透明度設定。
p.add_mesh(floor,color='gray',edge_color="green",show_edges=True,opacity=0.5)
也就是這個opacity的引數。0是完全不可見,1是完全可見。
6、結束
點雲,是視覺化裡最為簡單的操作了。但是加上其他的效果之後,也許就不是那麼簡單了。
只要稍微修改一下正弦的背景值,效果會非常好看。