前言
该篇只简单整理VTK图像处理的函数以及对应的功能,详细内容以及具体源码参见《VTK图形图像开发进阶》第五章。
《VTK图形图像开发进阶》下载地址:
链接:https://pan.baidu.com/s/1hG9js6eZkTqL6Fh-b_C-Dg
提取码:cod81.图像创建
图像源Source
- VTK内置了很多创建图像的Source类,可以创建点、线段、圆、矩形等图像。
- vtkImageCanvasSousce2D:创建画布(空白图像);
- vtkImageEllipsoidSousce:创建前景为椭圆的二值图像;
- vtkImageGaussianSousce:高斯分布图像;
- vtkImageGridSousce:网格图像;
- vtkImageSinusoidSousce:像素值有正弦函数决定的图像;
直接创建图像
vtkImageViewer2
- 该类提供主要的交互操作有图像缩放、窗框窗位的调节、切片选择、切片方向设置。
- 可以根据设置不同的切片方向显示不同方向的切面。
3维医学图像二视图
- 在医学图像中,不同方向的切面都有特定的名字;
- 矢状面(Sagital Plane):沿着身体前后径所做的与地面垂直的切面;
- 冠状面(Coronal Plane):沿着身体左右径所做的与地面垂直的切面;
- 横断面(Transverse/Axial Plane):与地面平行的切面。
vtkImageActor
- 是一个3维图像渲染Actor,通过纹理映射将图像映射到一个多边形上进行显示。功能类似于vtkImageViewer2。
图像融合
- 类vtkImageBlend实现图像融合,它可以接收多个图像输入,并输出其融合图像,即把几张图像融合叠在一起显示。
3.VTK图像基本操作
图像信息访问与修改
利用vtkImageData的方法:它提供了多个用于信息访问的函数,例如:
- GetDimensions(),获取图像维数;
- GetOrigin(),获取图像原点;
- GetSpacing(),获取图像像素间隔;
- 还有多个Set函数用于设置图像信息。
利用类vtkChangeImageInformation:利用这个类可以修改图像原点,像素间隔以及范围,还可以实现图像平移及缩放等操作。
图像像素的访问与修改
vtkImageData中提供了GetScalarPointer()函数数据数组指针,该函数有三种形式:
- virtual void *GetScalarPointer(int coordinates[3]):返回第(x,y,z)个像素的地址;
- virtual void *GetScalarPointer(int x,int y,int z):返回第(x,y,z)个像素的地址;
- virtual void *GetScalarPointer():返回图像数据的头指针;
- GetScalarPointer()返回的是void*类型,需要根据图像的具体数据类型强制转换,然后在根据返回的地址修改像素值。
用vtkImageIterator类实现迭代器方法访问图像像素,使用时需要提供迭代的图像像素类型以及迭代的区域大小。
图像类型转换
- 类vtkImageCast:只需要把该类的函数SetOutputScalarTypeToXXX()设置相应输出类型即可。
- 类vtkImageShiftScale:可以指定偏移和比例参数来对输入图像数据进行类型转换操作。
图影颜色映射
- 灰度图像映射
- 类vtkImageLuminance:负责将RGB彩色图像转化为单分组的灰度图像,
- 提取颜色分组
- 类vtkImageExtractComponents:提取彩色图像的各个颜色组分,使用该类时只需要设置要提取的组分序号即可。
- 图像彩色映射
- 类vtkImageMapToColors:实现图像彩色映射,以vtkLookUpTable类生成颜色查找表。原理时先生成颜色查找表,然后根据图像像素的一个标量值在颜色查找表中查找对应的颜色。
- 颜色合成
- 前面提到彩色图像的各个颜色组分,VTK也支持将多个灰度图像合并成一个彩色图像,类vtkImageAppendComponents类可以用来合成彩色图像。其输入需要提供三个灰度图像。合成效果为三个图像中对应的三个像素点的像素值合成一个RGB值,如三个图像中100像素的像素值分别为255,0,0,那么合成图像中该点像素值为(255,0,0),为红色。
- 灰度图像映射
区域提取
- 提取感兴趣的区域
- 感兴趣区域(Volume of Interest,VOI)是图像内部的一块子区域,在VTK中vtkExtractVOI类可根据用户指定的区域提取子图像。
- 三维图像切面提取
- VTK中vtkImageReslice类图像切面的提取。
- 提取感兴趣的区域
直方图统计
- 灰度图像直方图
- vtkImageAccumulate类用于实现直方图统计功能,他将每个分组的数值范围离散的间隔,然后统计每个灰度间隔上的像素数目。虽然vtkImageAccumulate输出的类型为vtkImageData,但是不能直接一图像的方式显示。
- vtkBarChartActor类用来显示条形图,可以利用它来显示直方图,但该接受的数据类型为vtkDataObject类型,所以在显示之前需要类型转换。
- 彩色图像直方图
- 彩色图像有3个颜色通道,因此需要提取RGB3个通道数据分别计算直方图。每个通道计算直方图的方法与灰度图像直方图的计算方法一致。
- 灰度图像直方图
图像重采样
- 图像重采样是指对数字图像按所需的像素位置或像素间距重新采样,以构成几何变换后的新图像。当重采样图像维数小于源图像时,称为降采样,当重采样图像维数大于源图像时,称为升采样。
- 类vtkImageShrink3D用于实现图像降采样,图像会更模糊。
- 类vtkImageMagnify用于实现图像升采样。
图像运算
- 数学运算:vtkImageMathematics提供了基本的一元二元数学操作。
- 逻辑运算:vtkImageLogic接受一个或两个图像进行布尔逻辑运算,该类只要支持与、或、异或、与非、或非、非等操作。
- 上述两个操作,两个输入的图像输入图像的类型必须保持一致。
图像二值化
- 图像二值化是一个最简单的图像分割模型,设置一个灰度阈值,将图像中阈值以下的像素设置为背景,阈值以上的设置为前景,即可得到一副二值图像。
- vtkImageThreshold类可实现图像阈值化处理:
- ThresholdByUpper():取大于阈值的灰度范围为有效范围;
- ThresholdByLower():取小于阈值的灰度范围为有效范围;
- ThresholdBetween():取大于UpperThreshold和LowerThreshold之间的部分为有效范围;