前言

  • 该篇只简单整理VTK图像处理的函数以及对应的功能,详细内容以及具体源码参见《VTK图形图像开发进阶》第五章。

  • 《VTK图形图像开发进阶》下载地址:

    链接:https://pan.baidu.com/s/1hG9js6eZkTqL6Fh-b_C-Dg
    提取码:cod8

    1.图像创建

  • 图像源Source

    • VTK内置了很多创建图像的Source类,可以创建点、线段、圆、矩形等图像。
    • vtkImageCanvasSousce2D:创建画布(空白图像);
    • vtkImageEllipsoidSousce:创建前景为椭圆的二值图像;
    • vtkImageGaussianSousce:高斯分布图像;
    • vtkImageGridSousce:网格图像;
    • vtkImageSinusoidSousce:像素值有正弦函数决定的图像;
  • 直接创建图像

    • 手动生成vtkImageData图像数据,再给像素赋值。

      2.图像显示

  • 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之间的部分为有效范围;

推荐阅读: