Avizo用户使用手册-7
[TOC]
Chapter 7
7 教程:曲面、网格、骨架,从3D图像建模几何
Avizo允许用户创建由各类数据导出的几何模型:由点集生成曲面,由3D图像生成曲面,由曲面生成四面体网格,由3D图像生成中心线空间图。关于相关功能的概览,请参阅功能概览(Features overview)一节。本章的教程介绍以下主题:
Surface reconstruction曲面重建——从3D图像重建曲面Grid generation网格生成——由三角曲面创建四面体网格Advanced Surface and Grid Generation高级曲面与网格生成——从3D图像中提取几何模型Visualization and Analysis of 3D Models and Numerical Data3D模型与数值数据的可视化和分析Skeletonization骨架化——分析3D图像中的网络状或树状结构
7.1 从3D图像重建曲面
通过学习这个逐步教程,你将学会如何为嵌入在体素数据集中的某个对象生成三角曲面网格。曲面网格可用于产生该对象曲面的3D视图,也可以用于数值模拟。
生成过程包含以下步骤:
- 从分割结果中提取曲面
- 简化曲面
作为后续步骤的前提条件,你需要一个标签图像,它保存着先前某次图像分割的结果。请从data/tutorials目录加载所提供的motor.labels.am数据集。
7.1.1 从分割结果中提取曲面
现在,我们让Avizo为这个已分割的对象构建一个三角曲面。
- 把一个
Generate Surface模块连接到motor.labels.am数据。 - 按下
Apply按钮。
Border选项确保所创建的曲面是闭合的。一个新的数据对象motor.labels.surf被生成出来。同样,它在Project View中由一个绿色图标表示。
7.1.2 简化曲面
通常,Generate Surface模块所创建的三角形数量对于后续操作而言过于庞大。因此,必须在一个曲面简化(surface simplification)步骤中减少三角形的数量。为此,Avizo提供了一个Surface Simplification Editor曲面简化编辑器。
- 选择曲面
motor.labels.surf。由于简化器会直接修改曲面数据,你可能希望在继续之前复制一份初始曲面,这样如果没有达到预期结果,你可以重新开始。 - 单击属性区域中的简化编辑器图标。
- 你可以在
Simplify端口中设置所期望的面数;或者采用更优的方法,为三角形指定一个最大和最小尺寸。例如,最大距离试用0.02,最小距离试用0.01。你可以通过查看数据边界框的最小值和最大值来估算这个尺寸。给定过小的面数或过大的最大距离,可能会得到一个过度简化、带有自相交面的曲面。 - 进行相交测试有时是必要的,特别是当你在简化一个多材料曲面或一个复杂曲面时。为了激活它,你可以勾选
Options端口中的intersection tests strategies开关,并在Intersections端口中设置你的相交测试策略。 - 按下
Action端口中的Simplify now按钮。
三角形数量从120多万减少到5万。进度条会告知你简化任务已完成的进度。
要查看简化后的曲面,请把一个Surface View模块附加到motor.labels.surf数据对象。
Surface View模块维护着一个内部缓冲区,并显示存储在该缓冲区中的所有三角形。默认情况下,该缓冲区显示构成外部边界的所有三角形。如果你更改Materials端口处的选择,新选中的三角形会被高亮显示,即以红色线框方式呈现。Add和Remove按钮分别使高亮的三角形被添加到缓冲区或从缓冲区移除。你可以使用一个3D选择框,或在3D查看器中绘制轮廓,来轻松地可视化所有三角形的一个子集。按下Buffer端口的Clear按钮,即可看到图7.1所示的显示效果。
图 7.1:以三角网格表示的发动机曲面。
7.2 由三角曲面创建四面体网格
通过学习这个逐步教程,你将学会如何由上一个教程中创建的三角曲面生成一个体四面体网格。四面体网格是产生对象内部各种视图(例如穿过对象的切割)的基础,并且经常用于数值模拟。
生成过程包含以下步骤:
- 简化曲面(参见
Surface Reconstruction曲面重建教程) - 编辑曲面
- 生成四面体网格
作为后续步骤的前提条件,你需要一个三角曲面,它通常是先前某次曲面重建的结果。请按照Surface Reconstruction教程操作,并把最后那个曲面保留在Project View中。
图 7.2:曲面菜单The surface menu。
7.2.1 编辑曲面
作为四面体网格生成准备工作的第二步,请调用Surface Editor曲面编辑器。
- 选择曲面
motor.labels.surf。 - 再次单击简化编辑器图标,以离开
Surface Simplification Editor(简化器)。 - 单击属性区域中的曲面编辑器按钮,进入
Surface Editor。
系统会自动把一个Surface View模块附加到motor.labels.surf曲面上。关于该模块的详细信息,请参阅其说明。
当Surface Editor被调用时,Surface菜单会被添加到Avizo的菜单栏中,并且在Avizo的查看器工具栏下方会放置一个新的工具栏。Surface/Tests菜单包含8项专门的测试,它们对于准备四面体网格生成很有用。每项测试都会创建一个三角形缓冲区,可以使用后退和前进按钮在其中循环浏览。
- 从
Surface/Tests菜单中选择Intersection test相交测试。相交三角形的总数会打印在查看器窗口中。如果在曲面简化过程中fast开关是关闭的,相交现象不应该经常出现。万一出现了,第一个相交三角形及其邻居会显示在查看器窗口中。 - 你可以使用四种基本操作手动修复相交:
Edge Flip边翻转、Edge Collapse边坍缩、Edge Bisection边二分和Vertex Translation顶点平移。详情请参阅Surface Editor的说明。 - 修复之后,请再次调用相交测试——从
Surface/Tests菜单中选择它,或按下Compute按钮。 当相交测试成功通过后,从
Surface/Tests菜单中选择Orientation test朝向测试。在曲面简化之后,少数三角形的朝向可能变得不一致,从而导致这些三角形所界定的材料出现部分重叠。万一出现这种不正确的朝向(这应该很少发生),系统会自动修复。如果自动修复失败,被检测到的三角形会被显示出来,你可以使用上面提到的手动操作进行修复。注意:朝向测试有两个前提条件:曲面必须不含相交,并且曲面的外部三角形必须被指派给材料
Exterior。如果曲面并不包含这样的材料,或者对Exterior的指派不正确,该测试就会错误地报告朝向错误。
成功通过相交测试和朝向测试是四面体网格生成的必要条件。这些测试会在网格生成开始时自动执行。因此你可以直接进入Generate Tetra Grid模块(见下文)并尝试创建网格。如果其中某项测试失败,控制台窗口中会给出一条错误消息。然后你可以回到Surface Editor开始编辑。
- 从
Surface/Tests菜单中选择Aspect ratio长宽比。这会为每个三角形计算其外接圆与内切圆半径之比。最差(即最大)值的那个三角形会被首先显示,实际数值则打印在查看器窗口中。最大长宽比应低于20(低于10更好)。所幸Surface Editor中包含一个用于改善长宽比的自动工具。 - 从
Surface/Edit菜单中选择Flip edges翻转边。会出现一个小的对话框窗口。在Radius ratio区域中,把”Try to flip an edge if ratio is worse than”字段的值设为10。选择模式operate on whole surface(在整个曲面上操作)。按下Flip按钮。所有长宽比大于10的三角形都会被检查。如果某条边的长宽比可以通过边翻转得到改善,系统就会自动完成。控制台窗口会告知你不良三角形的总数以及其中有多少个得到了修复。按下Close按钮离开Flip edges工具。 - 从
Surface/Tests菜单中再次选择Aspect ratio。在应用了Flip edges工具之后,应该只剩下少量具有大长宽比的三角形。 - 从
Surface/Tests菜单中选择Dihedral angle二面角。对于每一对相邻三角形,系统会计算它们在公共边处的夹角。包含最差(即最小)角度的那对三角形会被显示,实际数值则打印在查看器中。最小二面角应大于5度(大于10度更好)。 - 要手动修复一个小的二面角,请按如下方式操作:选择两个三角形的第三个点(即公共边对面的那些点),并把它们彼此移开。为了移动顶点,你需要进入
Translate Vertex模式——单击查看器窗口顶部从右往左数第一个图标,或按下”t“键。如果查看器处于观察模式,请按ESC键或单击箭头图标(查看器窗口右侧从上往下数第一个图标)把它切换为交互模式。单击要移动的顶点。在被拾取的顶点处会显示一个点拖动器。拾取并平移该拖动器即可移动顶点。 - 在某些情况下,边翻转也可能改善这种状况。单击查看器窗口顶部从右往左数第三个图标,或按下”
f“键,进入Edge Flip模式。把查看器切换为交互模式。单击要翻转的边。 - 从
Surface/Tests菜单中选择Tetra quality四面体质量。对于每个曲面三角形,系统会计算那个很可能为该三角形所创建的四面体的长宽比。四面体的长宽比定义为其外接球与内切球半径之比。最差(即最大)值的那个三角形会被显示,实际数值则打印在查看器中。最大四面体长宽比应低于50(低于25更好)。如果所有小二面角都已被修复,那么四面体质量测试主要会检测出这样的构型:两个三角形之间的法向距离相比它们的边长而言很小。同样,vertex translation顶点平移和edge flip边翻转操作最适合用于手动修复较大的四面体长宽比。 - 再次单击曲面编辑器按钮,离开
Surface Editor。
提示:为了重新看到整个曲面,请选择Surface View图标,然后按下它的Clear按钮,再按下Add按钮,最后按下查看器工具栏中的ViewAll按钮。
7.2.2 生成四面体网格
最后一步是由曲面生成一个体四面体网格(volumetric tetrahedral grid)。这意味着由该曲面所包围的体积将被四面体填满。
由于四面体网格的计算可能很耗时,它可以作为一个批处理作业(batch job)来执行。这样你就可以在作业运行期间继续使用Avizo。不过,出于演示目的,我们希望直接在Avizo内部计算该网格。
- 把一个
Generate Tetra Grid模块连接到motor.labels.surf曲面——方法是在motor.labels.surf图标上的弹出菜单中选择Compute / Generate Tetra Grid。你也可以选择先从教程目录加载motor.simplified曲面来开始。 让
Options端口处的improve grid开关保持开启,save grid开关保持关闭。improve grid选项会对所生成的网格调用一个自动后处理过程,它通过若干次移动内部顶点、翻转内部边和面的迭代来改善四面体质量。详情请参阅Grid Editor的说明。如果
save grid开关被选中,就会出现一个额外的Grid端口,你可以在其中输入一个文件名。所生成的四面体网格将以该名称自动存储。如果你想把网格生成作为批处理作业运行,就必须选择save grid选项。- 按下
Action端口的Meshsize按钮。会出现一个编辑器窗口。它允许你定义所期望的网格尺寸,即为每个区域所创建内部边的平均长度。为此,你必须进入该区域的参数束(bundle),并选择参数MeshSize。然后你可以在编辑器下边缘的文本字段中更改该值。Avizo中有若干预定义的区域名称,系统会为它们自动设置默认网格尺寸。请确保这些默认值适用于你的应用场景。如果你不确定合适的取值,请把所期望的网格尺寸设为0。在这种情况下,系统将使用曲面三角形的平均边长。 - 按下
Action端口的Run now按钮。会出现一个弹出对话框,询问你是否确实要开始网格生成。单击Continue以继续。
一旦网格生成开始运行,进度条会告知你已经创建了多少个四面体。在某些情况下,网格生成可能失败,例如当输入曲面自相交时。此时Console Window中会出现一条错误消息。在这种情况下,请回到Surface Editor交互式地修复任何相交。
四面体网格成功创建之后,一个名为motor.labels.grid的新图标会被放入Project View中。你可以选中该图标,以查看所创建的网格包含多少个四面体。如果网格生成耗时过长,你也可以从data/tutorials目录加载预先计算好的网格motor.tetragrid.am。
作为最后一步,你可能想看看自己的劳动成果:
- 通过关闭其可见性开关或把它从
Project View中移除,隐藏Surface View模块。 - 把一个
Tetra Grid View模块附加到motor.labels.grid。 - 选择
Tetra Grid View图标。 - 把
Materials端口设置为Material 3。 - 按下
Buffer端口的Remove按钮。 - 在
Draw Style端口中选择outlined。
Tetra Grid View模块维护着一个内部缓冲区,并显示存储在该缓冲区中的所有四面体。默认情况下,该缓冲区包含所有四面体。你可以使用一个3D选择框,或在3D查看器中绘制轮廓,来轻松地可视化所有四面体的一个子集。
与Surface Editor类似,还有一个Grid Editor网格编辑器,可以通过选择四面体网格的绿色图标、然后单击属性区域中的铅笔图标(标题栏中从右往左数第一个)来调用。该编辑器旨在针对不同的质量度量来选择四面体,例如长宽比、四面体棱边处的二面角、四面体顶点处的立体角以及边长。该编辑器包含若干可用于改善网格质量的修改器。
图 7.3:以四面体网格表示的发动机体。
7.3 高级曲面与网格生成
从3D图像中提取几何模型可用于:
- 相关特征边界的可视化。
- 基于所提取几何进行的测量。
- 物理性质的数值模拟。
Avizo被广泛应用于各领域中基于3D图像的几何建模:工业检测与逆向工程、数字岩石物理、材料表征与设计(例如燃料电池、混凝土、催化剂、金属、复合材料、碳纳米管等)。
在本教程中,你将学习如何:
- 以图像驱动的精度和一致性,为单材料或多材料提取3D曲面和网格。
- 简化并细化网格划分,以获得可管理的网格规模和受控的网格质量。
- 为模拟指派边界条件,并导出所得数据。
本节包含以下部分:
Getting started: a workflow from 3D images to surfaces and grids入门:从3D图像到曲面和网格的工作流Adjusting segmentation for geometry extraction为几何提取调整分割Generating surfaces with controlled smoothing生成带受控平滑的曲面Using the Simplification Editor使用简化编辑器Using the Surface Editor使用曲面编辑器Remeshing and exporting surfaces重新网格化与导出曲面Generating tetrahedral grid生成四面体网格Assigning boundary conditions and exporting data指派边界条件与导出数据
如果你只关心曲面提取而不关心网格生成,可以跳过最后两个步骤。
要学习本教程,你应该熟悉Avizo的基本概念。特别是,你应该能够加载文件、与3D查看器交互,以及把模块连接到数据模块。所有这些问题都在Avizo第2章——入门中讨论过。
若要把本教程应用到你自己的数据上,图像滤波和分割步骤可能是关键:你可以在Avizo教程中找到关于这些内容的重要信息。
出于数值模拟的目的,Avizo可以与Avizo XWind Extension配合使用,以便把数据导出和导入到标准及商业软件的文件格式,例如Abaqus、ANSYS、CGNS、OpenFOAM等。Avizo XWind Extension为数值模拟结果提供了高级的可视化与后处理功能。更多信息请参阅第13章——Avizo XWind Extension用户指南。
实际上,Avizo为不同的数值模拟途径提供了支持:本教程所展示的FEA/CFD求解器,此外还有孔隙网络建模的前处理(参见第7.5节——Avizo Skeletonization用户指南),以及Avizo的直接模拟附加组件(参见第14章——Avizo XLabSuite Extension用户指南)。Avizo XLabSuite Extension不需要几何前处理,它提供实验模拟以及有效性质张量的计算,可计算的性质包括绝对渗透率、分子扩散率、电阻率(地层因子)和导热率等。
7.3.1 入门:从3D图像到曲面和网格的工作流
无论你是想提取一个曲面用于可视化,还是想构建一个适合模拟的网格,都需要先提供一个3D体积来定义不同的特征、材料或相。这个掩膜可以用Avizo中的不同分割技术来构建——使用Segmentation Editor工具,或使用分割模块,它们提供了从手动到全自动的各种算法,用于识别3D数据中的某个特定部分或材料。
在Avizo中,分割过程的结果是所谓的标签图像(label image),其中每个标签标识数据中的一种特定材料或相(见图7.4)。这个过程对于准确捕获所需的边界可能特别重要。
本教程假定分割过程已经完成,例如按教程第6.6节——高级分割中所介绍的方式完成。
图 7.4:滤波与分割。
注意:本教程有两个可用的标签图像:
SandPack128.labels.am是本教程中所有图片所取自的数据集,SandPack50.labels.am是从前者提取出来的一个较小数据集,你可以用它在更短的时间内完成本教程的各个步骤。
为了构建由3D单元或元素构成的3D网格,你首先需要构建表示待网格化体积边界的3D曲面。为此,你可以在标签图像上使用Generate Surface模块。不过,你可能希望先清理标签图像——移除不需要的或无用的特征,并平滑噪声和体素锯齿(voxel aliasing),以便得到一个准确但又不至于过度复杂的曲面。
7.3.2 为几何提取调整分割
在进入网格生成过程之前,可以先对标签图像做一些预处理。
- 用
File菜单中的Open Data,从Avizo安装目录的data/sandpack子目录加载SandPack128.labels.am。移除数据加载时所创建的Ortho Slice。 - 在标签图像的属性区域中,调用
Segmentation Editor以访问清理标签所需的工具(见图7.5)。
菜单栏Segmentation菜单中可用的Label Filters工具提供了修改当前标签的手段。
标签图像中可能存在一些小岛(islands),它们对于材料可视化或后续的模拟都没有意义。
- 在右上角的查看器中,用光标把XY切片移动到位置107。
图 7.5:Segmentation Editor按钮。
观察这个切片,你可以发现一个小岛需要被清理掉,以便生成合适的曲面。如果你来回移动滑块,就会看到这个岛是一个小气泡的一部分,而不属于某个大的材料。Segmentation Editor提供了一个工具来自动检测并移除这类不相连的区域。
- 在
Segmentation菜单中选择Remove islands...(见图7.6)。 - 选择
3D volume选项,以便移除这些小气泡。 - 按下
Highlight all islands,通过Apply按钮预览将被移除的气泡。你可以在左上角的3D查看器中看到所有待移除小岛的预览,它们以红色着色。 - 按下
Apply。这些小岛随即被移除(见图7.7)。
图 7.6:小岛滤波器对话框Islands filter dialog。
请注意,如果你选择Current slice或All slices,尺寸是按2D切片中轮廓的面积来定义的,那么你可能会移除掉一些细薄的材料——它们可能具有很大且有意义的体积,甚至在3D中是连通的。
图 7.7:移除小岛。
为了校正因体素锯齿造成的轮廓粗糙,可以使用Smooth labels工具。该平滑过程可以反复迭代,直到达到所期望的平滑程度。平滑会略微改变标签,但同时也会为体素指派概率权重,这些权重后续可被Generate Surface用于生成更平滑的曲面。
- 在
Segmentation菜单中选择Smooth labels...(见图7.8)。 - 选择
3D volume模式。 - 按下
Apply。 - 切换回
Project View。
图 7.8:标签平滑对话框Smooth labels dialog。
注意:平滑也可以改为在下一节所讨论的Generate Surface模块中、于曲面生成期间执行。
提示:除非在工具的对话框中选择了”3D volume”选项,平滑工具和移除小岛工具都只会沿一个方向起作用。该方向就是Segmentation Editor的3个正交视图中当前所选视图对应的方向。在某些情况下,你可能希望在全部3个方向上重复平滑或移除小岛的过程,而不是一次性使用”3D volume”工具。
提示:Segmentation Editor特别适合在有视觉反馈的情况下对分割进行精细控制。对于某些工作流,你也可以考虑使用诸如Label Analysis与Analysis Filter、Filter by Measure或Axis Connectivity(二值标签图像)这样的模块来对标签图像进行过滤。
7.3.3 生成带受控平滑的曲面
Generate Surface会创建一个3D Avizo曲面,表示每种材料或相的边界。Generate Surface模块允许在施加或不施加平滑操作的情况下生成曲面。取决于待网格化的形状或特征,你可能不希望施加平滑,或者希望施加较轻的平滑,或者干脆使用来自Segmentation Editor的Smooth label工具所产生的平滑权重(见图7.9)。所有这些选项都在Smoothing Type端口中提供。
图 7.9:不同种类的平滑作用在一个已分割颗粒上的结果:None(左上)、Existing Weights(右上)、Constrained Smoothing(左下)和Unconstrained Smoothing(右下)。
注意:如果你的材料很薄,强平滑实际上可能会把该材料删除掉。关于所有参数的完整说明,请参阅Generate Surface的文档。
- 把一个
Generate Surface模块连接到标签图像(见图7.10)。 - 检查
Smoothing Type是否被设置为Existing Weights。该选项只有在标签图像包含概率权重信息时才可用,这些信息是在前面的步骤中于Segmentation Editor里应用平滑时创建的。 - 在
Border端口中,勾选Fit To Edges选项。这会使所得曲面锐利地贴合其边界框的各边。 - 按下
Apply。 - 把一个
Surface View显示模块附加到所得的曲面上(见图7.11)。
图 7.10:Generate Surface模块参数。
现在你有了一个3D曲面对象,它由三个面片(patch)组成,对应于标签图像中所标识的材料数量(包括Exterior)。Generate Surface模块所产生的三角形数量可能非常庞大,不适合用于可视化或模拟。而且,考虑到例如三角形长宽比等因素,通过这第一步生成的三角形也可能不适合用于模拟。
图 7.11:由两相标签图像生成的曲面。
为了从所生成的曲面对3D体积进行网格划分,Generate Tetra Grid模块提供了一些针对曲面的质量检查。这有助于了解在网格生成之前是否需要做一些改进,而不是直接运行一次注定失败、或者会得到低质量网格的网格生成。
- 把一个
Generate Tetra Grid模块连接到该曲面(见图7.12)。 - 按下
Action端口中的Check按钮。
图 7.12:Generate Tetra Grid模块。
Tables面板中会打开一份报告,包含关于这两个材料面片的质量信息。你可以观察到,最大的三角形长宽比处于非常危险的水平,即超过了30。
你可以通过重新网格化该曲面来校正这一点,从而获得具有模拟质量的三角形。首先,你要通过抽稀(decimation)或曲面简化过程来简化三角形的数量。
7.3.4 使用简化编辑器
Simplification Editor简化编辑器可以在待简化曲面对象的属性窗口中找到(见图7.13)。
图 7.13:Simplification Editor按钮。
注意:Simplification Editor会进行原地(in-place)简化,因此确切的初始曲面将会丢失。所以建议在简化之前复制该曲面。一个便捷做法是在项目视图中选中该曲面数据对象并按Ctrl-D。你可能还想在之后使用快捷键F2来重命名某个曲面数据,以更好地反映其内容。
- 打开
Simplification Editor。
关于所有参数的完整说明,请参阅Simplification Editor的文档。默认参数会对曲面进行简化,在平坦区域生成较大的三角形,而在高曲率区域生成较小的三角形,从而保留细节。这适合用于加快大型曲面的可视化,或者用于导出一个轻量化的三角曲面文件(见图7.14)。
出于模拟目的,大多数时候人们希望得到均衡的三角形,因此不要使用”抽稀到给定面数”这个默认选项,而是可以使用Simplify端口中的max dist字段,来告诉编辑器你想达到的最大边长。
- 把
max dist设为2。 - 按下
Simplify now(见图7.15)。 - 关闭
Simplification Editor。
提示:max dist的一个良好估计是把该端口初始化为体积最小维度的大约1%。你可以使用Local Axes来显示你体积的实际尺寸。
注意:所得到的三角形数量,应当以模拟目标三角形数量的大约两倍为目标。因为在下一个步骤(重新网格化步骤)中,这个数量会减半。所以,如果一个适合模拟的曲面包含约100,000个三角形,那么在这个简化步骤之后,你需要有一个复杂度两倍、即约200,000个三角形的曲面。
图 7.14:曲面的粗略简化,使用Surface View的”outlined”绘制风格显示。
图 7.15:简化后的曲面。
请注意,过于激进的简化可能导致三角形相交。
此时,你可以再次借助Generate Tetra Grid模块执行质量检查。
现在你有了一个简化后的曲面,可以使用Surface Editor来检查可能存在的曲面异常(例如相交或不良长宽比),并改善三角网格划分。
7.3.5 使用曲面编辑器
Surface Editor曲面编辑器可以在待检查或待清理曲面对象的属性窗口中找到(见图7.16)。
注意:与Simplification Editor一样,Surface Editor会进行原地编辑,确切的初始曲面将会丢失。虽然许多曲面编辑操作可以撤销,但在编辑之前复制初始曲面是一种安全的做法(在项目视图中选中曲面数据对象并按Ctrl-D)。
图 7.16:Surface Editor按钮。
- 打开
Surface Editor。
当Surface Editor被激活时,会出现一个工具栏和一个新的Surface菜单(见图7.17)。
图 7.17:Surface Editor菜单。
- 打开
Surface菜单,在Tests子菜单中选择Intersection test。你也可以在工具栏的Selector tool中选取Intersection test(见图7.18)。
测试结果会显示在3D查看器的上方。在当前这个例子中不存在相交,所以你可以直接跳到下一项测试。不过请注意,相交可以用Edit子菜单中的Fix intersections...工具自动修复(见图7.19),也可以使用工具栏中的Surface Editor工具手动修复。
- 在
Tests子菜单中选择Aspect ratio。
图 7.18:Surface Editor的相交测试子菜单。
图 7.19:相交测试结果与相交修复子菜单。
长宽比最高的那个三角形会显示在3D查看器中,长宽比的数值给在左上角(见图7.20)。按下Surface editor工具栏中向右的箭头,可以查看长宽比次高的三角形。
- 在
Edit子菜单中选择Prepare Generate Tetra Grid...。 - 对于下界和期望达到的四面体质量,保留默认值,然后按
Fix。 - 完成后关闭该对话框。
Prepare Generate Tetra Grid组合了Flip edges...、Fix small dihedral angles...和Fix tetra quality...这几个工具。
如果你在该曲面上再次运行Aspect ratio测试,会注意到最高的三角形长宽比已经处于一个可接受得多的数值(低于30)。
此时,你可以再次借助Generate Tetra Grid模块执行质量检查,并且会看到所有测试结果都更加可以接受了。
图 7.20:测试三角形的长宽比。一个长宽比不良的三角形被高亮显示。
如果你正在编辑的曲面恰好存在相交、或三角形长宽比过高、或某项测试揭示出任何其他问题,你可能需要与该曲面交互来加以校正。为此,你必须使用Tests菜单来选择与你的问题相对应的测试。第一个有问题的三角形会以红色高亮的方式显示在它的邻居之中。
例如,在本教程所考虑的曲面上,长宽比最高的那个三角形可以被改善:
- 如果尚未执行,请运行
Aspect ratio测试。 - 切换到交互模式(按[Esc])。
- 在
Surface Editor工具栏中选择Translate Vertices按钮(或按T键)(见图7.21)。 - 单击你想移动的那个三角形的顶点,并使用拖动器来移动它(见图7.22)。你可以拾取拖动器的方块部分或杆状部分,以沿某个平面或某个轴平移;按一次或两次Ctrl键可以在两者之间切换。按Ctrl-Z撤销。
图 7.21:Surface Editor的Translate Vertex工具。
图 7.22:用Translate Vertex工具编辑一个三角形以改善其质量。
另一种改善三角形质量的方法是使用Contract Edges工具坍缩三角形的一条边:
- 运行
Aspect ratio测试以获得下一个不良三角形。 - 切换到交互模式(按[Esc])。
- 在
Surface Editor工具栏中选择Contract Edges按钮(或按快捷键O)(见图7.23)。 - 单击你想移除的那个三角形的边(见图7.24)。
图 7.23:Surface Editor的Contract Edges工具。
图 7.24:用Contract Edges工具编辑一个三角形以改善其质量。
在这一步,你可能想重新运行一次Prepare Generate Tetra Grid工具。
现在你可以让Avizo使用Remesh Surface模块来重新网格化该曲面。
7.3.6 重新网格化与导出曲面
- 把一个
Remesh Surface模块连接到该曲面。
在该模块的Desired Size端口中,可以把目标三角形数量设置为原始曲面三角形数量的一个百分比。
- 把
Desired Size端口的百分比值保持为50%。
如果曲面相当简单,其余的默认参数就可以使用;但如果曲面不那么简单,例如它包含多个面片,那么在高级模式中调整参数会很有用。
Smoothness平滑度是高级选项中的一个重要参数。该参数允许控制你希望把三角形之间的夹角保持得多么锐利。如果你想在曲面中保留锐边,这一点就很重要(见图7.25)。
图 7.25:用两种不同平滑度参数值重新网格化的曲面:0(左)和0.6(右)。
- 把
Error Thresholds端口的smoothness参数设为0.6。
由于当前曲面包含多个带有大量公共界面的面片,为了尽量减少所生成三角形之间在轮廓附近的相交,该过程应当拆分为两个重新网格化步骤。
- 勾选
Contour Options端口中的fix contours复选框。 - 按
Apply第一次运行重新网格化器。
在这一步,不存在相交,但轮廓处的边长比网格其余部分更短。这可能不是你想要的。下一步将调整轮廓的边长。
- 把第二个
Remesh Surface模块连接到新生成的曲面。 - 把
Desired size端口的百分比设为100%。 - 把
Error Thresholds端口的smoothness参数设为0.6。 - 如果
fix contours选项被勾选,请取消勾选;并勾选Zone Options端口(Deploy Zone)中的only around contour选项。 - 运行重新网格化器(见图7.26)。
图 7.26:从左到右:初始曲面、fix contours重新网格化、仅在轮廓周围重新网格化。
然后,可以使用File菜单中的Export Data As...,把这个基于三角形的曲面导出为包括STL在内的各种格式。
在这一步,你可能想再次走一遍Surface Editor流程,以最终完成曲面的清理、检查相交并检查长宽比。
7.3.7 生成四面体网格
- 把一个
Generate Tetra Grid模块附加到重新网格化后的曲面。 - 按下
Run now按钮。 - 在计算时间警告对话框中按
Continue。
该模块会生成一份报告,展示关于网格质量的一些信息(见图7.27)。所生成的四面体网格可以用一个Tetra Grid View显示模块来可视化。
图 7.27:四面体网格质量报告。
默认情况下,所有四面体都是按照它们将要”附着”到曲面上的那些三角形的尺寸来生成的。
- 按下
Generate Tetra Grid模块中的Meshsize按钮。
如果你查看这两个相的Meshsize参数(孔隙空间是Material1,颗粒是Material2),会看到该值被设置为默认值0,这将触发按三角形尺寸自动确定四面体尺寸(见图7.28)。你可以逐材料更改这个网格尺寸参数,这样网格生成器就会在远离曲面界面的地方尝试用这个边长来生成四面体(见图7.29)。曲面界面上的边长将始终是共享三角形的边长。
图 7.28:Meshsize参数对话框。
图 7.29:左:网格尺寸设为默认值(0);右:孔隙空间(Material1)网格尺寸设为2,颗粒(Material1)设为5。
注意:如果你想更改曲面上四面体的尺寸,可以在网格生成之前使用Surface Editor来细化或简化某个特定的曲面面片。例如,你可以在Surface Editor中选择一种材料(它会以红色高亮显示),然后使用Surface Editor菜单Edit子菜单中的Refine faces命令来细化这个面片(见图7.30)。
图 7.30:细化颗粒相(Material1)曲面的三角形。
7.3.8 指派边界条件与导出数据
在真正导出3D网格之前,你可以使用Surface Editor为曲面的不同面片指派边界条件。你可能想为流动模拟定义入口和出口,以及壁面。
- 选择你用来生成四面体网格的那个重新网格化后的曲面。
- 打开
Surface Editor。 - 切换到交互模式(按[Esc])。
- 按下
Magic Wand魔术棒工具。
Magic Wand工具可用于选择一片共面的三角形。你必须定义折痕角(crease angle),它是用于定义三角形共面性的准则,Magic Wand将用它来选择相邻的三角形。
- 把
Degrees参数设为一个足够小的值,例如10(见图7.31)。 - 通过从某个特定面片中拾取任意一个三角形来选择该面片。
然后你可以为这个面片指派一个特定的边界条件。
- 打开
Surface菜单,在Edit子菜单中选择Set boundary ids...。
图 7.31:使用Magic Wand选择一片共面的三角形。
- 在右侧列中,选择你想指派给该面片的边界条件类型,然后按下
Set。 - 重复该操作足够多次,直到没有面片处于未定义状态(见图7.32)。
图 7.32:设置边界id。
使用Surface Editor中的Selector工具,你也可以在整个曲面上选择不同的面片,并例如为所有颗粒壁面指派一个Wall边界条件。
Surface View模块可以被定制,使其不仅按材料、也按边界条件类型对曲面着色。
- 退出
Surface Editor。 - 在
Surface View模块的Selection Mode端口中,选择BoundaryID。 - 在
Colors端口中,选择boundary ids(见图7.33)。
图 7.33:按边界id着色的曲面:例如这里,顶部孔隙空间的面是速度入口,底部的是压力出口(不可见),侧面的是周期性边界,颗粒面则是壁面。
一旦为曲面指派了边界条件,你就可以把它们重新指派给先前生成的3D网格,这样在保存时,这些边界条件就会被导出到模拟求解器。
- 把一个
Assign Boundary Conditions模块连接到该网格(见图7.34)。 - 在
Surface端口中,选择你刚刚指派了边界id的那个重新网格化后的曲面。 - 按
Apply。
图 7.34:Assign Boundary Conditions模块。
一个已指派边界条件的新网格被创建出来。它适合用于模拟,并且可以使用File / Export Data As...菜单导出到FEA/CFD软件(见图7.35)。
FEA/CFD软件格式的导出功能随Avizo XWind Extension提供。
然后,你可以使用Avizo XWind Extension对从求解器返回的模拟结果进行后处理(参见第13章——Avizo XWind Extension用户指南)。
图 7.35:Export Data As...菜单中可用的导出格式。
注意:对于多孔介质中的流体动力学,你可以使用Avizo XLabSuite Extension模块来评估样品的绝对渗透率。Avizo XLabSuite Extension直接依赖于用于识别孔隙相和固相的掩膜,不需要曲面或3D网格生成。
7.4 用Avizo对3D模型与数值数据进行可视化和分析
Avizo套件为以下方面提供了高级支持:
- 面向流动、应力或热分析等数值模拟应用的3D网格生成,
- 把曲面或3D网格导出到数值求解器,
- 对来自求解器的结果数据进行后处理,
- 对来自模拟或测量的标量场、矢量场和张量场进行强大的可视化和分析。
Avizo支持诸如以下的工作流:
- 对来自模拟或测量的数据进行探索、分析和比较,
- 从3D图像出发,为有限元分析(FEA)、计算流体动力学(CFD)、计算机辅助设计(CAD)、快速原型制造进行建模,
- 高质量的呈现与交流,从影片生成到远程协作、沉浸式显示或虚拟现实(需要Avizo XScreen Extension)。
Avizo XWind Extension是包含Avizo Lite Edition功能集、以及可视化、后处理、分析和呈现CAE与CFD模拟结果所需的全部扩展的软件套件。
关于数值数据的扩展支持(导入/导出、分析和可视化),请参阅第13章 Avizo XWind Extension用户指南。
Avizo提供了第一层级的支持,概括在以下各节中:
Features for surfaces曲面相关功能Supported grids受支持的网格Features for 3D grids3D网格相关功能Scalar fields visualization标量场可视化Vector fields visualization矢量场可视化Time dependent data visualization时变数据可视化Basic compute modules and tensors基本计算模块与张量
为方便起见,在Avizo Lite Edition中,Avizo XMesh Extension汇集了为FEA和CFD数据可视化提供基本支持的各个模块。
关于各项功能的完整概览,请参阅功能概览一节和第13章 Avizo XWind Extension用户指南。
使用Avizo XWind Extension进行后处理的推荐教程,可以在第13章 Avizo XWind Extension用户指南中找到。
本章的在线版本包含以下主题的Avizo使用教程:
Air flow around an airfoil翼型周围的气流——流线及其他技术,Study of a helicopter combustion chamber直升机燃烧室研究——标量与矢量可视化、探测、体绘制,Flow around a square cylinder方柱周围的流动——时变数据后处理。
7.4.1 Avizo的曲面相关功能
Avizo支持带附加数值数据的三角曲面的可视化(Surface View)。曲面可以被直接导入,也可以从3D图像标签(Generate Surface)或点云(Delaunay Triangulation和Point Wrap Triangulation)生成。可以对曲面进行简化、平滑和编辑,计算曲面曲率和曲面距离,对齐和翘曲曲面,导出曲面等等。
Avizo XMesh Extension提供了额外的功能,例如曲面配准(Align Surfaces)、质量控制(Triangle Quality)、曲面上矢量数据的处理与可视化(Displace Vertex、Magnitude、Vectors Slice、Stream LIC Surface、Line Streaks)、数据插值(Interpolate)以及3D网格生成(Generate Tetra Grid)。
7.4.2 Avizo XMesh Extension中受支持的网格
Avizo支持种类广泛的3D网格。显示模块和计算模块可能专用于某一特定种类的网格,这一点会在模块帮助中说明。
在Avizo中你可以处理:
- 规则网格
Regular grids, - 非结构四面体网格
Unstructured tetrahedral grids, - 非结构六面体网格
Unstructured hexahedral grids。
Avizo XWind Extension增加了对以下网格的支持:
- 非结构模型网格
Unstructured models grids(四面体、六面体、楔形和金字塔单元的任意集合)。
注意:如果在运行时检测到Avizo XWind Extension许可证,那么每当加载AVS、Fluent、Ideas、Tecplot格式,或Avizo XWind Extension所支持的任何格式的文件时(完整列表参见文件格式索引),系统都会自动创建一个非结构模型网格,它可以连接到Avizo XWind Extension模块。即使该文件只包含四面体、或只包含六面体,或该网格是一个规则网格,情况也是如此。
规则网格包括四种类型:
- 均匀网格
Uniform grids,规则网格的最简单形式,因为所有网格单元都是轴对齐且尺寸相等的; - 堆叠网格
Stacked grids,由一叠均匀2D切片构成,切片间距可变; - 直线网格
Rectilinear grids,其网格单元与坐标轴对齐,但单元之间的距离在每个方向上可以不同; - 曲线网格
Curvilinear grids,其每个节点的位置都以一个3D矢量存储,并被逐个编号。
更多细节请参阅第15.5.2.2节了解规则坐标类型。第15.5.3节(四面体网格)和第15.5.4节(六面体网格)包含关于这些网格属性及其坐标或数据存储系统的信息。
7.4.3 Avizo XMesh Extension的3D网格相关功能
7.4.3.1 网格可视化
存在若干显示模块,用于可视化网格及其组成部分,例如网格线、面、边界或节点。也可以只可视化网格的一部分,这取决于所选择的感兴趣区域,或所研究集合由多种材料中的某一种(或某几种)材料构成的情况。为此,用于四面体网格的Tetra Grid View模块和用于六面体网格的Hexa Grid View模块为用户提供了各种强大的显示功能。
四面体网格的边界面可以用前面提到的模块显示,也可以用Grid Boundary显示,边界条件则可以用Boundary Conditions显示。
四面体网格的横截面可以通过Grid Cut获得。
7.4.3.2 网格转换、变换与生成
计算模块Lattice to Hexa Grid、Tetra Grid to Hexa Grid和Hexa Grid to Tetra Grid可把一种类型的网格转换为另一种类型。数据的转换可以同时进行。
针对四面体网格,存在若干网格生成和变换工具,例如Generate Tetra Grid(由3D三角曲面生成四面体网格)、Merge Tetra(网格的合并)和Align Surfaces(对齐三角曲面)。你可以在教程第7.2节 由三角曲面创建四面体网格中找到网格生成的一个示例。
7.4.3.3 网格质量
网格的质量对于在该网格上所做计算的精度至关重要。因此,诸如用于四面体网格的Tetra Quality和用于六面体网格的Hexa Quality这样的质量测量工具非常有用。三角曲面可以用Triangle Quality进行测试。
图 7.36:按四面体单元直径比着色的巧克力棒网格表示。
7.4.4 标量场可视化
第7.4.3节中讨论的体可视化工具也可用于在整个体积上可视化标量场,因为这些模块大多具有伪彩色功能。
图 7.37:用密度作为颜色场,对某直升机燃烧室剖面的六面体网格进行伪彩色着色。
用于四面体网格的Field Cut具有同样的伪彩色能力,可用于可视化3D标量场的横截面。
等值面(例如用于四面体的Isosurface)是有助于理解物理现象的强大显示工具,并且对Avizo XMesh Extension所支持的每一种网格都可用。
7.4.5 矢量场可视化
显示矢量场最直观的方式是把矢量绘制为箭头。使用Vectors Slice模块,你可以在域的某个平面切割上绘制定义在Avizo XMesh Extension所支持的任何网格类型上的矢量场。
对于定义在四面体网格上的矢量场,可以用Tetra Vectors模块获得体表示。
Particle Plot模块用指向局部流动方向的粒子(锥体)来表示矢量场(适用于Avizo XMesh Extension所支持的所有网格类型)。粒子图也可以被动画化以展示流动。
绘制粒子的路径线是表示和理解流动行为的好方法,例如对于带有许多回流的湍流。为此,你可以使用Stream Ribbons模块或Illuminated Streamlines模块。种子点的选择可以通过不同方式完成,例如使用Seed Surface模块。
最后,Stream LIC Surface模块使用线积分卷积(LIC)算法来可视化定义在任意3D三角曲面上的矢量场,该算法会生成一种揭示矢量场方向结构的曲面纹理。Stream LIC Slice模块实现了类似的2D算法。
关于线积分卷积和照明流线技术的应用,请参阅教程翼型周围的气流。该教程可在在线文档中找到。
图 7.38:用Stream LIC Slice显示翼型后方的空气速度矢量场。
7.4.6 时变数据可视化
前面提到的可视化功能可以与Avizo的Time Series Control模块高效地结合起来。通过File菜单中的Open Time Series Data...选项加载数据之后,就可以把显示模块或计算模块连接到该数据,并使用Time Series Control来获取和播放例如某个流动行为随时间变化的动画序列。
这种技术特别适合Particle Pathlines显示模块。与Time Series Control结合使用时,它用一组按照矢量方向和速度随时间运动的粒子来表示矢量场。
关于可用于时变数据可视化的其他Avizo XMesh Extension模块的建议,请参阅方柱周围的流动教程。该教程可在在线文档中找到。
7.4.7 计算模块
Avizo XMesh Extension包含一些计算工具,它们例如在流动与应力分析领域会很有用。
7.4.7.1 基本计算工具
按矢量的幅值为3D矢量场表示或某个流动横截面(例如Stream LIC Slice)着色,是物理学中非常常见的表示方式,非常常用于速度矢量场。要计算幅值,可以在Avizo XMesh Extension所支持的任何网格类型上使用Magnitude模块。
散度是许多物理方程中用到的一个算子。Divergence模块计算定义在均匀网格上的矢量场的散度。标量场的梯度或矢量场的雅可比矩阵也同样可以在规则网格上用Gradient模块计算。
Lambda 2模块返回一个标量场,它对湍流的CFD研究很有意义,因为$\lambda_2$为负的那些点标记出涡核。
7.4.7.2 张量数据
在规则网格上可以生成张量:
Gradient,如前所述,计算矢量场的雅可比矩阵;Rate of Strain Tensor计算位移矢量场的应变率张量。
Avizo XMesh Extension为对称二阶张量提供了一些计算和可视化支持。
Extract Eigenvalues模块计算对称二阶张量的特征值。Eigenvector to Color创建特征向量的颜色表示。
最后,Tensor View使用张量字形(tensor glyph)来显示对称二阶张量。
7.5 骨架化
Avizo XFiber Extension汇集了一套强大的工具,用于分析3D图像中的网络状或树状结构,例如多孔网络、树枝状网络、血管网络、裂缝网络或纤维网络。
3D图像必须首先被分割为标签图像或二值图像。为此Avizo提供了一套丰富的工具,包括Segmentation Editor,以及Avizo中可用的高级图像处理工具。有了骨架化工具,这些被标记的区域就可以被细化(thinned)为1个体素厚度的骨架,该骨架依据Avizo可计算的Distance Map与形状边界保持等距。图像骨架可以被转换为几何的Spatial Graph空间图,以便进一步分析。
在本章中你将学习如何:
- 使用
Auto Skeleton模块, - 显示并导出骨架化的结果,
- 逐步实现骨架化以进行细致的控制,
- 把骨架化应用于大数据。
要学习本教程,你应该熟悉Avizo的基本概念。特别是,你应该能够加载文件、与3D查看器交互,以及把显示模块连接到数据模块。所有这些问题都在第2章——入门中讨论过。为了在你自己的数据上实际使用骨架化,你可能还需要熟悉图像滤波和分割(参见第3章——Avizo中的图像与体积可视化和处理)。在Avizo中还可以找到更多相关工具。
7.5.1 骨架化入门:Auto Skeleton模块
Auto Skeleton模块从图像数据中提取相互连接区域(例如丝状结构)的中心线。该模块既可用于已分割的图像(标签图像),也可用于灰度图像——在后一种情况下,图像会用一个用户定义的阈值即时进行分割。该模块基本上是把若干必须按顺序执行的单一计算模块包装在了一起。它首先计算已分割图像的距离图(Distance Map for Skeleton),然后对标签图像执行细化,最终只剩下一串相连的体素(Thinner)。
让我们来提取某个裂缝性岩芯样品数据集中孔隙网络的骨架:
- 如果
Project View不为空,请按[CRTL+N]开始一个新的空项目。 - 从
File菜单选择File / Open Data...,并从Avizo根目录加载文件data/core/coreSample.am。 - 移除
Ortho Slice模块。 - 在数据上下文菜单中选择
Image Processing / Skeletonization / Auto Skeleton,把一个Auto Skeleton附加到该数据集。 - 把
Auto Skeleton模块的Threshold端口调整为27。其他端口保留默认设置。 - 按下
Apply按钮开始处理。 - 你也可以把某个
Display模块附加到coreSample.am,例如Image Ortho Projections。
图7.39展示了这些步骤的结果。
图 7.39:Auto Skeleton结果的可视化以及相关的Project View。
Auto Skeleton模块会自动把体素骨架转换为一个Spatial Graph对象。Spatial Graph由节点(nodes)和线段(segments)组成,其中节点是分支点和端点,线段则是连接各节点的曲线。线段的三维走向由3D空间中的一串点给出。由线段相连的一组节点称为一个图(graph)。一个Spatial Graph数据对象可以存储多个图。此外,Spatial Graph对象可以保存诸如厚度这样的标量值。
Spatial Graph由Auto Skeleton使用一个Trace Lines模块创建。由于线段连接的是体素中心,线条可能显得参差不齐。默认情况下,Auto Skeleton会用一个Smooth Line Set模块对图的线条进行平滑。平滑可以调整或禁用。在默认的Output Options端口设置Create SpatialView下,会附加一个Spatial Graph View模块来显示它。
到最近边界的距离(边界距离图)作为thickness属性存储在Spatial Graph对象的每个点上(使用Eval on Lines)。
注意:thickness属性由Auto Skeleton模块计算为一个离散的倒角距离,(默认)乘以体素尺寸的1/3,最小值为半个体素尺寸。这可以用作局部厚度的一个估计。此外,距离图数据可以定义一个数据参数ChamferMapScaleFactor,用于调整厚度属性(详情参见Eval on Lines)。
提示:在使用Auto Skeleton模块之前,把数据重采样为各向同性的体素尺寸可能会有用(Resample)。这个可选步骤可以改善距离图和骨架化过程的结果,并可能得到更平滑的空间图。不过,取决于初始的体素长宽比,这可能会显著增大数据规模,除非在某个方向上使用了降采样。
注意:你可能会在空间图中注意到一些星形的相连线段集合。这可能发生在例如分割结果在一个非常小的区域周围产生了背景边界时——就像一个完全被空隙包围的悬空实体区域。这可能是数据中噪声过多的迹象,需要进行清理,例如使用高斯滤波器、中值滤波器或Avizo中更高级的滤波器。分割中的这类实体小岛也可以用分割编辑器或形态学工具来消除。
提示:在严格树形拓扑的情况下,把搜索限制为一棵树可能更有利。你可能想使用Centerline Tree模块来提取一个具有保证树形拓扑的图。请注意,Centerline Tree不能直接应用于灰度图像,而只能应用于已分割的图像数据:它要求以标签图像作为输入。
7.5.2 显示与导出骨架化结果
7.5.2.1 可视化骨架厚度
可以通过更改Spatial Graph View模块中的选项来修改图的可视化(图7.40)。例如,很容易把线段显示为管状,其直径取决于由距离图定义的thickness。这可以通过勾选Segment style端口上的Tubes复选框、并把Tube scale改为Thickness来实现。不过请注意,这可能会很慢,具体取决于空间图的复杂度和所用的图形硬件。在本教程中,线段将按照其厚度以相应的颜色显示:
图 7.40:Spatial Graph View模块的属性。
- 选择
Spatial Graph View模块。 - 把
Nodes端口设为关闭。 - 把Segment coloring端口从
constant改为thickness。 - 在Segment colormap端口中,使用
Edit按钮选择physics.icol。然后使用Edit > Adjust range按钮调整数据范围,或者右键单击颜色图色带并选择Adjust range。如有必要,使用Zoom > Range按钮。参见图7.40以了解该模块的完整属性。
图7.41展示了这些步骤的结果。
图 7.41:Spatial Graph View结果的可视化以及相关的项目视图。
7.5.2.2 导出空间图
你可以把Spatial Graph数据(包括连通性和厚度信息)导出为各种格式,例如Avizo Spatial Graph ASCII格式、SWC和MV3D格式。
- 为此,请选择该数据模块,并在
File菜单或数据对象上下文菜单中选择Export Data As...。
使用Avizo ASCII格式的输出文件,其结构大致如下:文件头声明VERTEX、EDGE、POINT的数量,Parameters块中把ContentType标为HxSpatialGraph;随后声明各数据字段及其编号——VertexCoordinates(@1)、EdgeConnectivity(@2)、NumEdgePoints(@3)、EdgePointCoordinates(@4)、thickness(@5);再往下是以@1、@2……分段标记的数据区,依次列出各顶点坐标、各边所连接的顶点对、每条边的点数、各边点坐标以及厚度值。
7.5.2.3 空间图统计
你可以直接从Spatial Graph数据获取一些统计信息:
- 选择
coreSample.Smt.SptGraph数据模块。 - 在数据上下文菜单中选择
Measure And Analyze / Spatial Graph Statistics,把一个Spatial Graph Statistics模块附加到该数据集。 - 按下
Apply按钮。 - 项目视图中会出现一个新数据:
coreSample.Smt.statistics。 - 选择Options端口的
Create a new tab per graph。 - 再次按下
Apply按钮。 - 选择
coreSample.Smt.statistics,并在数据属性中单击Show按钮以显示一个带标签页的电子表格(见图7.42)。图的摘要显示在第一个标签页中。然后,图的统计信息汇总在第二个标签页中。一个图对应一个标签页。
Spatial Graph统计信息可以保存为多种文件格式(CSV、XML、TXT)。
图 7.42:包含Spatial Graph Statistics结果的电子表格。
7.5.2.4 使用线集对象
把Spatial Graph对象转换为Line Set线集可能会很有用。线集提供了额外的显示、编辑、处理或导出工具。例如,Line Set Editor可用于交互式地识别线或节点的索引。
注意:在下文中将会用到Line Set Editor。它要求Avizo控制台可见,因为它会向控制台输出信息。默认情况下控制台不可见,但可以通过单击主工具栏上的Console按钮轻松激活。
- 把一个
Convert / Spatial Graph to Line Set模块附加到Spatial Graph数据coreSample.Smt.SptGraph。 - 按下
Apply按钮以创建一个Line Set。 - 选择所创建的
Line Set。在属性面板中,单击Line Set Editor按钮(见图7.43)。 - 隐藏附加到
coreSample.am的Spatial Graph View。这一步是必要的,因为该模块所绘制的线条与Line Set Editor所绘制的线条重叠,会在下一步中导致拾取线和点时出现问题。
图 7.43:Line Set的属性。用于启动Line Set Editor的按钮被高亮显示。
- 把3D查看器窗口设为交互模式(按[ESC]键或单击箭头按钮)。现在你可以选择线集的线段和点了。相应的信息会显示在控制台中。
- 你可能还想在拾取某个点时看到坐标和图像强度值。为此,请把一个
Measure And Analyze / Point Probe模块附加到图像数据coreSample.am。确保Point Probe模块在Project View中保持被选中状态。然后,当用鼠标中键单击线集所显示的点和线段时,输入字段的Point坐标和Current value就会被显示出来。你也可以把Point Probe附加到距离图数据,以显示所估计的厚度。关于如何显示距离图数据对象,请参见下文一节。
图 7.44:经过若干次选择之后Line Set Editor结果的可视化以及相关的Project View。所出现的数值未予展示,因为它取决于所选的点和线。
在可视化大型数据集时,常常需要把所显示的几何限制在整个数据集的某个子体积内。ROI Box可以帮助做到这一点。你可以把它附加到任何空间数据对象上。许多显示模块都有一个名为ROI的输入连接,可以连接到ROI Box模块以限制视图。
- 单击
Line Set Editor按钮以停用该编辑器。 - 通过右键单击线集数据对象、并从上下文菜单的
Display子菜单中选择ROI Box,创建一个ROI Box模块。 - 把一个
Display / Line Set View模块附加到线集数据对象。 - 在
Line Set View的Optional Connections端口中,把名为ROI的端口连接到ROI Box模块。为此,请右键单击Line Set View图标左侧的白色方块并选择ROI。此时会有一条蓝线附着在鼠标指针上;当你单击ROI Box图标后,这两个模块就连接起来了。 - 把查看器切换到交互模式,然后单击并拖动其中一个绿色方块。这会调整感兴趣区域,
Line Set View会立即采用新的限制范围。 - 单击并拖动该长方体的(不可见的)面,可以把它移动到另一个位置。
图7.45展示了这几个步骤的结果。
在处理线集的一个小子集时,可以做一些需要更多图形算力的可视化。例如,可以把线条显示为反映局部厚度的管状。
- 选择线集中相当小的一部分。
- 选择
Line Set View。 - 单击
Shape下拉菜单,在Line Shape组中选择Circle。 - 单击
Scale Mode下拉菜单并选择Data 0。 - 把
Scale Factor滑块移动到2。
图7.46展示了一个示例以及Line Set View模块的参数。
在查看器中,线条现在显示为管状。厚度按与这些线条相关联的数据进行缩放。
注意:与线条相关联的数据值是局部半径。而Line Set View是按局部直径进行缩放的。因此,要缩放到物理尺寸,你必须使用Scale Factor 2。
图 7.45:限制在ROI Box内的Line Set View可视化以及相关的项目视图。
用不同方式为线条着色可能会很有用。在下一个示例中,线集将按局部z值着色。首先创建一个Analytic Scalar Field来提供深度(z值),然后按照从该场求得的数值来设置线集着色。
创建该标量场:
- 在
Project View中右键单击,然后单击Create Object...并选择Images And Fields / Analytic Scalar Field。 - 选择新创建的图标。
- 在
Expr字段中键入z。Range信息会更新为-0.9...0.9。 - 选择
Line Set View对象。 - 把它在
Optional Connections组中的Scalar field 1输入端口附加到Analytic Scalar Field数据对象。 - 把
Line Set View模块Coloring组中的Color Mode端口设置为Analytic-Scalar-Field。 - 使用
Colormap端口更改颜色图和数据范围。关于需要修改的参数的更多细节,请参见图7.47。
图7.48展示了结果和Project View。
图 7.46:限制在ROI Box内的Line Set View可视化,以及Line Set View模块的参数。
图 7.47:在Line Set View模块中为管状着色所修改的参数。
图 7.48:着色后的Line Set View可视化以及相关的项目视图。
Line Set对象还提供了一个Tcl脚本接口,用于查询或修改数据。关于Tcl脚本编写的介绍,请参阅第11.5章。
也可以把Line Set转换回Spatial Graph。
7.5.2.5 中间数据
Auto Skeleton模块可以在模块工作区中暴露若干中间数据对象。这些中间文件对于检查、导出,或作为特定处理的起点都可能有用。
- 删除
Line Set View模块、coreSample.Smt.SptGraph-LS空间图(这也应当会移除ROI Box)、前面步骤中创建的Analytic Scalar Field数据、Spatial Graph Statistics模块、Point Probe模块、coreSample.Smt.statistics数据以及Spatial Graph to Line Set模块。 - 选择
Auto Skeleton模块。 - 在属性面板的Create Objects端口中,勾选
Distance Map。 - 在属性面板的Options端口中,取消勾选
Show Spatial Graph。 - 按下
Apply按钮再次执行骨架化处理。 - 把一个
Ortho Slice附加到距离图场coreSample.DistField。结果可能类似图7.49。
图 7.49:着色后的Line Set View可视化以及相关的项目视图。
请注意,由Auto Skeleton通过一个Distance Map For Skeleton模块创建的距离图coreSample.DistField,在本版本中当附加到内存中的数据时,会按Thinner模块的要求扩展一个15体素的边界。
7.5.3 逐步进行骨架化
现在我们来逐步实现骨架化。这对于高级用户选择不同的距离图设置,或控制Thinner模块生成分支点的灵敏度可能会有用。让我们从创建一个标签图像开始。任何分割过程都可以使用:
- 从
Project View中移除所有对象(你可以在Project View中右键单击,然后选择Remove All Objects)。 - 从
File菜单选择File / Open Data...。 - 从Avizo根目录加载文件
data/core/coreSample.am。 - 在数据上下文菜单中选择
Image Segmentation / Multi-Thresholding,把一个Multi-Thresholding模块附加到该数据集。 - 把
Multi-Thresholding模块的Exterior-Range1阈值端口调整为27。 - 按下
Apply按钮以创建标签图像coreSample.Labels。
Auto Skeleton模块内部使用一个Image Processing / Distance Maps / Distance Map for Skeleton,后者又内部创建一个Image Processing / Distance Maps / Distance Map模块,并采用倒角距离的默认设置。此外,Distance Map for Skeleton会为数据添加一个背景边界,这是Thinner模块所要求的。
我们将使用Image Processing / Distance Maps / Distance Map模块逐步完成这项工作。Avizo提供的其他距离图也可以以类似方式使用。
- 在数据上下文菜单中选择
Image Processing / Distance Maps / Distance Map,把一个Distance Map模块附加到coreSample.Labels。 - 把Type端口设为
Euclid距离。 - 把Region端口设为
Both (unsigned)。 - 按下
Apply按钮以创建距离图。 - 把一个
Ortho Slice模块附加到该距离图。
图 7.50:欧氏距离图模块参数。
图 7.51:距离图的可视化以及相关的项目视图。
欧氏距离可能更准确,但计算起来比倒角距离慢得多。对于大多数应用,倒角距离通常就足够好了。特别是对于本教程所用的数据,两者差别甚微。
欧氏距离图的结果是一个带浮点值的标量场。而Thinner模块要求距离图输入使用正的短整数。在当前实现中还必须额外添加一个15体素的边界。要调整距离图数据,需要以下步骤:
- 在数据上下文菜单中选择
Convert / Convert Image Type,把一个Convert Image Type模块附加到coreSample.DistField。 - 把Output Type端口设为
16-bit unsigned。 - 把Scaling端口的
scale值设为1000。这里所使用的缩放没有别的用意,只是为了在驱动Thinner算法时保留输入数据的有效数字——同时仍能容纳在一个正短整数内。实际的厚度值稍后可以从原始距离图中取回。 - 按下
Apply按钮,以创建使用正短整数的距离图数据。 - 在模块工作区中选择结果
coreSample.to-ushort。 - 单击属性区域中的
Crop Editor按钮。 - 在
Crop Editor对话框中,把Min index设为-15 -15 -15,Max index设为142 142 142。 - 取消勾选Add mode端口的
Replicate,并把Pixel value设为0。 - 按下
OK按钮:这会用一个15体素的边界来扩展图像。 - 作为
Crop Editor的替代方案,你也可以在控制台中键入命令:
1 | coreSample.to-ushort crop -15 142 -15 142 -15 142 0 |
现在我们可以使用Thinner模块了。
注意:细化算法会自动检测骨架空间图的死端分支。有一个参数用于把它们与所考虑区域界面上的噪声区分开来,以避免虚假分支。它的默认值是5,即死端长度低于5个体素的分支会被自动视为噪声并移除。把它设为10(这是一个相当大的值)会导致骨架中只剩下很少的分支。其缺点是你也可能漏掉真实的端点。一般来说,在细化过程中直接移除虚假分支,比之后再尝试移除它们要容易。
- 在
coreSample.Labels的数据上下文菜单中选择Image Processing / Skeletonization / Thinner,把一个Thinner模块附加到该标签。 - 把
Thinner模块的Distmap输入连接到coreSample.to-ushort。 - 你可以查看Extended Options以减少分支数量。使用
Auto Skeleton模块时,默认的len of ends值为2。把它的值设为5。对于大型复杂数据,你也可以通过固定所要执行的迭代次数来限制执行时间。 - 按下
Apply按钮以创建细化后的图像数据。
接下来,我们可以由该骨架构建一个空间图,并把它与几何信息一起显示出来:
- 在
coreSample.thinned上选择Image Processing / Skeletonization / Trace Lines,附加一个Trace Lines模块。 - 你可以取消勾选Options端口中的
point cloud,因为我们不需要点云。 - 按下
Apply按钮以创建一个Spatial Graph对象。 - 在数据上下文菜单中选择
Compute / Eval on Lines,把一个Eval on Lines模块附加到coreSample.Spatial-Graph。 - 把
Eval on Lines模块的Field输入端口连接到coreSample.DistField,即先前计算的浮点距离图场。Eval on Lines可以把任意标量场映射到Spatial Graph上。 - 接下来你需要在控制台中键入命令
"Eval on Lines" setZeroCorrection 0。由于ChamferMapScaleFactor未在距离图数据参数中定义,Eval on Lines会对输入值应用默认的1/3体素尺寸因子。Eval on Lines还会强制一个由zeroCorrection * voxel size定义的最小值(默认为半个体素尺寸)。 - 按下
Eval on Lines的Apply按钮。Eval on Lines模块不会创建新的数据图标。它更像是一个编辑器,会更改所连接的线集。它为线集中的每个顶点添加一个数据值,并计算该场在该顶点位置处的值。 - 把
Spatial Graph Statistics和Spatial Graph View附加到Spatial Graph,以显示3D图和统计信息,做法与”入门”一节中相同。 - 为了改善空间图的可视化,请单击
Spatial Graph View模块。把Node切换为关闭。在Segment中,把Segment Coloring端口改为thickness,并在Segment Colormap端口中单击Edit和Adjust range。
图 7.52:以空间图形式呈现的骨架可视化以及相关的项目视图。
7.5.4 大数据的骨架化
本节讨论如何在可能无法装入内存的超大数据上实现骨架化。对于接下来的教程步骤,你应当能够访问一个允许写入中间文件的目录。
7.5.4.1 使用大磁盘数据的准备工作
Auto Skeleton、Distance Map for Skeleton、Thinner、Trace Lines、Eval on Lines这些模块可以直接对磁盘上的数据进行操作,从而允许处理无法装入内存的数据。另一个距离图模块Distance Map on Disk Data也可用于对磁盘数据进行操作。
这些模块目前只支持以旧的Large Disk Data(LDD)格式读取输入和写入图像结果。要把图像数据转换为LDD,你可以使用Convert to Large Data Format——在项目视图中右键单击,然后选择File / Convert to Large Data Format即可访问。你只需在控制台中键入"Convert to Large Data Format" forceAmira311Format 1,就可以把数据转换为与骨架化模块兼容的格式。
Auto Skeleton模块和作用于磁盘数据的Thinner算法同样要求数据周围有一圈黑色边界。该边界的尺寸至少应为细化过程中所使用的len of ends(参见上文一节)。如果磁盘数据对象上未指定BorderWidth参数,系统会自动创建一个尺寸为len of ends的默认边界。Auto Skeleton模块要求磁盘数据对象指定一个数据参数BorderWidth。在磁盘数据上使用Thinner时,你可以在控制台中设置len of ends参数,例如:Thinner setVar lenOfEnds 10。这会把分支在被检测为不相连端点之前的最大长度设为10个体素。
Avizo数据集可以保存为若干独立的块(block),这对于多次采集或拆分成独立文件的大型数据集会很有用。Avizo有一个特殊的数据对象(Mosaic),用于存储指向磁盘上文件的链接、把它们在3D中排列,以及对这些块进行其他操作,例如对齐和诸如滤波或重采样之类的模板操作。
注意:目前无法把新的多分辨率LDA格式直接转换为LDD格式。一种可能的解决方案是使用Extract Subvolume提取并保存为独立的块,然后使用Mosaic把这些块转换为LDD格式。
目前,我们将简单地使用Mosaic,把它作为一种便捷手段,在把数据转换为LDD格式的同时添加骨架化过程所需的边界。关于在Avizo中使用大数据的更一般信息,请参阅第3.1.6节:处理核外数据文件(LDA)。
- 按
[CRTL+N]开始一个新的空项目。 - 从Avizo主窗口的
Project > Create Object...菜单中选择Images And Fields / Mosaic,创建一个Mosaic。
一个绿色图标出现。同时也会出现一个Bounding Box显示模块。当你选择该绿色模块时,会看到它不包含任何块(Info端口中显示0 bricks)。Info端口下方的按钮用于添加数据对象。
- 按下
add files按钮。 - 在出现的
Load文件对话框中,从Avizo根目录选择文件data/teddybear/teddybear.info。 - 按下
Load。
所选文件被添加到Mosaic中。Info端口显示已添加的单个块。你可以用一个Mosaic Outline模块来可视化块的轮廓。
- 通过右键单击
Mosaic并从上下文菜单中选择Display / Mosaic Outline,创建一个Mosaic Outline模块。 - 关闭
Bounding Box模块。 - 你可以保存该数据。
- 你可以通过单击属性面板中的
Data Parameter Editor按钮,来查看Mosaic对象所存储的信息。
图 7.53:保存数据之后Mosaic的参数编辑器。
下一步是创建一个新的Large Disk Data对象,并把块采样到它上面。对于多个块的情况,重叠区域可以相互混合。也可以添加一个边界。
注意:细化算法要求数据周围有一圈黑色边界。该边界的尺寸至少应为细化过程中所使用的len of ends(参见下文)。默认情况下,每个维度的每一侧都会有一个15体素的边界。如果你手动设置了len of ends,请务必检查这一点。
- 通过右键单击
Mosaic并从上下文菜单的子菜单中选择Convert / Mosaic to Large Disk Data,把一个Mosaic to Large Disk Data附加到该Mosaic。 - 应当选中红色的
Mosaic to Large Disk Data图标,这样模块端口才会出现在属性区域中。
你可以在属性区域中看到若干选项。默认选项对本教程来说是合适的,而边界可以设为一个更低的值。
- 你需要把Filename端口设置为输出LDD文件的路径。因此需要写入权限。如果你已把
Mosaic数据对象保存到磁盘,Filename端口中会显示一个由该mosaic文件位置推导出的默认文件名。你可能想覆盖它。 - 其他端口保留默认设置,然后按下
Apply按钮。
一个代表新Disk Data数据对象的新绿色图标会出现在Project View中。此后,各个块会被一个接一个地加载并采样。对于大数据,这可能需要一些时间。
- 选择这个新的绿色图标(名为
image)。
属性区域中会显示关于存储在磁盘上的数据的一些信息。接下来,
- 删除或关闭
Mosaic Outline模块。 - 把一个
Bounding Box连接到image图标。 - 你可以通过附加一个
Ortho Slice来直接可视化大磁盘数据image。
第二个框比Mosaic的边界框稍大一些。这是由于Mosaic to Large Disk Data模块所添加的边界造成的。
图 7.54:大磁盘数据的可视化以及相关的Project View。
7.5.4.2 使用大磁盘数据进行骨架化
有几个显示模块可用于LDD数据的可视化(请注意,LDA磁盘数据格式提供了更强大的可视化能力)。若干计算模块也能够处理大磁盘数据。它们包括阈值处理、距离图计算、细化、从体素骨架提取空间图集,以及线条厚度的计算(在线集的各点处对距离图求值)。因此,你可以直接对大磁盘数据应用骨架化。对于其他操作,你可能需要把一个子体积作为内存对象加载到工作区中,或者使用Avizo的模块进行磁盘上处理。
下一步是应用一次简单的阈值处理。
- 通过右键单击
image图标、并从弹出菜单的Image Segmentation子菜单中选择Threshold,把一个Threshold附加到该图标。 - 在属性区域中把Threshold设为
140。 - 选择一个你想用来存储结果的文件名。在本教程中,我们将使用默认名称
image.labels。 - 按下
Apply按钮。
一个包含这些标签的新绿色图标会出现。把一个Extract Subvolume模块连接到这个新数据,单击Max width、Max height和Max depth按钮,使待提取的体积适配整个体积。最后,单击Apply按钮。把一个Ortho Slice连接到所提取的体积,以可视化阈值处理的结果。
你可能想手动校正分割过程的结果。这对于填充大的血管或移除不感兴趣的部分可能有用。Avizo有一个Segmentation Editor可以完成这项任务。由于数据规模的原因,你将不得不在整个数据集的子块上工作。
在下一步中,我们将在磁盘数据上使用Auto Skeleton。
- 把一个
Auto Skeleton模块附加到image.labels。 - 在这一步,你可以修改所创建的中间数据文件和结果数据文件的位置。
- 按下
Apply按钮。 - 移动并调整这两个
Ortho Slice模块的方向,以获得图7.55的效果。
图 7.55:LDD骨架的可视化以及相关的项目视图。
你也可以逐步实现骨架化:用Distance Map for Skeleton或Distance Map on Disk Data模块计算距离图,然后手动使用Thinner、Trace Lines和Eval on Lines,方式与处理内存数据类似。
这里有一个展示骨架化的示例,它使用了一个可以附加到任何标签图像的脚本对象模块:”Porosity network reconstructed”(孔隙网络重建),位于demo/core/coreSkeleton.hx,可以从Examples帮助菜单中访问(在Rock Core Sample Analysis演示中)。
