Avizo用户使用手册-4
[TOC]
Chapter 4
第4章 教程:高级图像处理、分割和分析
本章的教程需要Avizo许可证(Avizo Lite Edition许可证不足以支持这些功能)。
- 开始使用高级图像处理和定量分析 - 使用Avizo进行图像处理和分析的基础知识
- 示例:
- 测量催化剂 - 遮罩和距离图
- 分离、测量和重建 - 分水岭分离
- 泡沫中孔径的分布 - 自定义测量
- 泡沫中材料的平均厚度 - 分离厚度
- 高级分割 - 使用分割编辑器或向导进行分水岭分割
- 更多关于图像滤波 - 减少图像噪声或伪影或增强感兴趣的特征
- 更多关于标签测量 - 管理几组测量
4.1 开始使用高级图像处理和定量分析
在这个逐步教程中,您将学习使用Avizo进行图像处理和分析的基础知识。下面使用的示例可以轻松扩展到其他应用,并遵循典型的图像分析工作流程:
- 图像增强
- 特征提取
- 数据测量和分析
本节包含以下部分:
- 处理灰度图像
- 3D与2D堆栈解释
- 灰度图像的二值化
- 分离
- 分析和测量
- 交互式选择
- 测量过滤器
- 筛选
- 标签图像
- 在内存中(在核心)和磁盘上(核心外)处理图像
- 脚本编写
您应该熟悉Avizo的基本概念才能学习本教程。特别是,您应该能够加载文件,与3D查看器交互,以及将模块连接到数据模块。所有这些问题都在Avizo第2章 - 入门中讨论。对于Avizo的日常使用,您可能会受益于熟悉Avizo的图像滤波和分割(参见第3章 - 图像和体积可视化和处理)。
4.1.1 处理图像
首先,您需要:
- 在Avizo中加载3D微断层扫描体积数据data/images/foam/foam.am,该文件位于AVIZO_ROOT目录中。数据对象将出现在项目视图中。
- 如果自动显示被禁用,请附加一个正交切片(Ortho Slice)模块来可视化数据。为此,右键单击绿色数据图标。在对象弹出菜单中,选择名为Display的类别条目,然后双击Ortho Slice条目(或单击Create)。您也可以使用搜索字段并键入Ortho Slice的前几个字母,然后在列表中选择该模块将自动在项目视图中创建它。
- 附加另外两个正交切片模块。在第二个正交切片的属性面板中,选择xz方向,在第三个正交切片的属性面板中选择yz方向。参见图4.1中的结果显示。
加载项目data/tutorials/image-processing-advanced/GettingStartedBasics-1-LoadData.hx将完成上述步骤。
改善图像质量通常是必要的,以便使用图像分析获得最佳结果。下一步说明如何在Avizo中使用常用于平滑或降噪的图像滤波器处理图像。您可以在教程第4.8节 - 更多关于图像滤波中了解更多关于图像滤波器的信息。
- 将中值滤波(Median Filter)模块附加到数据上。(使用搜索字段并输入Median Filter的前几个字母,然后在列表中选择该模块。)
- 在中值滤波的Interpretation(解释)端口中选择3D。
- 按Apply按钮。
计算完成后,结果存储在新的图像对象foam.filtered中(参见图4.2)。
- 将三个正交切片附加到结果图像上。为此,更改每个切片属性面板中的Data。参见图4.3中的结果显示。
加载项目data/tutorials/image-processing-advanced/GettingStartedBasics-2-ImageProcessing.hx将完成上述步骤。
4.1.2 解释为3D图像或2D图像堆栈
有时,将图像处理算法的输入数据解释为3D体积或2D平面序列可能很有用。例如,许多图像滤波器和图像处理算法可以在体积的每个XY切片上使用2D内核执行,也可以在整个体积上使用3D内核执行。在某些情况下,可能更喜欢使用2D算法,无论是出于性能考虑还是根据数据和所需结果更合适。
在许多Avizo模块中,解释(Interpretation)端口显示当前模块的状态(即XY平面或3D)。如果端口状态为XY平面,则表示该模块将在每个XY切片上执行。如果端口状态为3D,则表示该模块将一次在整个三维图像上执行。
在某些情况下,无法更改解释端口(它是灰色的),例如,当处理只能应用于XY平面时。
4.1.3 获取更多帮助
在模块的属性面板中按问号按钮 ? 可以显示模块帮助。此帮助可能根据解释模式或模块中选择的处理类型而有所不同。
4.1.4 二值化
二值化意味着将灰度图像转换为二值图像(即仅包含内部和外部材料的标签图像)。当灰度图像中的相关信息对应于特定的灰度级间隔时,使用阈值二值化。阈值处理是一种简单的分割方法 - Avizo中还提供了更复杂的自动、半自动或手动分割工具。可以使用交互式阈值(Interactive Thresholding)模块进行阈值二值化,该模块提示您设置级别并提供视觉反馈。
- 将交互式阈值模块附加到过滤后的数据上。
您可以交互式地修改阈值,并在2D或3D中立即获得视觉反馈。选定的像素以蓝色显示在显示的图像中。
- 在模块的属性面板中,您可以将阈值设置为0-30的范围。
- 在Preview Type(预览类型)端口中勾选和取消勾选3D选项,以获得仅2D或3D预览(参见图4.4和图4.5)。
- 按Apply按钮启动模块。
输出二值图像foam.thresholded在项目视图中生成(参见图4.6)。
在输出二值图像中,所有像素的初始灰度值在两个边界之间的都设置为1,所有其他像素都设置为0。
交互式阈值模块创建了一个二值图像。对于二值图像,Avizo以蓝色显示强度为1的体素。如果将正交切片附加到结果图像,则默认选择适当的颜色图。
- 通过切换项目视图中模块图标上的橙色可见性按钮或属性面板中模块名称旁边的按钮,隐藏交互式阈值预览。
- 将第一个正交切片连接到阈值化数据。参见图4.7中的结果显示。
加载项目data/tutorials/image-processing-advanced/GettingStartedBasics-3-Binarization.hx将完成上述步骤。
4.1.5 更多关于二值图像
在二值图像中,所有满足某些条件的像素(这里的条件是像素强度在交互式阈值中设置的两个边界内)都设置为1(感兴趣的像素),所有其他像素都设置为0(背景)。Avizo中的二值图像没有特定类型,二值图像只是具有一个标签的标签图像(每个体素8/16/32位,值为1;外部值为0)。但是,某些Avizo模块可能明确要求二值图像作为输入数据。
4.1.6 更多关于二值化的提示
(本节是可选的,不需要阅读即可完成后续教程。)
Avizo提供了广泛的工具,用于有效的数据二值化和图像分割。在许多情况下,该过程可以自动化,可能需要结合多个步骤,有时需要用户输入。在某些情况下,可能有必要或更容易进行半自动或手动分割:特别是,Avizo分割编辑器(Segmentation Editor)专为此目的而设计(请注意,分割编辑器仅支持8位标签图像)。还要记住,改善图像采集可能比分析糟糕的图像要容易得多。
以下是一些可以促进自动二值化的Avizo模块:
- 自动阈值(Auto Thresholding)自动计算阈值。您可以选择最适合您数据的标准,通常是分解(factorisation)。
- 交互式顶帽(Interactive Top-Hat)是一个强大的工具,用于分割具有非均匀背景的区域,当简单阈值处理无法捕获所需特征而不产生不需要的噪声时。顶帽变换可以看作是”局部阈值处理”。顶帽结果通常与使用逻辑操作OR Image的阈值结果结合使用。
- 滞后阈值(Hysteresis Thresholding)用于在定义安全保留区域和拒绝区域的低阈值和高阈值之间实现中间二值化。例如,您可以使用交互式阈值界面交互式选择阈值,然后使用滞后阈值。另请参阅Canny边缘检测器模块。
- 许多图像滤波器(如梯度或拉普拉斯)可用于帮助二值化,例如用于边缘检测。
- 基于测量过滤区域(如本教程后面所示)也可以是分割的强大技术。
二值化后,可能需要分离一些对象,如下一节所示。
4.1.7 分离
在示例数据集中,泡沫中的一些孔似乎相互接触,但理想情况下,应该为了适当的分析而分离它们。当采集数据太粗糙或有噪声时,阈值处理无法避免这种类型的输出,因为考虑的对象的灰度级在整个体积中不够均匀,或者分辨率太低,无法区分一些对象的边界。您可以使用分离对象(Separate Objects)模块来分离连接的粒子。
- 将分离对象模块附加到阈值化数据。
- 将Marker Extent(标记范围)端口值设置为1,而不是默认值4。这是一个对比度因子,用于控制标记对象要分离的种子的大小。增加此值可以合并一些标记,从而减少分离的对象数量。
- 然后按Apply按钮。foam.separate数据在项目视图中生成。
- 将第一个正交切片附加到新数据。参见图4.8中的结果显示。
分离对象模块的原理是在距离图上计算分水岭线。分离对象模块是分水岭、距离图和H-Maxima的高级组合。它可以用作简单直接的分离工具,在许多情况下令人满意。但是,您可能会注意到,某些分离可能缺失或不需要,特别是对于非凸形状(也考虑3D)。有关更多详细信息和高级分离,请参见示例2:分离、测量和重建单个对象 - 泡沫中的孔隙。
Loading the project data/tutorials/image-processing-advanced/GettingStartedBasics-4-Separation.hx will complete the steps above.
4.1.8 分析
然后,您可以使用分析模块来获取每个分离粒子的体积、表面积、平均值、体素数等。这种对图像堆栈的分析是使用标签分析(Label Analysis)模块来提取统计和数值信息,包括对象的测量。
- 将标签分析模块附加到分离数据。
- 在模块的专用端口中将foam.am设置为强度图像(Intensity Image)。
- 按Apply按钮。
项目视图中创建了一个新的标签图像数据对象foam.label,并显示了表格面板,以电子表格样式显示结果:分析foam.Label-Analysis,也在项目视图中创建(参见图4.9和图4.10)。
工具栏提供了以下功能:
(图4.10从左到右的图标)
- 复制表格的部分内容
- 以多种格式导出电子表格
- 按升序或降序对列进行排序
- 绘制与测量相对应的直方图(见下文)
- 进行标签搜索(见下文4.1.9节 - 交互式选择)。
基本测量(如在模块的Measures端口中选择的)显示在表格面板中,如下所示(Volume3d、Area3D等)。
- 在下方电子表格中选择Volume3d列。
- 按工具栏中的直方图按钮(参见图4.11)。
打开一个窗口,显示Volume3d直方图,如图4.12所示。
在Measures端口中,basic是一组包含最常用测量的组:Volume3d、Area3d、BaryCenterX、BaryCenterY、BaryCenterZ和Mean。可以定义新的测量组,由预定义的测量组成,也可以包含用户定义的测量。要了解更多关于这个主题的信息,请参阅第4.5章 - 进一步图像分析中的专门教程。
注意:默认情况下,如果禁用Avizo的单位管理,结果将以”pixel”或”voxel”作为单位显示。您可以启用Avizo的单位管理以显示带单位的数据和测量。请参阅第8.2.9章 - Avizo中的单位,了解有关如何在Avizo中使用单位管理的所有详细信息。
加载项目data/tutorials/image-processing-advanced/GettingStartedBasics-5-Analysis.hx将完成上述步骤。
4.1.9 交互式选择
Avizo允许您将3D查看器中的图像与分析面板中的相应行链接,以便找到具有相应测量的各个对象。
- 单击分析面板工具栏中的标签搜索按钮(参见图4.13)。自动将新的正交切片附加到分离图像并显示在3D查看器中,以及一个点拖动器(参见图4.14)。
- 选择分析下表中的一个单元格。点拖动器将移动到3D视图中相应对象的位置。如果显示了一个分析测量的直方图,则会出现一条垂直线,显示所选行的位置和值,如图4.15所示。
- 在查看器窗口中,您可以使用矩形手柄移动拖动器,然后在释放按钮时,分析表将突出显示相应的对象行。要移动拖动器,您必须将查看器设置为交互模式(按ESC键)。然后将鼠标移到拖动器的一个十字线上并按下鼠标左键。拾取的十字线的颜色会改变。拖动器的移动限制在相应的平面内。
- 您还可以在3D查看器中显示的场景中用鼠标中键单击可拾取的对象,例如,在显示的切片上的特定孔上:拖动器将移动到拾取的点,相应的电子表格行也将被突出显示。
4.1.10 基于测量的过滤
您可以过滤3D查看器中显示的粒子。例如,您可以决定仅可视化Volume3d属于指定范围的粒子。
- 将分析过滤器(Analysis Filter)附加到foam.Label-Analysis。
- 将Image端口连接到foam.label。
- 通过在Filter端口中输入Volume3d >= 30000来创建新过滤器(参见图4.16)。要在公式中插入Volume3d,您可以键入它或双击下面显示的列表中的它。
- 按Apply按钮。
这将创建一个包含较少对象的新分析。
- 您可以通过将正交切片连接到新标签图像foam.label-filtering来验证创建的对象是否较少,如图4.17所示。
提示:由测量驱动的过滤可以成为数据分割的强大工具。它允许您基于例如大小、形状因子、方向或几个标准的组合来选择或消除区域。
加载项目data/tutorials/image-processing-advanced/GettingStartedBasics-6-FilterAnalysis.hx将完成上述步骤。
4.1.11 使用筛子对测量进行分类
您可以定义一组值范围,然后可以用于使用此分布显示直方图,或用于创建显示分类的新标签图像。
- 将筛子过滤器(Sieve Filter)附加到foam.Label-Analysis。
- 将Data端口连接到foam.label。
- 通过将Number of values更改为4来添加一个值。
- 通过编辑或移动直方图中的相应标记来修改建议的值。您也可以按Detect按钮获取常规间隔(参见图4.18)。
- 按Apply按钮。创建了一个新的标签图像foam.Sieved。
- 使用体积渲染(Volume Rendering)模块显示标签图像,如图4.19所示。
加载项目data/tutorials/image-processing-advanced/GettingStartedBasics-7-SieveAnalysis.hx将完成上述步骤。
4.1.12 标签图像
- 隐藏体积渲染
- 将第一个正交切片附加到标签图像foam.label。
在与结果电子表格一起创建的标签图像中,每个粒子都已被识别并分配了唯一的索引。在这种情况下,标签数据存储为16位标签图像。默认情况下,使用循环颜色图显示此类图像,以使相邻的粒子更可能以不同的颜色显示,如图4.20所示。
在这种情况下,必须将每个体素16位的标签图像转换为每个体素8位的标签图像。
注意:来自分割编辑器和多阈值模块的Avizo标签图像是每个体素8位的标签图像。
4.1.13 在磁盘上处理数据
在某些情况下,您可能决定使用Visilog 6 (.im6)数据格式,以便在打开数据文件时能够”将数据保留在磁盘上”,而不是将数据完全加载到内存中。这样,一些Avizo模块可以逐片加载和处理图像数据(核心外),避免需要将完整数据加载到内存中(核心内)。这允许处理比系统上可用内存大得多的数据,但代价是处理时间。
默认情况下,模块输出将以与模块输入相同的方式创建。因此,为了完全在磁盘上处理数据(输入和输出),您需要在打开输入数据时选择Stay on disk。
除了Visilog 6格式文件外,您还可以对其他数据格式(如.lda)使用Stay on disk。您还可以将未压缩的Avizo文件、原始文件作为大磁盘数据加载。
4.1.14 脚本编写
可以将完整的处理序列放入脚本中,以自动化进行常规任务的分析。有关使用Avizo进行脚本编写的详细信息,请参见第4.4章 - 示例3:分离、测量和重建。
4.1.15 结论
本教程向您介绍了:
- Avizo界面模块和帮助菜单,
- 灰度图像处理模块,
- 二值图像处理模块,
- 用于存储索引(分段)图像的标签图像,
- 3D与2D堆栈处理模块,
- 内核内与核心外处理,
- 如何计算测量分析,
- 使用过滤器来减少分段数据,
- 使用筛子来解释您的测量,
- 脚本编写。
这些概念可以以无数种方式扩展以应对新的挑战。尝试将您的图像处理问题与这个简单的工作流程联系起来:
- 图像处理使数据更容易进行二值化,
- 通过阈值处理或顶帽等工具进行二值化(有时结合两种技术),
- 标记以索引所有断开连接的对象,
- 测量所有索引对象的关键属性,
- 通过视觉检查以及过滤或筛选来分析测量数据。
这个介绍突出显示了如何使用Avizo执行复杂的3D数据分割和分析,但除了此处介绍的内容外,还有许多其他处理操作和测量。
Avizo为您提供了这个广泛的工具包,以便您可以将适当的工具映射到面临的任何处理挑战。
4.2 细胞分析教程
在生物医学成像中,有时需要测量和量化多个对象,如细胞、囊泡或斑点。本教程展示了如何利用Avizo扩展模块来执行对象的自动分割、分离聚集项目,并提取定量信息,包括它们的形状。本教程将涵盖以下主题:
- 创建对象(细胞体)的二值分割
- 分离聚集细胞并单独标记它们
- 获取细胞的数量、大小和位置
- 测量细胞密度
- 提取细胞的形状参数
- 根据形状参数过滤标签图像,重建并将过滤后的标签图像可视化为表面模型
4.2.0.1 可视化数据并创建二值图像
- 加载AVIZO_ROOT目录中的data/tutorials/multicomp/cellbodies.am。
- 如果自动显示被禁用,请将Ortho Slice模块附加到cellbodies.am对象。
- 使用Slice Number端口浏览切片,或在查看器中使用交互模式。
我们看到一些明亮的球状结构嵌入在黑暗背景中。这些明亮的结构是大鼠皮层神经元的细胞体(胞体)。这些神经元已用选择性荧光染料染色,并用共聚焦显微镜成像。数据由Max Planck Florida Institute的Marcel Oberlaender和Bernd Sakmann提供。
第一步,我们需要将3D图像数据分割成前景(细胞体)和背景体素的二值分割。通常这是通过阈值处理完成的。然而,简单阈值的缺点是,如果选择的阈值灰度值太低,不需要的背景信号会被分配到前景。另一方面,如果阈值选择得太高,可能会错过染色较浅的细胞。我们使用一个模块来解决这个问题,该模块使用两个阈值值,一个用于检测亮区域,另一个用于将这些区域扩展到达到较低阈值。
- 将Hysteresis Thresholding模块连接到cellbodies.am。
- 在Thresholds (Low/High)文本字段中输入70和112。单击Apply。
- 将Color Wash添加到Ortho Slice。在Color Wash中选择Fusion Method: Weighted Sum,将Data端口连接到cellbodies.binary,并将Weight Factor端口设置为0.7。
使用带有Ortho Slice的Color Wash模块可以快速查看分割的内容。您可以通过移动Color Wash模块的Alpha滑块在灰度值和标签之间进行混合。在浏览切片时,我们注意到一些细胞体内部有小的未分割区域。为了填充这些孔洞,我们将使用以下操作序列:
- 将Dilation连接到cellbodies.binary。将Size[px]设置为1,单击Apply。
- 将Fill Holes连接到cellbodies.dilated。将Interpretation设置为3D,单击Apply。
- 将Erosion连接到cellbodies.filled。将Size[px]设置为1,单击Apply。
膨胀(扩大)Dilation (Grow)- 填充Filling - 腐蚀(缩小)Erosion (Shrink)的形态学操作序列对于关闭和填充不完全标记的对象很有用。如果必要,可以增加膨胀(扩大)(grow)的次数,在这种情况下,腐蚀(缩小)(shrink) 的次数也必须增加相同的数量。使用Dilation和Erosion模块中的Size[px]端口来实现这一点。
4.2.0.2 分离细胞簇并标记
我们注意到,在细胞密集排列的情况下,有些细胞被分割成一个单一的块。此外,我们无法区分单个细胞,因为它们都属于同一材料。因此,下一步我们需要分离聚集的细胞体并单独标记它们。这里我们展示如何使用距离图的分水岭变换来完成这个任务。
为了使分水岭变换工作,需要一个在强度域中具有”凹谷”、”山脊”和”鞍部”的图像。我们可以通过计算标签对象的反转距离图来实现这一点。在距离图中,每个体素的值表示到区域边界的最近距离。反转这样的图会产生一个图像,其中边界体素具有高强度,因此形成”山脊”,而中心体素变得越来越暗,因此构成”凹谷”。
- 将Distance Map模块连接到cellbodies.eroded对象,在Chamfer Weights端口中启用float选项,然后单击Apply。
- 将Arithmetic附加到cellbodies.DistField对象,在Expr.文本字段中输入-A + 6.82,然后单击Apply。
从最大值(根据距离变换的Info端口推断)中减去所有体素值会反转数据,最小值为零。
- 将Hierarchical Watershed附加到Arithmetic模块的结果。在Input threshold端口中输入0.5的值,在Minimal depth端口中输入1.75的值。单击Apply。
- 为了查看结果,重新将Color Wash的Data连接端口与Hierarchical Watershed的Result.regions图标连接,将Colormap端口中的颜色图更改为labelcolors.am。
找到Input Threshold和Minimal Depth的好值通常需要一些实验。使用特定阈值进行的第一次计算将需要一些时间,这取决于图像的复杂性。随后使用不同的Minimal depth值重新计算会快得多。当使用这些值时,您会注意到,随着Minimal depth的增加,越来越多的相邻细胞融合成单个区域。相反,减少Minimal depth倾向于过度分割对象。对于这个数据集,0.5(阈值)和1.8(深度)的值是一个很好的折中方案。(加载项目)
4.2.0.3 从标记图像中提取定量测量 获取细胞体的数量、大小和位置
分析的第一部分旨在获取细胞体的数量、大小和位置。
- 将Material Statistics连接到Result.regions对象,将该对象的Field连接端口与cellbodies.am连接,然后单击Apply。
- 选择新创建的Result.Regions.MaterialStatistics对象,然后单击Show按钮。
测量细胞密度
计算出对象的位置后,我们可以问:细胞的局部密度是多少?Point Cloud Density模块可以测量点云中元素的局部密度。但是,这需要将细胞的位置表示为Point Cloud对象的顶点。
- 将Spreadsheet To Point Cloud模块连接到电子表格对象,然后单击Apply。
- 要可视化点云对象,请将Point Cloud View模块连接到它。在Colormap端口中配置labelcolors.am颜色图,打开plates选项,并将Sphere scale设置为-0.5。
现在我们有了点云对象,我们可以计算其密度,即每单位体积有多少细胞。
- 将Point Cloud Density模块连接到*.Cloud对象。单击Apply。
- 通过将Point Cloud View模块重新连接到*.Density对象来可视化结果点云对象。在Colormap端口中选择physics.icol,并在Color下拉菜单中选择Density [d]项。
(加载项目)
绘制染色强度的直方图
细胞中的平均染色强度分布是什么?要回答这个问题,我们使用Material Statistics模块的输出。
- 右键单击*.MaterialStatistics对象,并从Histogram中选择。
- 在Histogram的Properties中进行以下设置:Data Channel: Mean,取消选中Plot options端口的logarithmic,Number of bins: 60。最后,按Range端口中的Reset按钮更新直方图的范围。
- 单击Apply。
从标记区域提取形状信息及其可视化
虽然Material Statistics为我们提供了有关细胞的基本信息,但以下分析旨在获取对象形状的信息。Avizo扩展提供了一个强大的标签分析模块,可以为每个区域提取椭球体的参数。这些参数以及每个对象的派生测量(如伸长度、扁平度和各向异性)将被写入电子表格对象。
此时,建议清除Avizo项目视图(Project/Remove All Objects)并加载项目data/tutorials/multicomp/ShapeAnalysis-start.hx。本教程的其余部分假设您这样做了。当然,您也可以继续使用当前结果。在这种情况下,文本中提到的数据对象名称可能会有所不同。
- 将Label Analysis连接到cellbodies.labeledRegions.am。
- 在Measures端口中选择Standard Shape Analysis项,然后单击Apply。
- 右键单击输出(*.Label-Analysis)对象,并选择Spreadsheet To Point Cloud条目。
- 在Spreadsheet To Point Cloud模块中,在Output端口中选中Bounding Boxes选项,将Value端口设置为EigenVal1,并在Tensor端口中选择Fill Bounding Boxes按钮。单击Apply。
- 右键单击cellbodies.labeledRegions.Cloud并选择Tensor View模块。在Tensor View中,取消选中Scale by value端口中的FA选项。设置physics.icol颜色图,范围为0..1。单击Apply。
- 为了可视化边界框,将Line Set View模块附加到cellbodies.labeledRegions.BoundingBoxes对象。
(加载项目)
根据标签测量参数过滤标记区域
- 重新加载项目data/tutorials/multicomp/ShapeAnalysis-start.hx
- 将Label Analysis模块连接到cellbodies.labeledRegions.am。
- 在Measures端口中选择Standard Shape Analysis项,然后单击Apply。
- 将Analysis Filter模块连接到 X.Label-Analysis对象。
- 在Analysis Filter的Properties中,在Filter端口的expression字段中输入Volume3d > 300。
- 单击Apply创建两个新的数据集,X.Analysis-Filter是仅包含符合表达式的项目的电子表格,X.label-filtering是相应的标签字段。
这样,我们从原始标签字段中提取了所有大于300(立方微米)的对象。
在上面的分析中,结果可能会因许多项目没有完全成像而产生偏差,因为它们延伸到图像体积的外部。为了解决这个问题,我们想要移除体积中与边界框相交的所有对象。为此,我们通过另一个条件扩展我们的表达式。我们首先在表达式文本字段中输入&&(逻辑AND)。我们在测量列表中向下滚动以找到BorderVoxelCount项,并双击它。最后,我们在字段中输入< 10,使完整的表达式现在读作Volume3D > 300 && BorderVoxelCount < 10。提示:为了加快编写表达式的速度,您可以双击左侧测量列表中的项目。此外,要找到适当的数值,您可以用鼠标左键拖动绘图窗口中的红线。双击该线会在表达式字段的光标位置打印当前值。
过滤后的对象看起来如何,它们在体积内的位置在哪里?要回答这个问题,我们从过滤后的标签字段创建表面模型。
- 右键单击cellbodies.labeledRegions.label-filtering图标,选择Generate Surface,然后单击Apply。
- 将Surface View连接到cellbodies.labeldRegions.surf对象。
分析过滤器模块的用户界面。该模块提供了一个文本字段,允许输入过滤器表达式。
可用的度量列在左侧的框中,选择后,右侧的绘图窗口中将显示度量的直方图。绘图中的红线可以沿着绘图的纵坐标拖动,相应的计数值显示在值 = 字段中。双击红线会在当前光标位置打印当前值。
自动更新不同过滤表达式的显示
为了快速查看不同的过滤表达式,可以配置项目以在更改过滤表达式时自动更新。
- 在项目视图中选择Analysis Filter,并在Properties区域底部选中auto-refresh
- 在项目视图中选择Generate Surface,并在Properties区域底部选中auto-refresh
现在,每次更改过滤表达式时,都会触发表面模型的重新计算。这允许您快速查看过滤设置。
(加载项目)
4.3 示例1:测量催化剂
本教程演示了使用Avizo的更多技术:
- 使用遮罩来隔离感兴趣的对象。
- 使用距离图。
- 使用图像算术和分布直方图。
要学习本教程,您应该已经阅读了第一个教程章节4.1 - 开始使用高级图像处理和定量分析,并且熟悉Avizo的基本操作。
显示模块的可见性可以通过常规方式在Avizo中管理,方法是单击项目视图中可见的图标上的橙色方块按钮,或在属性面板中模块标题旁边的按钮。有关项目视图的详细信息,请参见第8.1.9章。
本示例中使用的3D图像是通过微断层扫描获得的:一个几乎球形的支撑体包含催化剂和孔隙。催化剂在图像中显示为暗色水平(低强度体素)。孔隙和背景显示为亮色水平(高强度体素)。中间的灰度水平对应于支撑体。
本示例的目标是获得催化剂体素与背景(外部)之间距离的分布。这里的一个困难是外部强度与孔隙内部的强度非常接近或相同,这阻止了使用简单的阈值处理来隔离外部。此外,一些孔隙与外部相连,这阻止了使用”洪水填充flood fill”方法,如分割编辑器的魔棒工具,或从标记重建模块。
注意:在本教程中,您将了解如何管理任意感兴趣区域。另一个类似问题的常见示例是从核心外部隔离岩石核心样品的孔隙空间,例如,为了计算岩石孔隙度。
该过程分为几个步骤/部分,描述了逐步测量工作流程:
- 对象检测和遮罩
- 更多关于感兴趣区域和遮罩
- 使用距离图
- 更多关于距离图
- 测量分布
4.3.1 对象检测和遮罩
- 首先加载AVIZO_ROOT目录中的data/tutorials/image-processing-advanced/Catalyst.am。
- 如果自动显示被禁用,请将Ortho Slice模块附加到项目视图中的Catalyst.am图像图标以显示此图像。
加载项目data/tutorials/image-processing-advanced/CatalystDistribution-1-LoadData.hx将完成此教程步骤(参见图4.30)。
现在,您可以开始使用本示例中用于对象检测的第一步:阈值处理,然后关闭以”填充”对象并准备遮罩。下一节将提供更多关于创建遮罩和任意感兴趣区域的可能方法的提示。
阈值处理Thresholding
- 将Interactive Thresholding模块附加到Catalyst.am模块。
要搜索适当的阈值,您可以直接更改Threshold端口。根据Preview Type端口,2D或3D预览将交互式渲染。记得通过更改Preview Slice Number和Preview Orientation端口来检查整个体积。其他Avizo模块也可能对此任务有帮助(参见第3.2节可视化3D图像)。
在这里,将图像阈值设置在0到225之间(参见图4.31)会得到一个二值图像,其中:
- 强度级别 = 1 -> 支撑体或催化剂(材料),
- 强度级别 = 0 -> 孔隙或外部背景。
应用Interactive Thresholding模块将创建一个二值图像(仅包含内部和外部材料的图像标签),如下所述:
- 在项目视图中选择Interactive Thresholding模块,然后使用此端口的滑块手柄或文本区域将Threshold值更改为0-225范围。
- 通过拖动此端口的滑块,将Preview Slice Number端口更改为45。
- 按Apply按钮开始处理。
- 在Preview Type端口中选中3D以获得3D预览,取消选中3D以撤消此预览。
- 将当前链接到Catalyst.am的Ortho Slice附加到结果图像,方法是单击并将Ortho Slice的链接拖到Catalyst.thresholded;默认情况下将选择适当的颜色图。
- 通过单击项目视图中此模块的橙色方块来隐藏Interactive Thresholding预览。
加载项目CatalystDistribution-2-InteractiveThresholding.hx将完成此教程步骤(参见图4.32)。
形态学:闭合对象Morphological: Closing object
为了检测对象形状,您现在可以应用形态学模块。数学形态学模块是基于形状和大小标准的变换。
应用于二值图像的形态学Closing模块会生成另一个二值图像,其中:
- 对象内部的小孔被填充,
- 对象边界被平滑,
- 靠近的对象被连接。
Closing模块实际上对二值化区域进行膨胀,然后进行腐蚀:直观地说,膨胀填充孔洞并重新连接分离的区域,然后腐蚀恢复原始外部形状。
以下是填充对象孔隙的步骤:
- 将Closing模块附加到Catalyst.thresholded。
- 为了填充对象内部的任何孔洞,您必须将Size端口设置为6(结构元素的大小)。可以通过几次尝试找到这样的特定值,并通过滑动Ortho Slice检查整个体积。
- 然后按Apply按钮创建结果二值图像。
- 将已有的Ortho Slice附加到Catalyst.closing。
加载项目CatalystDistribution-3-Closing.hx将完成此教程步骤(参见图4.34)。
注意:您可能注意到上图右侧的伪影是由于太靠近图像边缘的膨胀造成的。为了防止这种情况,对象周围的背景边框应该比闭合的大小更大。这可以通过使用图像Crop Editor轻松解决:在此示例中,您可以设置Adjust为10,然后取消选中Add模式的Replicate,并将Pixel value设置为背景强度(即0);然后按Enlarge按钮将添加10个体素的边框。但是,在本教程中,您可以忽略此扩展步骤。
4.3.2 更多关于感兴趣区域和遮罩
通常需要或有用的是将测量或处理限制在数据的子集中。
如果子集是轴对齐的盒子,您可以使用以下工具:
- 许多模块支持感兴趣区域(ROI)输入。您可以将ROI Box模块附加到数据,然后将显示或计算模块的ROI输入连接到ROI Box模块。
- 图像Crop Editor可以剪切或扩展您的数据。
- Extract Subvolume模块将数据的一部分复制到内存中,可能会进行子采样。
如果您需要任意遮罩或感兴趣区域 - 例如圆柱形ROI,您可以使用以下工具:
- 可以使用每个二值图像弹出菜单中排序到Image Processing/Image Morphology的许多模块来创建或组合遮罩,如上所示。其他示例包括Convex Hull(逐片应用),Fill Holes,Reconstruction From Markers。
- Volume Edit模块用于使用交互式工具(如圆柱体)修改体积。它也可以通过脚本使用。
- Segmentation Editor有许多有用的工具,可以快速创建遮罩,如刷子、形状套索、Selection/Interpolate。
4.3.3 使用距离图
第二步是计算催化剂的距离图。下一节提供了有关距离图的更多提示。
将距离图算法应用于二值图像会生成一个灰度图像,其中每个体素强度表示与对象边界的最小距离(以体素为单位)。对于给定的对象距离图体素强度:
- 强度级别 = 0 -> 背景
- 强度级别 = 1 -> 对象包络
- 其他低级强度 -> 靠近对象包络的对象部分
- 其他高级强度 -> 远离对象包络的对象部分
现在,您可以按以下步骤创建此距离图:
- 将新的Chamfer Distance Map模块附加到Catalyst.closing。
- 将Interpretation设置为3D并单击Apply。
- 将新的Ortho Slice附加到结果(Catalyst.distmap)以查看对象的距离图。
加载项目CatalystDistribution-4-DistanceMap.hx将完成此教程步骤(参见图4.35)。
遮罩Masking
- 将Interactive Thresholding模块应用于初始图像Catalyst.am。
- 将阈值设置在0到100之间,然后单击Apply。
这会生成一个二值图像(Catalyst2.thresholded),其中:
- 强度级别 = 1 -> 催化剂,
- 强度级别 = 0 -> 支撑体、孔隙或背景。
加载项目CatalystDistribution-5-InteractiveThresholding.hx将完成此教程步骤(参见图4.36)。
遮罩将用于计算催化剂的受限距离图。遮罩操作将灰度图像作为第一个输入,将二值图像作为第二个输入(遮罩图像),并提供一个灰度图像作为输出,其中:
- 遮罩图像中的每个黑色体素在输出图像中设置为0,
- 遮罩图像中的每个蓝色体素在输出图像中设置为来自灰度图像的初始级别。
用催化剂图像遮罩距离图图像会生成一个灰度图像,其中:
- 每个非零强度代表催化剂的一个体素,
- 强度值等于与对象包络的距离(以体素为单位)。
您可以按以下步骤创建这样的遮罩:
- 应用Mask模块:第一个输入是Catalyst.distmap(距离图图像),第二个输入是先前获得的催化剂二值图像Catalyst2.thresholded。
- 将新的Ortho Slice附加到结果以查看对象的距离图。为了获得更好的渲染,您可以将Ortho Slice的颜色图范围映射到Catalyst.masked的全范围:在Colormap端口中将min-max设置为0…93。
加载项目CatalystDistribution-6-Masking.hx将完成此教程步骤(参见图4.37)。
4.3.4 更多关于距离图
距离图(也称为距离变换)是许多图像处理技术的强大工具。计算的距离可能是离散近似(chamfer图)以加快计算速度。Avizo提供了几种版本的距离图,您可以根据具体用途进行检查。
大多数可用的距离模块都可以在对象弹出菜单中的Image Processing子类别中找到:
- Chessboard Distance Map(2D/3D棋盘)
- 2D/3D Chamfer Distance Map(棋盘和对角线)
- Geodesic Distance Map(基于遮罩隐藏特定部分)
- 2D/3D Closest Boundary Points
- 作为特殊情况,Propagation Distance和相关模块在Image Processing/Image Morphology组中
- Distance Map,使用chamfer或欧几里德距离
- Image Processing/Distance Maps/Distance Map For Skeleton。有关距离图和3D骨架化的更多详细信息,请参见第5.7章骨架化用户指南。
- Image Processing/Distance Maps/Distance Map On Disk Data,只能在legacy LDD磁盘数据上操作。
- Propagation Distance(浏览体素距离)在模块弹出菜单的Image Processing/Image Morphology子类别中引用。
4.3.5 测量分布
您计算了基于体素单位测量距离的chamfer图。为了获得一致的结果,您必须考虑体素校准:将距离图像乘以体素大小将图像强度转换为公制系统(微米)。
Image Processing/Arithmetics Operations模块组可用于两个图像之间或图像与常数之间的操作。
提示:Arithmetic模块还提供了一种灵活的方式来对图像进行计算。
现在您可以获得距离的分布:
- 使用Multiply By Value,将Catalyst.masked作为第一个输入(Input Image 1端口)。将Value端口设置为5(假设体素大小为5微米)。
- 单击Apply以获得Catalyst.mult作为结果。
- 通过在项目视图中选择图像图标时显示的Info端口检索最大值。
- 将Histogram模块附加到Catalyst.mult上,以计算并绘制每个灰度级i的强度为i的体素数量。每个级别的点数将以直方图的形式绘制。将Range端口设置为{3,400},将Max Num Bins端口设置为80。取消选中Options端口中的logarithmic,然后单击Apply以显示直方图窗口。使用File菜单,您可以对直方图进行快照或将直方图数据保存为csv文件。
- 对催化剂距离图应用Histogram模块会生成一个图表,显示位于距对象包络给定距离处的催化剂体素数量。
加载项目CatalystDistribution-7-Histogram.hx将完成此教程步骤(参见图4.38)。
4.4 示例2:分离、测量和重建
本教程提供了有关对象分离和提取几何信息的更多详细信息:
- 分水岭算法的原理,一种基本的图像处理工具Principle of the Watershed Algorithm, an essential tool for image processing
- 先前分割Prior Segmentation
- 使用分水岭逐步分离对象Object Separation using Watershed step-by-step
- 分离故障排除Separation Troubleshooting
- 过滤单个对象Filtering Individual Objects
- 几何重建Geometry Reconstruction
要学习本教程,您应该已经阅读了第一个教程章节4.1 - 开始使用高级图像处理和定量分析,并且熟悉Avizo的基本操作。
本示例中使用的3D图像是使用多个泡沫切片的数据生成的。
示例的目的是以比入门示例更详细的方式隔离和量化这些气泡,以更好地控制结果。在许多情况下,分离对于补偿图像分辨率过低、噪声或图像中的强度变化是必不可少的。
4.4.1 分水岭算法的原理Watershed
分水岭算法是一种强大的方法,在图像处理中有许多应用,例如,用于自动对象分割或分离。
该算法模拟从2D或3D图像中的一组标记区域进行的淹没。它根据优先级图扩展区域,直到区域到达分水岭线。这个过程可以看作是在景观中的渐进浸没。
该算法依赖于两个输入:
包含标记区域的标签图像,这些区域用作淹没的种子区域。在过程结束时,将有与不同标记的标记一样多的分离对象。这些就像河流,我们想要检索其集水区。
充当景观高度场或高程图的灰度图像,控制淹没的进展,最终确定分水岭分离的位置。这些分离位于我们景观中山谷之间的山脊线上。
通过仔细选择两个输入(标记和优先级图),可以实现不同的应用。
入门教程中用于分离泡沫孔隙的Separate Objects模块就是一个例子。它首先计算距离图(有关距离图的更多信息,请参见第4.3章 - 测量催化剂教程)。这个距离图提供了分水岭过程的优先级图输入。距离图的最大区域 - 孔隙的最内部区域 - 提供了用于分水岭的标记输入。下一节将详细描述该过程。
4.4.2 先前分割Prior Segmentation
首先,您需要对数据进行分割,以获得孔隙的二值图像。
- 首先在Avizo中加载图像堆栈data/images/foam/foam.am,该文件位于AVIZO_ROOT目录中。
您可能想对数据进行某种噪声减少。您通常可以应用诸如Median Filter之类的滤波器,解释设置为3D;中值滤波器是一种非线性数字滤波技术,通常用于在去除噪声的同时保留边缘。这种噪声减少是一个典型的预处理步骤,用于改善后续处理(如分割或边缘检测)的结果。
然而,在这个例子中,您可以跳过这个阶段,直接通过阈值处理创建二值图像。
将Interactive Thresholding模块附加到项目视图中的foam.am对象。
- 使用Threshold端口滑块的光标,将低阈值和高阈值级别设置为0和38,然后单击Apply。在预览中,您可以看到图像中的分辨率和强度分布不允许您直接分割分离的孔隙:一些孔隙仍然连接,无论选择什么阈值,除非在孔隙中留下太多噪声。
- 将Ortho Slice附加到foam.thresholded以可视化结果。
加载项目WatershedSeparation-1-Thresholding.hx将完成此教程步骤(参见图4.41)。
通过拖动Slice Number端口的光标,您可能会注意到一些人工孔洞(例如,在切片4、5、6中),主要与灰度图像上出现的穿过孔隙的高强度环有关。将Ortho Slice附加到灰度图像,并将Mapping type设置为histogram以突出显示这些。隐藏或移除先前的Ortho Slice。
与其进行上游的灰度图像或甚至采集的校正,在某些情况下,更有效的方法可能是校正二值图像,例如填充孔洞。
可选地,建议填充要分离的对象内的孔洞,因为基于距离图的分离方法可能对这些人工孔洞敏感。
- 您可以将Fill Holes模块附加到foam.thresholded。
- 将Interpretation设置为3D,然后单击Apply以获得foam.filled作为结果。
4.4.3 使用分水岭逐步分离
从二值图像开始,您现在可以进行孔隙分离。您将计算距离图,从距离图的最大区域创建标记,然后应用快速分水岭算法。
- 将Chamfer Distance Map模块附加到二值图像对象(foam.thresholded)。
- 将Interpretation设置为3D,然后单击Apply以获得foam.distmap作为结果。
- 附加Ortho Slice以控制结果。孔隙内的每个体素都接收一个值,对应于其到黑色背景(泡沫)的距离。
加载项目WatershedSeparation-2-DistanceMap.hx将完成此教程步骤(参见图4.42)。
- 附加H-Maxima模块。将Contrast端口保留为默认值(4),然后单击Apply。
- 将Ortho Slice附加到foam.hMaxima,并将Transparency type设置为Alpha。
加载项目WatershedSeparation-3-MergedMaxima.hx将完成此教程步骤(参见图4.43)。
该模块创建一个二值图像,包含输入距离图图像的区域最大值,这些最大值在给定为参数的对比度变化范围内”合并”。由于使用距离图作为输入,结果是对象内最内部区域的集合。
分水岭算法要求每个最终分离的区域有一个唯一的标签。输入图像中具有相同值的两个区域将被合并。
- 将Labeling模块附加到foam.hMaxima,然后单击Apply。
- 将Ortho Slice附加到foam.labels,并将Transparency type设置为Alpha。
加载项目WatershedSeparation-4-Markers.hx将完成此教程步骤(参见图4.45)。
距离图还需要反转,因为分水岭算法将朝着输入优先级图(即景观高度)的增加值扩展标记。
- 将NOT模块应用于foam.distmap。
- 将Ortho Slice附加到foam.not。
加载项目WatershedSeparation-5-ReversedDistanceMap.hx将完成此教程步骤(参见图4.46)。
现在,您可以计算分水岭分离线的图像。
- 将Marker-Based Watershed模块附加到反转距离数据对象(foam.not)。
将foam.labels设置为Input Label Image,并将Type设置为Watershed。按Apply。 - 将Ortho Slice附加到结果以查看分水岭线。设置Alpha或Binary作为Transparency type,以将线叠加在灰度图像上。
- 将Ortho Slice附加到foam.am。将Colormap最小值设置为0。
加载项目WatershedSeparation-6-SeparationLines.hx将完成此教程步骤(参见图4.47)。
要完成分离,您可以从孔隙的二值图像中减去分离线:
- 将AND NOT Image模块应用于foam.thresholded作为第一个输入,foam.watershed作为第二个输入。
- 附加Ortho Slice以查看结果foam.sub。
加载项目WatershedSeparation-7-SeparatedPores.hx将完成此教程步骤(参见图4.48)。
4.4.4 分离故障排除
您可能会在结果中看到未分离的孔隙,或相反,孔隙的不需要的分离。因为它基于几何距离标准,分离将最适合凸形、几乎球形的对象。以下是改进分离的一些指南:
- 如果您在特定切片上查看标记图像,一些孔隙中的标记可能似乎缺失,只是因为它们位于3D中的其他地方。
- 但是,在某些情况下,标记可能真的缺失,因为从距离图区域最大值的角度来看,两个对象被认为是合并的,然后分离也会缺失。您可以尝试降低H-Maxima(或Separate Objects)的对比度因子,使标记更小和更分离。
- 如果缺少分离,这意味着缺少标记,
- 分离”线”可能看起来太厚或错误,只是因为您正在查看的切片在某种程度上与分离面相切。
- 如果对象形状非凸:这会导致多个局部最大值,因此分离对象,可能会发生不需要的分离。对象中的小凹陷可能会导致贯穿它的分离。解决方案可能是增加H-Maxima的对比度因子,以使标记更大和合并,
- 基于距离图的分离可能会沿最短路径,即直线而不是所需的形状。这是因为分水岭由距离驱动:分离由几何标准驱动。
- Chamfer Distance Map是离散的chamfer图。您可以使用更准确的欧几里得距离图(参见Distance Map或对象弹出菜单中Image Processing/Distance Maps中引用的其他距离图类型);但是,在大多数情况下,这几乎没有影响。
作为主要指导原则,分离的对象数量将与标记一样多。
如果结果不令人满意,可能有两种情况:
- 对象数量不令人满意:在这种情况下,您必须处理标记。
- 分离线不令人满意:您必须处理优先级图,即”景观高度场”。
对于标记,Separate Objects解决方案是处理距离图。在这种情况下,您考虑了几何形状(最内部区域),但标记可能通过其他方式获得。有时,如果粒子的中心更暗或更亮,使用灰度图像(强度)可能会很有趣。如果对象相当均匀,您必须坚持使用几何信息。可能需要调整H-Maxima的对比度因子设置。基本上,H-Maxima参数对应于两个最大值之间的最小深度。用地理类比:collar和summit之间的高度差,使您保持两个不同的峰。
改进的一种可能性是进行H-Maxima,然后用距离图的阈值图像遮罩结果。这避免了为小的连接部分保留标记,因为您只保留对应于距离图最大值且距离最小值的标记。
一旦对标记满意,对应于对象的数量,您还可以改进分离线。再次,上面描述的过程(Separate Objects)依赖于几何形状,您也可以使用深度的函数 - 直接使用灰度强度或强度梯度。可能有点困难地结合几何信息和强度信息。在某些情况下,您可以通过结合距离函数和强度函数来实现,例如,使用Blend With Image, Blend With Value或Arithmetic模块,以某种方式模拟人眼可以结合这两种信息的复杂方式。请注意,分水岭寻找线峰分离,因此局部最大值 - 与距离图一样,您可能需要使用函数的负值来达到这种情况。
改进分离的另一个强大技术是基于某些标准过滤由分水岭方法添加的分离:
- 隔离添加的分离:使用AND NOT Image模块获取原始图像和分离图像之间的差异,
- 使用Labeling模块标记这些分离,
- 使用Label Analysis模块对每个分离进行一些测量,例如,分离区域内距离图值的最大值可能表明分离是否太深入对象内部。
您将在下一个教程中找到更多使用不同方法创建标记和优先级图的分水岭应用示例。
4.4.5 过滤单个对象
您可以测量已分离的个别对象。
首先,您需要将分离孔隙的二值图像转换为每个孔隙唯一标识的标签图像:
- 将Labeling模块应用于分离孔隙图像(foam.sub)。
- 您可以附加Voxelized Rendering模块来查看标记图像。
加载项目WatershedSeparation-8-SegmentedPores.hx将完成此教程步骤(见图4.50)。
其次,您想过滤掉不需要的小对象,最后测量单个孔隙的体积。
为了移除小对象,您可以使用测量和测量过滤器,如入门教程中所述。这涉及两个步骤:
- 将Filter By Measure模块附加到标签图像。
- 将foam.am设置为Input Intensity Image。
- 在Measure端口的大量可用测量列表中选择Volume3d。
- 将Number Of Objects端口设置为15以仅保留15个最大体积。按Apply。
- 可以使用Voxelized Rendering或Boundary Rendering模块来查看最大体积。
- 您还可以使用Label Analysis模块在表格面板中显示和管理特定测量。
在下一个教程之一(第4.5章 - 进一步图像分析)中,您将找到测量和高级分析的更多应用示例。
加载项目WatershedSeparation-9-FilteredPores.hx将完成此教程步骤(见图4.51)。
4.4.6 几何重建
最后,您可以重建气泡的几何形状:
- 将Generate Surface模块附加到结果标签图像(foam3.labels),取消选中Border端口中的Adjust Coords,然后按Apply生成foam3.surf。
- 通过附加Surface View模块显示结果表面。
加载项目WatershedSeparation-10-Reconstruction.hx将完成此教程步骤(见图4.52)。
由于结果图像已经包含材料标签的整数值,因此可以直接用于表面重建。其他图像类型可能需要转换为Avizo标签数据(例如,使用Convert Image Type模块)。请注意,Generate Surface模块可以处理超过256个标签。
使用Surface View模块显示结果表面可能会由于大量表面多边形而非常慢。在这种情况下,建议在显示之前先进行表面简化,以便在您的硬件上更快地显示。
Avizo还允许您将表面导出为各种文件格式,或生成和导出适合(例如)有限元模拟的四面体模型。
与本整个教程相对应的演示脚本可以在以下位置找到:
data/tutorials/image-processing-advanced/PorositySurfaceReconstruction.hx
它使用位于data/tutorials/image-processing-advanced中的脚本对象来自动化处理过程。它匹配图4.49所示的工作流程。
一旦加载脚本,您可以选择性地更改几个端口值,然后单击Action端口的Apply按钮开始处理。
4.5 示例3: 进一步图像分析 - 泡沫中孔径的分布
本示例展示了如何计算泡沫样品中孔径的分布,以及如何定义自定义测量来计算孔隙的球形度。
要学习本教程,您应该已经阅读了第4.1章 - 开始使用高级图像处理和定量分析,并且熟悉Avizo的基本操作。
本节分为以下步骤:
- 孔隙检测
- 孔隙后处理
- 自定义测量组定义,用于确定孔径分布
- 自定义测量定义,用于计算孔隙的球形度
本示例中使用的图像是通过微断层扫描获得的。它代表由材料和孔隙组成的泡沫。孔隙在图像中显示为暗色水平(低强度体素)。材料显示为明亮水平(高强度体素)。
- 首先在AVIZO_ROOT目录中加载data/tutorials/image-processing-advanced/FoamPoro.am。
- 如果自动显示被禁用,连接一个Ortho Slice以在3D查看器中可视化数据,如图4.53所示。
4.5.1 第一步: 孔隙检测
- 将Interactive Thresholding连接到数据。
- 使用Threshold端口将图像阈值设置在0到50之间。
- 按Apply。
- 隐藏Interactive Thresholding模块,并将Ortho Slice连接到输出FoamPoro.thresholded。
如图4.54所示,在0到50之间对图像进行阈值处理会得到一个二值图像,其中:
强度级别1 = 孔隙,强度级别0 = 支撑体(材料)。
4.5.2 第二步: 孔隙后处理
应用于二值图像的形态学Opening算子会生成另一个二值图像,其中:
小对象被移除,对象边界被平滑,一些对象可能被断开连接。
- 将Opening模块连接到二值图像。
- 将Kernel Size设置为1。
- 按Apply。
- 将Ortho Slice连接到输出FoamPoro.opening。
在先前计算的孔隙二值图像上应用形态学开运算会产生一个过滤后的图像,其中噪声和伪影被减少,如图4.55所示。
Separate Objects模块检测分离聚集颗粒的表面。这些表面从初始图像中减去,见图4.56。
- 将Separate Objects模块连接到过滤后的二值图像。
- 将Marker Extent设置为1。
- 按Apply。
- 将Ortho Slice连接到输出FoamPoro.separate(见图4.57)。
4.5.3 第三步: 自定义测量组定义,用于确定孔径分布
Avizo Label Analysis模块允许计算3D图像中每个颗粒的一组测量。一旦执行了单独分析,就可以绘制给定测量的直方图,以产生测量分布的表示。
- 将Label Analysis模块连接到分离的二值图像。
- 将FoamPoro.am设置为Intensity Image。
在模块的Measures端口中,basic是一组预选的原生测量。可能发生的情况是,您不需要basic测量组中的所有测量,或者您希望在分析表中捆绑一组不同的测量。对于这些情况,您可以创建自己的测量组。
对于给定的颗粒,等效直径测量计算与相同体积的球形颗粒的直径。因此,等效直径由以下公式给出:
- 按Measures端口的配置按钮(带3个点的按钮)。打开一个用于选择测量组的面板(见图4.58)。
- 通过按测量组选择器旁边的专用按钮(1)创建一个新的测量组。
- 在弹出窗口中,将新组命名为diameter并按OK。
- 在原生测量列表(2)中选择EqDiameter,并使用箭头按钮将其添加到组(3)。
- 按OK。
新的diameter组(仅包含等效直径测量)现在在Label Analysis模块的Measures端口中被选中。
- 按Apply按钮。
一个新的标签图像数据对象FoamPoro.label在项目视图中创建,并显示表格面板,以电子表格样式显示结果:分析FoamPoro.Label-Analysis,也在项目视图中创建(参见图5.60和图5.61)。
- 在下方电子表格中选择EqDiameter列。
- 按工具栏中的直方图按钮。
一个窗口打开,显示EqDiameter直方图,如图5.62所示。
加载项目data/tutorials/image-processing-advanced/CustomerMeasurements-1-EquivalentDiameter.hx将完成上述步骤。
4.5.4 第四步:自定义测量定义以计算孔的球形度
Avizo提供了一组预定义的原生测量,但也可以保存用户定义的自定义测量。
- 选择标签分析模块。
- 在属性面板中,按下Measures端口的配置按钮(带有3个点的按钮)。
- 如果还没有选择,请选择diameter组。
- 通过按专用按钮创建用户测量(参见图5.63)。
- 将其命名为Sphericity,然后按OK。
测量编辑面板打开。
球形度是衡量一个对象有多球形的指标,表达为:
其中V是粒子的体积,A是其表面积。
它是与给定粒子具有相同体积的球体的表面积与粒子表面积的比率。球体的球形度为1,根据等周不等式,任何不是球体的粒子的球形度将小于1。以下是几个对象球形度的示例:
这可以用Avizo测量表示为:
- 在面板的专用字段中输入球形度公式(参见图5.64)。
- 按关闭。
- 在用户测量列表中选择Sphericity,并使用箭头按钮将其添加到diameter组。
- 按OK。
- 按标签分析模块的Apply按钮。
分析面板更新并显示EqDiameter和Sphericity测量。
提示:使用自定义组来仅选择所需的测量可以帮助加速分析过程。
注1:用户定义的数据(如自定义测量组或自定义测量)在工作会话结束时作为本地设置持久存在,因此在重新启动Avizo时可以检索它们。这些自定义数据也保存在项目脚本中。
注2:重要的是要提到,对于小孔(即由少数体素组成的孔)计算的球形度可能会超过1。这是因为Area 3D测量是用弦近似计算的(通常可以更好地近似面积),而Volume 3D测量不使用任何近似。
Avizo提供了强大的方法来定义自定义测量。有关更多详细信息,请参阅用户指南和参考指南。
加载项目data/tutorials/image-processing-advanced/CustomerMeasurements-2-Sphericity.hx将完成上述步骤。
4.6 示例4:进一步图像分析 - 泡沫中材料的平均厚度
本教程展示了如何计算泡沫样品中材料的厚度。
要学习本教程,您应该已经阅读了第一个教程章节4.1 - 开始使用高级图像处理和定量分析,并且熟悉Avizo的基本操作。
在本教程的末尾,您将找到指向相应演示脚本的链接。
首先加载data/tutorials/image-processing-advanced/FoamPoro.am,这是一个通过微断层扫描获得的图像,存储在AVIZO_ROOT目录中。
它代表由材料和孔隙组成的泡沫。孔隙在图像中显示为暗色水平(低强度体素)。材料显示为亮色水平(高强度体素)。
该算法可以分为4个步骤:
- 孔隙检测
- 分离面的检测
- 材料的距离图
- 材料平均厚度的计算
4.6.1 孔隙检测
重复上一教程的前几个步骤:使用阈值处理、形态学开运算和分离模块对初始图像进行处理,以获得过滤和分离的孔隙的二值图像。
加载项目PorosityThickness-1-SeparationObjects.hx将完成此教程步骤(参见图4.66)。
4.6.2 分离面的检测
这一步的目标是检测穿过材料的表面,这些表面与两个孔隙等距。影响区域(Influence Zones)模块:
- 将二值图像作为输入,
- 给出一个二值图像作为输出,其中:
- 输出图像中的每个蓝色体素离输入图像中区域中心的对象更近,
- 每个黑色体素至少等距于两个更近的对象。
对孔隙的二值图像FoamPoro.separate应用影响区域模块。
加载项目PorosityThickness-2-InfluenceZones.hx将完成此教程步骤(参见图4.67)。
NOT模块反转二值图像的水平。对影响区域骨架(SKIZ)应用NOT会产生一个二值图像,其中:
- 输出图像中的每个黑色体素离输入图像中区域中心的对象更近,
- 每个蓝色体素至少等距于两个更近的对象。
因此,影响区域和NOT的组合提供了一个穿过材料分离孔隙的表面的二值图像。
对FoamPoro.zones应用NOT模块。
加载项目PorosityThickness-3-SeparationSurfaces.hx将完成此教程步骤(参见图4.68)。
4.6.3 材料的距离图
对孔隙的二值图像FoamPoro.separate应用NOT。
这会产生一个二值图像,其中:
- 输出图像中的每个黑色体素代表背景或孔隙体素,
- 每个蓝色体素代表材料体素。
Chamfer Distance Map模块应用于二值图像会产生一个灰度图像,其中每个体素强度代表与对象边界的最小距离(以体素为单位)。对于给定的体素强度:
- 强度级别 = 0 对应于孔隙或背景
- 强度级别 = 1 对应于材料包络
- 其他低级强度对应于靠近材料包络的材料部分
- 其他高级强度对应于远离材料包络的材料部分
对材料二值图像FoamPoro2.not应用3D解释的Chamfer Distance Map模块。
加载项目PorosityThickness-4-DistanceMap.hx将完成此教程步骤(参见图4.70)。
Mask模块:
- 将灰度图像作为第一个输入,
- 将二值图像作为第二个输入(掩码图像),
- 提供一个灰度图像作为输出,其中:
- 掩码图像中的每个黑色体素在输出图像中设置为0,
- 掩码图像中的每个蓝色体素在输出图像中设置为来自灰度图像的初始水平。
对距离图图像FoamPoro2.distmap应用Mask模块,并将分离面图像FoamPoro.not设置为Input Binary Image。
用分离面图像掩蔽距离图图像会产生一个灰度图像,其中:
- 每个非零强度代表分离面的一个体素,
- 强度值等于两个最近对象之间距离的一半(以体素为单位)。
加载项目PorosityThickness-5-Mask.hx将完成此教程步骤(参见图4.71)。
4.6.4 材料平均厚度的计算
材料的平均厚度由以下公式给出:
其中:
- = 体素尺寸(以微米为单位)
- = 分离面距离图图像中体素强度的总和
- NbVoxSep = 二值分离面图像中的体素数量
带3D解释的Volume Fraction模块在”Label Voxel Count”列中给出3D图像中每个标签的标记体素数量。二值图像只有一个标签,所以”Label Voxel Count”返回NbVoxSep。
带3D解释的Intensity Integral模块在”Volume”列中给出3D图像中体素强度的总和,即。
加载项目PorosityThickness-6-Thickness.hx将完成此教程步骤。