vtk教程第十章 图像处理

46 篇文章 19 订阅
12 篇文章 16 订阅

在本章中,我们将描述可视化工具包的图像处理组件。重点是关键的表示思想,管道问题,如数据流,和有用的算法,以改善图像的外观和有效性

10.1介绍

自从数字计算机出现以来,图像处理一直是计算的支柱。早期的努力集中在改进图像内容以供人类解读。最近,图像处理已被计算机视觉从业者利用,其目标是处理图像数据以实现自动机器感知[Gonzalez92]。从数据可视化的角度来看,图像处理是对图像内容进行操作,以改善后续处理和解释的结果。例如,CT或MRI扫描可能会产生假信号噪声或需要图像分割。利用图像处理技术,可以逐片(即一幅一幅图像)地去除噪声,进行自动和半自动分割。因此,通过应用图像处理技术,等值面生成、体绘制等3D技术可以在外观、准确性和有效性方面得到改善。

由于本文的重点是3D图形和可视化,本章以有限的方式处理图像。然而,我们想强调图像处理、计算机图形学和可视化之间的相互关系。通常,文本和课程将这些视为可见女性CT数据集的一个切片(垂直)的明显梯度大小,显示为一个等值面和两个切片(水平)的数据集。图像处理是独立的学科,但实际上它们是密切相关的(参见第4页的“成像,计算机图形学和可视化”)。

这里所介绍的材料是为了证明一些重要的观点。首先,前面介绍的数据流或管道方法直接适用于图像处理,另外一个好处是,由于图像数据的规律性,我们可以轻松实现数据流和缓存。其次,图像处理算法可以改善可视化结果。我们将通过一些有用的示例来说明这一点。最后,从实际的角度来看,我们想要演示一个包括成像、图形和可视化的系统架构。

10.2数据表示

在本节中,我们将简要描述成像管道背后的数据表示。正如我们前面看到的(在第124页的“数据集”中),数据集由结构(拓扑和几何)和数据属性组成。虽然原则上图像可以表示为图像数据集,但图像处理的特殊性质意味着更复杂的表示,我们很快就会看到。

图像通常用于引用二维结构化点数据集。更一般地,在本章中,我们将把图像定义为由最多四个维度组成:三个空间维度x, y, z和时间t。我们添加时间维度的原因是图像经常作为时间序列生成,我们通常希望沿着时间轴访问数据。例如,我们可以画出某一点的值作为时间的函数。

正如第136页“图像数据”中所描述的,图像具有规则的拓扑结构和几何结构。数据的规律性使其适于许多特殊操作。特别是,我们可以支持数据缓存和流,并对数据中感兴趣的区域进行操作。

感兴趣的区域

当数据具有规则的空间组织时,可以请求感兴趣的数据块或区域。例如,一个映射器可能只需要数据的一个区域来显示,因此加载或处理整个数据集的效率很低。这方面的一个例子是仅显示大型结构化卷的一个切片的二维查看器。通过只在需要时加载片,可以减少磁盘访问,并节省内存。

尽管感兴趣的区域可以具有任意形状,但数据样本的规则结构决定了最佳区域配置。存储在笛卡尔坐标系中的图像很容易划分为更小的矩形区域,而在极坐标网格上采样的数据最好划分为饼状区域(图10 - 1)。因此,对数据区域进行操作意味着我们处理由每个维度或轴的(min,max)范围指定的数据“窗口”。例如,尺寸为100 x 100的2D图像中的区域可以指定为(25,49,0,49),这意味着我们将操作一个(25 x 50)窗口。

图10-1坐标轴对齐的矩阵自然适用于矩形区域,极坐标网格适用于饼形区域。

流和缓存处理

感兴趣的区域的缺点是,相同的数据可能会被多次读取和处理。如果上面描述的查看器需要通过切片放映(即循环),或者交互式地平移大图,那么一次性加载所有数据将是有益的。

在内存中维护所有数据或操作小块数据这两种极端方法之间的折衷方案是更新大于请求的区域,但不像整个映像那么大。这被称为数据缓存。数据缓存可以预测未来的请求,在大多数情况下工作良好。然而,当后续请求之间很少或没有一致性时,它就会崩溃。

使用区域处理模型,可以将数据对象视为存储任意数量区域的缓存。有许多用于保存和释放区域的缓存策略,这些策略可能相当复杂。最简单的策略在任何时候都只能保存一个区域。如果后续请求完全包含在缓存区域中,则不需要进一步处理。另一种策略可能是将图像划分为大小相同的平铺区域。当请求的区域大于该块时,将更新多个块以覆盖该区域。在设计缓存策略时,重要的是要考虑复制数据以更改其格式的开销。当考虑到所有的因素时,复杂策略的一些优势就消失了。

考虑到对数据区域进行操作的能力,对整个数据集进行流操作只是一小步。流是将数据区域以连续流的形式通过管道的过程。例如,像素直方图映射器在其容器中累积值时可以请求单个像素。大型数据集可以以这种方式处理,而无需一次加载多个像素。如果有多个处理器可用,还可以使用区域处理将任务分成多个部分,以实现负载平衡和更快的执行。

属性数据和组件

与可视化算法可能生成法线、向量、张量和纹理坐标不同,图像处理算法通常处理由标量数据组成的属性数据。数据通常是单一的组成部分(例如,灰度图像),但通常也可以处理彩色图像(例如,RGB的三个组成部分)。

在Visualization Toolkit成像管道中,属性数据表示为n维组件数据。请参阅第405页上的“把它全部放在一起”,以查看组件数据、感兴趣的区域、流和缓存的实现细节。

10.3算法

本节提供重要图像处理算法的概述和示例。算法的重要性是通过它们与3D数据可视化的相关性来衡量的。主题包括:去除噪声,平滑,减少采样伪影,图像增强,分割和形态操作,如侵蚀和膨胀。

图像恢复

噪声和其他工件是固有的所有方法的数据采集。由于人工制品会降低图像的视觉外观和分析,图像处理的第一步通常是恢复。对工件统计属性的了解允许过滤器在对底层数据影响最小的情况下选择性地删除它们。例如,典型图像的大部分功率都位于低频,而白噪声则均匀地分布在整个频谱上。在这种情况下,低通滤波器消除了大部分噪声,但保留了图像的大部分完整。

低通平滑滤波器的一个简单实现是与一个全为正的核进行卷积。用于平滑的典型内核要么是在圆形邻域上的常数,要么是高斯分布(见图10 - 2)。高斯平滑比常量核平滑产生更好看的图像,但由于捕获高斯轮廓所需的大核尺寸,计算成本更高。当它推广到三维数据集和三维核时,平滑变得更加昂贵。

加速高斯平滑的一种方法是将滤波器分解为两个一维卷积。由于二维高斯函数是可分离的,

沿着x轴,然后沿着y轴用一维高斯核进行平滑等同于与二维高斯核进行卷积。也可以通过多次与常数二进制核卷积来近似高斯平滑。

图10-2低通滤波器可以实现为与高斯核的卷积。上图中显示的高斯核被放大了

(GaussianSmooth。tcl)。

非线性光滑

用简单的平滑来去除噪声的一个问题是边缘是模糊的。虽然高频只占图像的一小部分,但人类视觉系统对边缘空间形式中的高频非常敏感。事实上,图像中的大部分低频在离开视网膜之前就被视觉系统丢弃了。一种保持边缘平滑的方法是各向异性扩散。这种过滤器平滑图像中相对平坦的区域,但不扩散跨越突变。扩散迭代,直到达到所需的降噪水平。两种可能的扩散准则是:仅当梯度幅度低于指定值时才扩散,或仅当像素之间的差值低于指定常数时才扩散两个像素。中值过滤器也平滑,同时保留边缘。该过滤器将每个像素替换为以像素为中心的邻域中标量值的中值。

中值滤波器对发生概率较低的高振幅噪声最有效(见图10 - 3)。有两种方法可以控制去除噪声的数量和规模:可以改变邻域的大小,或者可以应用多次滤波器。这个中值滤波器保留边缘;然而,它可以圆角和去除细线。混合中值滤波器是为了解决这一问题而开发的。它在每个像素周围的5 × 5邻域上工作。该算法由两个步骤组成:首先计算“x”形和“+”形邻域的中值,然后计算这两个值与中心像素值的中值,得到最终结果。的

图10-3高斯平滑和中值平滑降低低概率高振幅噪声的比较tcl)。

混合中值具有固定大小的邻域,但可以应用多次以进一步降低噪声(图10 - 4)。

低频伪影

采样时会出现混叠,通常与阶梯边有关。采样理论证明了间隔为S的离散采样信号,完全描述了频率小于S/2的连续函数。当一个信号被下采样时,它容纳高频信息的能力就会降低。然而,高频能量并没有消失。它包裹在频谱上,出现低频混叠伪影(图10 - 5)。消除这种伪影的解决方法是在子采样前进行低通滤波。低通平滑降低了图像的高频范围,这将导致混叠。

在获取数据时也会出现相同的混叠现象。如果来自模拟源的信号包含高频,以离散形式保存模拟数据需要子采样,这会引入别名伪影。出于这个原因,通常的做法是以高分辨率获取数据,然后平滑和子采样,以将图像缩小到可管理的大小。

图10-4中值滤波和混合中值滤波的比较。混合滤波器保留角和细线,比中值滤波器更好。下面的模式表示用于计算混合中值的三个邻域(请参阅示例Tcl脚本)

HybridMedianComparison。tcl)。

在获取数据时,除了混叠之外,还可能出现低频伪影。基线漂移就是一个例子。随着时间的推移而获取数据,信号的平均值(基线)可能会缓慢变化。这种漂移可以在数据采集后用高通滤波器去除。还可以获得第二个隔离基线的数据集。从主信号中减去基线可以去除漂移伪影。一般来说,度量工件要比冒险做出可能对实际数据产生不利影响的错误假设要好。

另一个渐变是由传感器位置引起的。当源远离传感器时,被测信号的振幅通常会衰减。举个例子

图10-5该图展示了高频信号被下采样时发生的混叠现象。高频表现为低频伪影。左下图像是次采样后的头骨等值面。右边的图像在子采样之前使用了低通滤波器来减少混叠(IsoSubsample。tcl)。

在mri表面线圈图像中可见衰减伪影如图10 - 6所示。如果衰减剖面是已知的,那么可以通过将原始数据与剖面分割来移除伪影。由于这种工件可以通过传感器位置和范围等一小部分参数来表征,因此可以从数据自动确定衰减剖面。像大多数工件一样,非均匀衰减倾向于隐藏图像中的信息。给定一个度量图像中信息量的函数,梯度下降和其他搜索策略可以找到最优的衰减参数。

图像增强

通常数据集包含的信息或动态范围不能完全显示在一张图像中。例如,x射线计算机断层扫描(CT)数据集的标量分辨率是能够显示256个灰度阴影的典型计算机显示器的10倍。用于传递隐藏在这些医学数据集中大动态范围内的信息的一种方法是允许用户使用窗口级传递函数交互式地设置彩色地图。然后,用户可以选择显示他们认为最重要的数据范围,如图10 - 7所示。传递函数的斜率决定了最终图像的对比度。大于1的斜率会增加对比度,小于1的斜率会降低对比度。在传递函数为常数且斜率为零的标量范围内,所有的对比和信息都会丢失。

图10-6这张MRI图像显示了由于传感器位置可能发生的衰减。通过除以人工确定的衰减剖面来去除伪影。

这个直方图显示了工件如何以标量值集群(衰减)的形式隐藏信息。tcl)。

简单窗层传递函数的短落差是其有限的形状。更一般的非线性传递函数可能更适合于某些数据集。一个例子是对数传递函数,它可以用来显示图像功率谱(图10 - 10)。功率谱中的大多数像素代表高频率,并且具有较小的值。然而,低频像素的小群体通常具有较大的值。对数函数在接近零的地方斜率最大,因此留给小值像素的对比度最大。然而,当常数K选择正确时,没有一个大像素值完全饱和。

为了充分利用所有可用的显示对比度,图像应该具有均匀的强度分布。对于连续图像,这种强度分布称为概率密度函数(PDF)。对于具有离散标量值的离散采样图像,图像直方图具有与PDF相同的信息(图10 - 7)。直方图将图像的标量范围分解为离散的不重叠的容器。每个容器都有一个像素计数,表示标量值落在该容器范围内的像素数量。

为了实现统一标量直方图的目标,可以使用传递函数在直方图中展开聚类,并压缩图像中未充分表示的标量范围。为了保持图像的总体外观,传递函数应单调递增,以保持亮度关系。若要在柱状图中展开簇,请使用

图10-7顶部图表显示了两个窗口级传输函数。生成的图像显示在中间行中。底部一行显示图像的图像直方图。

在标量密度最高的地方,传递函数的斜率应该很大,在直方图的空区域,斜率应该很小。

直方图均衡化是一种自动生成定制传递函数以增加图像对比度的算法。对于连续图像,传递函数是简单的累积分布函数(CDF),它被定义为PDF的积分。根据定义,CDF函数在PDF值最大的地方具有较大的斜率,因此与图像中最频繁出现的标量范围具有最大的对比。使用CDF作为传递函数的结果是具有理想常数标量分布的图像。对于离散图像和图像直方图,可以使用CDF函数的离散版本。然而,

图10-8直方图均衡化自动计算一个传递函数,生成的图像具有几乎恒定的标量直方图。

图10-9高通滤波器可以提取和增强图像的边缘。从原始图像(左)中减去拉普拉斯(中)会导致边缘增强或锐化操作(右)(EnhanceEdges。tcl)。

由于离散近似,生成的图像不能保证具有恒定的直方图(图10 - 8)。

高通滤波器也可以用来压缩图像的范围。由于低频占图像动态范围的大部分,但携带的信息很少,高通滤波器可以显著降低图像的标量范围,并强调隐藏的细节。拉普拉斯滤波器是一种二阶导数运算,是高通滤波器的一种实现。它消除了常数和低频,只留下高频边缘。拉普拉斯算子的输出可以从原始图像中减去,以产生图像的边缘增强或锐化(图10 - 9)。

频域

傅里叶变换属于一类滤波器,它从根本上改变了图像的表示而不改变其信息。傅里叶变换的输出在频域中。每个像素都是一个复数,描述了正弦函数对原始图像的贡献。像素的大小编码正弦信号的振幅,复像素的方向编码正弦信号的相位。每个像素代表一个具有不同方向和频率的正弦信号。傅里叶反变换将频域图像转换回原始空间域(图10 - 10)。

低通和高通滤波在频域变得微不足道。部分像素被简单地掩盖或衰减。图10 - 11显示了一个用函数衰减频域图像的高通巴特沃斯滤波器

滤波器的逐渐衰减是很重要的。理想的高通滤波器,如图所示,只是在频域中屏蔽一组像素。突变在空间域中引起了振铃效应(如图所示)。

尽管在频域中工作的任何滤波器也可以在空间域中实现,但有些操作计算成本更低,更容易在自由域中实现

图10-10离散傅里叶变换将图像从空间域变换到频域,其中每个像素代表一个正弦函数。该图显示了使用对数传递函数(VTKSpectrum)显示的图像及其功率谱。tcl)。

quency域。要在空间域中执行类似图10 - 11的滤波,将需要与大核进行卷积,并且速度较慢。一般来说,大核卷积在频域执行时效率更高。频域中的乘法等价于空间域中的卷积(反之亦然)。其中,为a的傅里叶变换,为b的傅里叶变换。

为了使频域处理可行,首先需要最小化从空间域变换到频域再变换回来的代价。有一些快速的算法可以实现傅里叶变换和它的反变换。首先,傅里叶变换是可分解的,所以二维变换可以通过先对图像的所有行进行一维傅里叶变换,然后对图像的所有列进行傅里叶变换来实现。其次,一维傅里叶变换的复杂性可以通过一种称为快速傅里叶变换(FFT)的算法来降低。它的工作原理是递归地将样本数N分解为质数分量。如果N是质数且不可分解,则转换一步完成,即阶复杂度。如果N能被2整除,则数字数组被分为两个部分,分别转换,然后组合。如果N是2的幂,则算法按顺序执行

图10-11给出了频域的两个高通滤波器。的

巴特沃斯高通滤波器具有逐渐衰减,避免了理想高通滤波器产生的振铃与突变(IdealHighPass。tcl)。

出于这个原因,处理大小为2的幂的图像(例如,512 x 512)比处理其他大小的图像更有效。对于两个图像的非幂,在处理之前将图像填充到两个大小的幂可能会更快。

关于离散傅里叶变换的重要一点是它将图像视为周期函数。这意味着右侧边界上的像素与左侧边界上的像素相邻。由于这些像素之间通常没有物理关系,人工的水平和垂直边缘会扭曲频谱和后续处理。为了减少这些伪影,原始图像可以乘以一个窗口函数,在边界处变为零。另一种方法是仅通过平滑边缘来去除这些人工边缘。

图10-12频率空间卷积将图像视为一个周期函数。

一个大的内核可以从图像的两边提取特征。左下角的图像已经用零填充,以消除卷积过程中的环绕。在右侧,镜像填充被用来去除由边框引入的人工边缘

(Pad.tcl)。

在这两种方法中,原始图像的一部分会丢失,因此只能处理图像的中心部分。如果这是不可接受的,另一种解决方案是使用镜像填充滤波器将原始图像的尺寸扩大一倍。中间图像是周期性连续的(图10 - 12)。

图像分割

分割是对图像或体积中的像素进行分类的过程。这可能是可视化过程中最困难的任务之一。一种分割形式将图像作为输入,并输出包含每个像素分类的映射。这种分割滤波器的输出通常为每个像素具有二进制或离散值;然而,也可以输出一个模糊分类,其中像素的标量值表示分类的置信度度量。

单参数分割的一个简单例子是用于在CT数据集中标记骨骼的阈值过滤器。由于骨骼具有最大的标量值,因此很容易选择一个阈值将骨骼与图像的其余部分分开。

对于其他组织和其他成像方式,分割通常更困难。图像中的噪声和组织中重叠的标量值会降低简单阈值分割的效果。通过使用两个参数,阈值可以分割范围为的像素

图10-13使用包含相关、阈值、膨胀和侵蚀的管道分割由“C”组成的区域。左图显示的是原始图像。右图显示了在原始图像上叠加的分割区域。

标量值。额外的参数允许对结果分割进行更多的控制,但也使选择参数的复杂性增加了一倍。

可以对图像进行预处理,根据纹理等更复杂的特征对图像进行分割。有时,组织中的纹理为分割添加有用的信息。纹理敏感过滤器,如拉普拉斯和梯度大小可以区分不同的纹理。可以用于纹理分割的其他过滤器是范围、方差和相关过滤器。范围过滤器只是报告每个像素周围邻域的最大值和最小值之间的差异,方差过滤器计算邻域像素相对于中心像素的方差。

图10 - 13显示了如何使用相关过滤器进行分割的示例。相关滤波器类似于卷积。核在图像上移动,对于每个位置,图像和核之间的点积给出了两者之间相关性的度量。相关滤波器的输出在图像中模式出现的任何地方都很大,但在其他位置很小。因为生成的地图是稀疏的,所以需要进行额外的后处理来找到一个统一的、分段的区域。在本例中,使用膨胀和侵蚀来关闭图案之间的间隙。(膨胀和侵蚀将在下一节讨论。)

预处理

虽然预处理可以在很大程度上改善分割结果,但后处理也很有用。形态滤波器,其操作的二进制或离散图像,可以用于操纵分割区域的形状。在这个简短的讨论中,我们将只考虑使用圆形足迹的操作,尽管这些形态滤波器可以定义得更一般。侵蚀是通过删除边界指定距离内的像素来实现的。为每一个

图10-14这个图展示了各种二进制过滤器,可以改变分割区域的形状(MorphComparison. filter)。tcl)。

像素不在分割区域,在像素周围的圆形区域中的所有邻居都被关闭。这种侵蚀过滤器缩小了分割区域,小的孤立区域消失了。

侵蚀的反义词是膨胀。该过滤器增加分段区域的面积。分段区域的小孔完全闭合。不在分割区域内但在该区域附近的任何像素都是打开的。膨胀和侵蚀是具有几乎相同实现的双重滤波器。在二值图像中,扩大“开”像素等同于侵蚀“关”像素(参见

Figure10-14)。

封闭是先扩张后侵蚀的连续应用。当图像被放大时,地图上的小洞就消失了。然而,单独的膨胀也增加了分割区域的边界。在关闭操作中,当膨胀后发生侵蚀时,小孔被清除;然而,分割区域的边界保持在相同的总体位置。开是闭的对偶。打开会移除小像素岛。它是通过最初的侵蚀来实现的,然后是膨胀。

连接过滤器还可以删除小区域,而不影响分割区域的其余边界。这组过滤器根据邻居关系将分割的像素分离为等价类。如果两个像素是接触的,那么它们属于同一个类。在二维图像中有两种常见的邻居关系:4连通性认为像素是边缘邻居,8连通性认为像素是共享任何顶点的邻居。

在像素被分配一个等价类之后,使用各种方法来确定哪些像素组将通过过滤器,哪些类将被消除。岛屿删除过滤器是一个连接过滤器,它删除像素太少的组。种子连接允许用户显式地指定哪些组将通过筛选器。用户或应用程序指定一组种子。任何包含种子的组都能通过过滤器。不包含种子的组将被删除。这个过滤器类似于种子连接过滤器;然而,种子在第二个图像中提供。首先进行分割后的图像与种子图像的相交。然后将每个剩余的像素添加到一组种子中。

多光谱分割

从日常经验中我们知道,在彩色图像中比在灰度图像中更容易看到结构和信息。这是因为每个像素在红色、蓝色和绿色成分中包含的信息比单个成分灰度像素更多。分割多光谱图像的一种方法是分离分量并单独阈值,然后将得到的二值图像与逻辑滤波器结合。这允许在像素的颜色/组件空间中选择矩形补丁区域。

通过使用多个阈值结合多级逻辑过滤器,可以指定组件空间中的任意区域进行分割。但是,在进行阈值操作之前,将组件转换到不同的坐标系统中会更容易、更有效。最简单的示例是对组件的投影设置阈值。这相当于在像素的分量和恒定方向向量之间进行点积后的阈值。这将组件空间划分为由超平面分隔的两个区域。

坐标转换的另一个例子是从红、绿、蓝(RGB)颜色组件转换到色相、饱和度、值(HSV)表示(参见第37页的“颜色”)。基于色相和色彩饱和度的图像分割在RGB空间中比较困难,而在HSV空间中比较简单。

颜色并不是唯一可用于分割的多光谱信息。即使原始数据集只有一个成分,也可以利用多光谱分割。使用空间滤波器可以从图像的空间信息中创建额外的图像。然后将这些多幅图像组合成一张多分量图像,然后进行多分量分割。

通常,过滤器中自由参数的数量与像素的维数直接相关;尽管附加的参数使过滤器更强大,但它也使查找适当的参数值集变得更加困难。有监督和无监督算法可用于自动选择最佳分割参数集,但这些讨论超出了本书的范围。

10.4整合一切

我们建议您查看本章图像附带的代码,以了解如何使用VTK成像管道。在本节中,我们将解释图像数据的一些实现细节。我们还将展示如何混合成像和可视化管道,以及如何使用成像过滤器来执行回归测试。

数据表示法

在成像管道中,用于表示和操作数据的类是vtkImageData(参见134页的“数据集类型”了解更多信息)。此外,数据范围(拓扑范围规范)在控制图像如何处理中起着至关重要的作用。

vtkImageData实际上表示图像数据。在内部,它引用了vtkDataArray的一个实例。因此,它的原生表示数据类型可以是unsigned char、char、unsigned short、short、int、float或vtkDataArray的任何具体类型中的任何一种。请记住,vtkImageData可以表示1D、2D(图像)和3D(卷)数据。

在成像管道中有三种类型的数据区。一般情况下,任何矩形图像数据都可以用广度六向量(imin,imax, j min,jmax, k min,kmax)来描述。WholeExtent指的是图像的原始数据大小,它来源于图像的维度。UpdateExtent是在执行期间由特定筛选器处理的范围。

区段用于管理通过可视化管道的数据流,以及协调成像管道自始至终使用的多线程并行处理。通过控制区段,可以大大减少管道使用的内存量。有关更多信息,请参阅Kitware销售的VTK用户指南。

在VTK成像管道中,点属性数据的表示方式与可视化管道中不同。在成像管道中,点属性数据表示为每个数据点的n个分量。通常,对于灰度数据n是1,对于彩色数据n是3,但一般来说,n可以是任何正数。

  • 创造形象

这个例子演示了如何使用c++代码直接创建一个图像。通常,您将使用图像阅读器或从源对象程序性地创建图像。这里显示的示例创建了一个vtkImageData,然后用干扰正弦网格的图像填充它

图10-15在图像数据集中创建两个干涉正弦光栅的图像。生成的图像的尺寸为2562

注意,直接指针访问用于填充图像。AllocateScalars()方法为所提供的维度分配足够的内存。

梯度幅值

在这个例子中,我们演示了一个漫长的成像管道。管道的基本目的是可视化关于图像梯度的信息。梯度方向和幅度分别映射到颜色HSV空间的色相和饱和度分量。管道、生成的图像和部分代码如图10 - 16所示。

管道演示了一些有趣的技巧。前三个滤波器读取人类头部的CT数据(即使用vtkImageReader),将图像放大四倍(vtkimagemagify),然后平滑数据(由于放大使用线性插值,图10-15在图像数据集中创建两个干涉正弦光栅的图像。生成的图像的尺寸为2562。下一个过滤器实际计算2D梯度(vtkImageGradient),将x-y梯度组件放入其输出中。

下一个系列的过滤器是有趣的开始。首先,将数据转换为极坐标(vtkImageEuclideanToPolar)。我们使用这个过滤器是因为我们想在彩色HSV空间中操作(参见第37页的“颜色”)。图像的幅值被映射为饱和度值,而梯度方向被映射为色相值(记住色相在HSV色轮上表示为一个角度)。筛选器vtkImageConstantPad用于向数据添加第三个组件,因为梯度筛选器只生成两个组件,而我们需要三个组件来表示颜色。vtkImageExtractComponents用于将组件重新排列为HSV顺序。最后,使用vtkImageHSVToRGB将数据转换回RGB颜色空间。(这是必要的,因为图像查看器需要RGB值。)

图象扭曲

在这个例子中,我们结合了成像和可视化管道。成像过滤器用于读入图像(vtkBMPReader),然后将其转换为灰度(vtkImageLuminance)。数据是一个图像数据集,然后使用vtkImageDataGeometryFilter将其作为多边形传递给可视化管道。接下来,我们使用可视化过滤器vtkWarpScalar沿垂直于图像平面的方向扭曲数据。vtkMergeFilter用于将扭曲的几何图形(现在是vtkPolyData)与来自阅读器的原始图像数据结合起来。(注意,在本例中,vtkMergeFilter接受两个输入。)管道、输出示例和样例代码如图10 - 17所示。

回归测试

在我们使用VTK的工作中,我们经常需要执行软件测试。测试可能是必要的,因为我们向系统中添加了新的类或功能,修改了旧的代码,或者只是测试图形库或新硬件。我们使用基于处理系统输出(通常是图像)的强大测试程序。我们将测试过程称为回归测试。

回归测试基于以下步骤。编写测试程序(通常是Tcl/Tk脚本)来练习代码的一部分。在我们的例子中,我们将假设我们正在测试隐式建模的一个特性。脚本的输出是一个具有固定视图的图像,如图10 - 18 (a)所示。为了执行测试,我们将测试程序的输出与之前存储的图像或“有效”图像(图10 - 18 (b))进行比较。有效的图像是在我们最初创建一个或多个要测试的对象时生成的,并且被假定为正确的输出。然后,我们使用筛选器vtkImageDifference将测试图像与有效图像进行比较。这个过滤器考虑了抖动和抗混叠效果,并创建了一个输出图像,表示测试图像和有效图像之间的差异(图10 - 18 (c))。它还根据像素计数报告图像的差异。为了确定测试是否通过,我们将像素计数与阈值(例如,10个像素)进行比较。

我们的回归测试过程不能测试一个或多个对象的原始实现。开发人员必须验证有效的映像确实正确。然而,这个过程对于发现和纠正由于增量代码更改而导致的问题(例如,错误修复,

.图10-16梯度信息可视化成像管道示意图梯度方向映射为色彩色相值,梯度幅度映射为色彩饱和度

(ImageGradient。tcl)。

图10-17结合成像和可视化管道,在z方向上变形图像(imageWarp. zip)。tcl)。vtkMergeFilter用于将扭曲的表面与原始颜色数据结合起来。

此外,测试可以作为批处理过程运行,具有简单的通过/失败输出,以及显示差异的图像。

图10-18图像处理软件回归测试从渲染器中获取一个测试图像,并与存储在磁盘上的有效图像进行比较。(a)显示有效图像。(b)显示测试图像(由相机轻微旋转人为修改)。(c)为图像差值。上面的代码片段是从回归测试过程中提取的。

10.5章小结

图像处理可用于改进结构化点数据集(图像和体)的3D可视化。重要的技术包括平滑、滤波、侵蚀和扩张等形态运算符以及分割。

由于图像具有规则的拓扑和几何结构,因此可以设计缓存和流管道来减少内存需求。在可视化工具包中,成像管道与可视化管道集成在一起。此功能允许创建结合了计算机图形、成像和可视化的应用程序。

10.6书目说明

有许多描述成像算法的书籍。下面列出了几个,包括[gonzgonzalez 92]和[Russ95]。文本[Pavlidis82]和[Wolberg90]是带有某种计算机图形学和/或可视化倾向的成像书籍。文本[Robb95]是医学成像和可视化的杰出参考。

如果图像处理、分割和/或配准对您很重要,我们强烈推荐洞察力分割和配准工具包(ITK)。与VTK一样,ITK也是开源的,包含大量的文档资源和示例。访问www.itk.org了解更多信息。另外,[Ibanez03]也是一个很好的参考。

描述VTK独特的流可视化管道的技术参考文献[Law99] [Martin01]。使用这种方法,可以处理大约1pb大小的数据。

10.7参考资料

[刘国强,刘国强,等。计算视觉。Prentice Hall, Inc., Englewood Cliffs, NJ, 1982。

[戴维斯97]李志强。机器视觉理论算法实用性2d。学术出版社,圣地亚哥,加州,1997年。

[刘志强,刘志强,等。数字图像处理。Addison-Wesley出版公司,Reading, MA, 1992。

[03]李国强,李国强。ITK软件指南。Kitware公司。Isbn 1-930934- 10-6。

[footnoef: 5]刘国强,李国强。用于大型结构化数据集的多线程流管道体系结构。在程序。, IEEE, 1999年10月。

[Martin01]李国强,李国强。使用并行数据流的大规模数据可视化。IEEE计算机图形学与应用,2001年7月。

图10-19分割练习样本图像

(Niblack86)

w . Niblack。数字图像处理概论。Prentice Hall, Inc.,伦敦,1986。

(Pavlidis82)

t . Pavlidis。图形和图像处理算法“,”计算机科学出版社,罗克维尔,

医学博士,1982年。

(Robb95)

r·罗伯。三维生物医学成像原理与实践。VCH出版社,新

纽约,1995年。

(Russ95)

j·c·拉斯。图像处理手册2d版。CRC出版社,公司,博卡拉顿,佛罗里达,1995年。

(Wolberg90)

g . Wolberg。数字图像翘曲。IEEE计算机协会出版社,Los Alamitos, CA, 1990。

10.8运动

10.1创建一个图像管道,用图10 - 19中的竖线分割区域。

10.2分解可以提高操作的速度。

a)证明三维高斯平滑可以分解为三个一维操作。

b)确定分解后的滤波器和同样的滤波器实现为三维卷积的复杂度。

c)在什么条件下常数平滑可以分解为一维操作?

10.3创建一个图像管道,用于显示高斯图像的频谱。增加或减少标准差对频谱有什么影响?

本书为英文翻译而来,供学习vtk.js的人参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值