1、读取图片 import numpy as npimport pyvista as pvimport mathspace = pv.read('mypicture.jpg') 读取图片就是一句话的事情。这个是一个vtk的网格。 这是我的一个证件照片,读取出来之后是这样的。当然,可以使用其他颜色。 如上图中,只要设置,rgb=True。就可以显示出这个效果。 2、确定z方向高度,从2D到3D 我们直接定义z方向就是灰度。
也就是说,根据灰度值来确定高度。 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方向的值,我在这里使用了两部分。一部分是为了节颜色,使用指数来确定。
另外增加了一点照片的弧度,也就是将照片放在一个抛物面上。 10*((vertices[i,0]-155)**2+(vertices[i,1]-103)**2)/255**2 这样点的坐标就完成了,并且生成了点云。 4、三角化 通过点云生成三角化网格,直接使用vtk内置的函数就可以。
5、增加属性值,灰度 surf.point_arrays['gray'] = z 6、可视化
这样就可以做成我们开始所展示的效果了。 我们也可以使用火焰的颜色来显示,真的很帅。 再看一下细节: 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、结束 其实工具最终同时对一个矩阵,向量等进行颜色的赋值的操作。核心的,还是对算法,对数学的理解。 我是张麟博士,你喜欢的话,记得关注我,也别忘了点赞。 有什么问题也可以私信。祝好。 |
|
来自: taotao_2016 > 《图像处理》