首页 >> 中医针灸

Python三维基本概念处理基础

发布时间:2025年10月24日 12:18

sh = o3d.geometry.TriangleMesh.create_sphere(radius=1.0, resolution=40) mesh.compute_vertex_normals o3d.visualization.draw_geometries([mesh]) # pyvista所画圆柱微并可视既有 # 先前心坐标 center=(0.0, 0.0, 0.0) 取向 direction=(1.0, 0.0, 0.0) # 运动速度 radius=0.2 高度 height=2.0 分辨率 resolution=50 import pyvista as pv mesh = pv.Cylinder(center=(0.0, 0.0, 0.0), direction=(1.0, 0.0, 0.0), radius=0.2, height=2.0, resolution=50) mesh.plot # trimesh所画长方微并可视既有 # 微积 (4,4,1) import trimesh mesh = trimesh.creation.box(extents=(4, 4, 1)) mesh.show

相比较CAD软件包来说,Python也就是说可视既有仿真也就是说功能这不弱,更为最主要CAD软件包相似的自定概念图拉伸、摆动、扫掠等也就是说功能,而且也不如CAD软件包直观,对空间显然技能有一定拒绝,疲倦合复杂可视既有观察者仿真。当然如果你有足够耐心的话也可以试着一下用这些也就是说一一组去Pop生成一个复杂的仿真。(大佬都已经可以在我的世界里堆CPU、搭神经网络、要用测算机了,还有什么是要用不到的?)

(2)可视既有扩建

如果手上有一个微素类仿真,比如紧致提高效率SIMP演算法导出的伪电导率提高效率结果,或者医学相似的CT/MRI影像分割统计仅据,想扩建为mesh仿真(stl/obj/ply等音频),可以用以Marching Cubes演算法(MC演算法,通过提取等值侧进行时可视既有仿真的所画,极其精华的侧所画演算法,领域相当多。注释-Marching cubes: A high resolution 3D surface construction algorithm)

因为这段星期同一时间在参加医疗影像分析方法的项目,所以就以CT影像可视既有扩建为例陈述MC演算法的用以。用以的统计仅据源自Apache颅侧病变修补统计仅据集(注释-SkullBreak / SkullFix –Dataset for automatic cranial implant design and a benchmark for volumetric shape learning tasks),音频为nii,文件存储于存储纸制先前,可视既有扩建字符如下:

import nibabel as nib import numpy as np import skimage.measure import torch # 梯度 nii_data = "skull_complete.nii.gz" img = nib.load(nii_data) voxel = torch.tensor(np.array(img.dataobj,dtype=np.float32)).unsqueeze(0).unsqueeze(0) voxel = torch.nn.functional.interpolate(voxel, scale_factor=0.5, mode='trilinear', align_corners=True) voxel = np.array(voxel.squeeze(0).squeeze(0)) voxel = np.pad(voxel, ((5, 5), (5, 5), (5, 5)), 'constant') vertices_recon, faces_recon, _, _ = skimage.measure.marching_cubes(voxel, level=0) mesh = trimesh.Trimesh(vertices_recon, faces_recon, validate=True) mesh.show

其先前 nibabel为用以解决情况CT影像统计仅据的Python给定纸制,另外用以了Pytorch的interpolate对统计仅据集进行时存储(用Pytorch较为繁琐,也可以单独numpy腌),否则MC演算法不间断则会过长。Line11用以了pad是因为这一组统计仅据同一时间位于图像边缘,扩建出来则会不封闭,所以给边缘也填满一些倍仅。Line12用以了skimage发放的MC给定,网上查明的MC演算法 python实现也就是说都是调用skimage,所以我在此先前也是用的是skimage,也就是说上Pyvista也可以,不久的文章先前则会提及。

扩建结果如下,右边为CT统计仅据(可用以ITK-SNAP软件包检视),下方为扩建的mesh仿真。可以看不到仿真这不是十分光滑,后期可以用以光顺演算法对其进行时后解决情况。

除MC演算法大多,泊松扩建也是用以极其相当多也极其精华的可视既有扩建演算法(注释-Poisson Surface Reconstruction),但近似于于由点阳扩建mesh或由破损/不剩备仿真扩建封闭(watertight)仿真。

把再次一扩建的颅侧仿真拿来继续用,读取其先前的点阳,然后用以泊松扩建得到mesh仿真。字符如下:

importopen3d aso3d mesh = o3d.io.read_triangle_mesh( "skull.stl") pcd = o3d.geometry.PointCloud pcd.points = o3d.utility.Vector3dVector(mesh.vertices) pcd.normals = o3d.utility.Vector3dVector(mesh.vertex_normals) pcd.paint_uniform_color(( 0.74, 0.73, 0.68)) o3d.visualization.draw_geometries([pcd]) witho3d.utility.VerbosityContextManager( o3d.utility.VerbosityLevel.Debug) ascm: mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( pcd, depth= 6) mesh.compute_vertex_normals mesh.paint_uniform_color(( 0.74, 0.73, 0.68)) o3d.visualization.draw_geometries([mesh])

这里用以的是open3d的泊松扩建给定,其先前depth常量为扩建解决情况过程先前创建的八叉树深达,可以控制扩建精度,越好大越好精密,但附加的测算生产成本也越好高。扩建结果如下,右边为颅侧点阳仿真,下方为扩建的mesh。

除了上述传统习俗可视既有扩建演算法,基于深达研习的框架也已经越好来越好多,借助深达研习薄弱的最优技能以及可视既有信息猎杀技能,这类演算法可以解决情况有弱点侧积来得大的仿真,扩建出来得具真实感的观察者,熟悉的可以必需检索无关文献,以后有希望可以给大家微则会无关文献。

▌近似于可视既有给定纸制的仿真出版人也就是说功能

仿真出版人纸制含的范围极其广,用以场景也都不太一样,这边主要参阅一些相对近似于的也就是说功能。

(1)几何学变换

主要纸制括可视既有观察者的平移、摆动、贴图等,一般可视既有奎都不具这些也就是说功能,这里仅参阅Open3D的用法。

仍然以再次一的头骨仿真为例,Open3D的平移用以作法如下:

import open3d as o3d import copy mesh = o3d.io.read_triangle_mesh( "skull.stl") mesh.compute_vertex_normals mesh_tx = copy.deepcopy(mesh).translate((0, 200, 0)) mesh_tx.compute_vertex_normals o3d.visualization.draw_geometries([mesh, mesh_tx])

Open3D的摆动用以作法如下:

import open3d as o3d import numpy as np import copy mesh = o3d.io.read_triangle_mesh( "skull.stl") mesh.compute_vertex_normals mesh_r = copy.deepcopy(mesh) # 绕x轴摆动 pi / 4 R = mesh.get_rotation_matrix_from_xyz((np.pi / 4, 0, 0)) # 摆动先前心为 (0,0,0) mesh_r.rotate(R, center=(0,0,0)) mesh_r.compute_vertex_normals o3d.visualization.draw_geometries([mesh, mesh_r])

Open3D的贴图用以作法如下:

importopen3d aso3d importnumpy asnp importcopy mesh = o3d.io.read_triangle_mesh( "skull.stl") mesh.compute_vertex_normals mesh_s = copy.deepcopy(mesh).translate(( 0, -200, 0)) # 贴图系仅为 0.5 mesh_s.scale( 0.5, center=mesh_s.get_center) mesh_s.compute_vertex_normals o3d.visualization.draw_geometries([mesh, mesh_s])

(2)四角侧片一般既有、再次分

此处以Pyvista为例演示四角侧片再次分以及一般既有的也就是说功能,Open3D、Trimesh等其他给定奎也就是说也支持这些也就是说功能。给定字符如下:

import pyvista as pv mesh = pv.read( "skull_remesh.stl") mesh.plot(show_edges=True) # 再次分 1 次 mesh_s = mesh.subdivide(1, subfilter= "loop") mesh_s.plot(show_edges=True) # 一般既有 目标形状为剩备形状的 75% mesh_d = mesh.decimate(0.75) mesh_d.plot(show_edges=True)

(3)四角侧片再次一划定

那时候是想找一个给定奎演示一下remesh效果的,但我熟悉的几个给定奎似乎都不用remesh也就是说功能,这很不合理

也确实是我不用找,如果有的话欢迎转告,所以这边就拿MeshLab软件包演示一下好了。用以的是Isotropic Explicit Remesh演算法。如图所示, 可以让散乱的、质量较差的四角侧片再次一划定为接近正四角形的低生产成本六边形,这步在见下文测算的六边形划定前解决情况先前是近似于且最主要的步骤,一般则会先东南角六边形进行时remesh再次划定微六边形。

(4)塞克运算

塞克运算纸制括付、并和增,近似于于两个仿真的Pop仿真,此处以Pyvista为例陈述塞克运算用以作法。trimesh也可以要用塞克运算,但它只能额外配备blender或scad作为塞克运算的测算后端,来得厌烦,不是很要求用以这个。

假设有一个红色斜线和一个红色球型,塞克并、增、付的Pyvista实现如下:

import pyvista as pv mesh_1 = pv.Arrow.triangulate mesh_2 = pv.Sphere.triangulate pl = pv.Plotter pl.set_background('w') _ = pl.add_mesh(mesh_1,color = 'r',opacity = 0.5) _ = pl.add_mesh(mesh_2,color = 'g',opacity = 0.5) pl.show # 塞克并 union = mesh_1.boolean_union(mesh_2) union.plot(color = 'w',background='w',opacity = 0.5) # 塞克增 difference = mesh_1.boolean_difference(mesh_2) difference.plot(color = 'w',background='w') # 塞克付 intersection = mesh_1.boolean_intersection(mesh_2) intersection.plot(color = 'w',background='w')

效果如下:

只能注意的是,此处创始球型和斜线仿真用以的是Pyvista的移动设备给定,这个生成的这不是四角侧片仿真,而是常用的Polydata音频,确实是四角形、四边形等等。而Pyvista的塞克运算给定只支持四角既有的仿真,所以创始仿真后只能用.triangulate给定对其进行时四角既有。如果是缓冲读取的stl/obj/ply等仿真或其他给定奎转既有过来的仿真,一般都是四角既有的仿真,无需再次转化。

另外,Pyvista的塞克运算多半则会出现莫名其妙的情况,比如出不了结果啥的,暂时还不能很好的解决办法。感觉这也是Python可视既有仿真不如CAD软件包的一个地方,不够稳定。

(5)表侧光顺

表侧光顺的用以场景也很多,多半用可视既有显影仪显影出来的仿真噪声来得严重,或者紧致提高效率出来的仿真有很弱的拾级而上六边形,都可以用以光顺演算法对其表侧进行时卷曲解决情况。

Pyvista、Open3D和Trimesh都移动设备了光顺也就是说功能,且光顺演算法较少,来得精华的是拉普拉斯卷曲(注释:Laplacian Mesh Processing),其他还有Taubin作法、Humphrey作法等等。此处以Pyvista的smooth给定为例,用以的是 拉普拉斯卷曲演算法。

import pyvista as pv mesh = pv.read( "skull.stl") mesh.plot(background='w') mesh_smooth = mesh.smooth(relaxation_factor=0.05) mesh_smooth.plot(background='w') mesh_smooth = mesh.smooth(relaxation_factor=0.1) mesh_smooth.plot(background='w') mesh_smooth = mesh.smooth(relaxation_factor=0.2) mesh_smooth.plot(background='w')

这里主要演示relaxation_factor常量的发挥作用,可以发现随着factor的增高,卷曲效果越好来越好明显。但factor过大的话确实则会导致遗留下一些细节特征。

▌近似于可视既有给定纸制的几何学修补也就是说功能

很多时候我们得到的仿真这不是存留的,比如可视既有显影仪扫出来的仿真常常有很多破损,或者两个仿真经过出版人不久确实则会出现坏边、相付等正确,这些情况则会影响仿真的后续用以,因此几何学修补是可视既有仿真解决情况必须掌握的技能。

参考Magics软件包修补也就是说功能先前的定义,可视既有仿真相似的几何学正确特性纸制括 坏边、缝隙、孔洞、妨碍钛合金、重叠四角侧片以及相付四角侧片等。

这边重点参阅 Pymeshfix奎,细心的小朋友确实则会注意到,先前的几个章节长期不用提及这个奎。因为,看名字就知道了,这个奎是专门为mesh修补而生的,并且这个奎是依赖Pyvista的,所以在配备 Pymeshfix先前只能先配备 Pyvista。

虽然Pymeshfix对上述几种几何学正确都有系统性的修补演算法,但大多仅时候我们只只能用他的总合修补给定repair或者 clean_from_arrays/clean_from_file就够了,可以系统则会修补上述正确特性。

仍然以先前的颅侧仿真为例,手动构造一些有用的孔洞弱点,用以repair给定修补,字符如下:

importpyvista aspv importpymeshfix asmf mesh = pv.read( "skull_before_fix.stl") mesh.plot(background= 'w') # 封装为 MeshFix 对象 meshfix = mf.MeshFix(mesh) meshfix.repair(verbose= True) repaired = meshfix.mesh repaired.plot(background= 'w')

以下是修补解决情况过程先前的一小输出信息,可以看不到,演算法在系统则会进行时补洞,修补退既有和付叉四角侧片并迭代循环,先前间可以实时显示当前仿真的顶点仅和侧片仅。

INFO- Loaded 23604 vertices and 47034 faces. Patching holes...

100% done Patched 22 holesFixing degeneracies and intersectionsINFO- ********* ITERATION 0 ********* INFO- Removing degeneracies...INFO- Removing self-intersections...

最终修补结果如下,可以看不到修补效果还是很好的。不过这边只演示了孔洞的修补,其他正确我这边暂时不能恰当的仿真,大家可以必需试着。

陈述:Pymeshfix多半不用办法能用剩美修补,毕竟几何学正确的形状、表达方式为、位置有小得多的随机性,依靠确定性的演算法未必可以能用100%修补。并且,当仿真过大时,修补星期也来得长。

除Pymeshfix大多,多半也可以试着一下用以先前提的泊松扩建,相对来说测算速度来得快。基于深达研习的可视既有扩建多半也可以用来进行时仿真修补。

▌阐释

相信看剩右边5000多字长文的你,一定则会对Python可视既有仿真解决情况有了一些新的认识。当然,因为可视既有仿真解决情况所纸制含的内容可极其十分复杂,无关演算法极其多,这前言只能参阅一些皮毛,如果有只能的话要求系统研习一下Mesh解决情况演算法原理,可以参考读本:Polygon Mesh Processing。

另外,如果要开发实质上可控的CAD软件包的话,不要求单独用以以上Apache奎,以上奎仅可用来应付日常供给。 实质上CAD软件包的研发只能坚实的技术吸取,不能捷径可走。

参考链接:

Pyvista:

pymeshfix:

trimsh:

open3d:

点这里👇高度重视我,记得标星哦~

CDA课程咨询

郑州看白癜风哪里比较好
河北男科医院哪家医院最好
深圳妇科医院哪家好
信阳看妇科的专业医院
青岛癫痫专家
肝胆内科
搜疾病问医生
甲流引起的咳嗽吃什么药
白带多
跌打药

上一篇: 身体健康的几个讯号你有多少?

下一篇: 中式噩梦就是坠刁的

友情链接