VTK图像处理:从2D到3D,做你自己的浮雕头像

导读:VTK做图像处理也是非常强大的,有时候效果会让你很惊讶。主要内容:

1、读取图片

2、生成z方向高度,从2D到3D

3、生成一个新的点云

4、三角化

5、增加属性值灰度

先展示一下效果,鄙人的照片

1、读取图片

import numpy as npimport pyvista as pvimport mathspace = pv.read('mypicture.jpg')

读取图片就是一句话的事情。这个是一个vtk的网格。

这是我的一个证件照片,读取出来之后是这样的。当然,可以使用其他颜色。

如上图中,只要设置,rgb=True。就可以显示出这个效果。

2、确定z方向高度,从2D到3D

我们直接定义z方向就是灰度。

rgb=space.point_arrays['JPEGImage']size = len(rgb)z = np.zeros((size,))for i in range(size):    R=rgb[i,0]    G=rgb[i,1]    B =rgb[i,2]    Gray=R*0.3+G*0.59+B*0.11    rgb[i,0]=Gray    rgb[i, 1] = Gray    rgb[i, 2] = Gray    z[i]=Gray

也就是说,根据灰度值来确定高度。

3、生成一个新的点云

vertices = space.pointsfor i in range(len(vertices)): vertices[i,2]= math.exp(2-z[i]/255)+10*((vertices[i,0]-155)**2+(vertices[i,1]-103)**2)/255**2mesh = pv.PolyData(vertices)

我们需要生成一个新的点云,mesh。

z方向的值,我在这里使用了两部分。一部分是为了节颜色,使用指数来确定。

math.exp(2-z[i]/255)

另外增加了一点照片的弧度,也就是将照片放在一个抛物面上。

10*((vertices[i,0]-155)**2+(vertices[i,1]-103)**2)/255**2

这样点的坐标就完成了,并且生成了点云。

4、三角化

通过点云生成三角化网格,直接使用vtk内置的函数就可以。

surf = mesh.delaunay_2d()

5、增加属性值,灰度

surf.point_arrays['gray'] = z

6、可视化

p = pv.Plotter()  # 建一个视窗#p.background_color = (1,1,1) # 设置背景颜色#p.add_mesh(surf,show_edges=False)p.add_mesh(surf, scalars='gray')# p.add_mesh(mesh,rgb=True)p.show()

这样就可以做成我们开始所展示的效果了。

我们也可以使用火焰的颜色来显示,真的很帅。

再看一下细节:

7、完整代码

import numpy as npimport pyvista as pvimport mathspace = pv.read('mypicture.jpg')rgb=space.point_arrays['JPEGImage']size = len(rgb)z = np.zeros((size,))for i in range(size): R=rgb[i,0] G=rgb[i,1] B =rgb[i,2] Gray=R*0.3+G*0.59+B*0.11 rgb[i,0]=Gray rgb[i, 1] = Gray rgb[i, 2] = Gray z[i]=Grayvertices = space.pointsfor i in range(len(vertices)): vertices[i,2]= math.exp(2-z[i]/255)+10*((vertices[i,0]-155)**2+(vertices[i,1]-103)**2)/255**2mesh = pv.PolyData(vertices)surf = mesh.delaunay_2d()surf.point_arrays['gray'] = zp = pv.Plotter() # 建一个视窗#p.background_color = (1,1,1) # 设置背景颜色#p.add_mesh(surf,show_edges=False)p.add_mesh(surf, scalars='gray', cmap='hot', lighting=True, stitle='Rainbow',show_edges=True)# p.add_mesh(mesh,rgb=True)p.show()

8、结束

其实工具最终同时对一个矩阵,向量等进行颜色的赋值的操作。核心的,还是对算法,对数学的理解。

我是张麟博士,你喜欢的话,记得关注我,也别忘了点赞。

有什么问题也可以私信。祝好。

(0)

相关推荐