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)