学习笔记5

本文概述了VTK库在图像处理中的关键应用,如子图像提取、图像切片、直方图统计、边缘检测、重采样和滤波操作。重点介绍了vtkExtractVOI、vtkImageReslice、vtkImageAccumulate和相关类的使用方法。此外,文章提到了VTK与其他技术(如ITK)的结合可能性,以及边缘检测算法如Sobel、Canny和拉普拉斯的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Vtk

05-VTK在图像处理中的应用(4)

  1. 在VTK中vtkExtractVOI类实现由用户指定的区域范围提取图像的子图像。该Filter的输入和输出都是一个vtkImageData,因此其结果可以直接作为图像保存。
  2. 定义vtkExtractVOI对象,该对象接收两个输入一个是图像数据,第二个是区域大小。设置区域大小的函数原型:

void SetVOI(int _arg1, int _arg2, int _arg3, int _arg4, int _arg5, int _arg6)

void SetVOI(int _arg[])

共6个参数,依次表示x方向最小值,x方向最大值,y方向最小值,y方向最大值,z方向最小值和z方向最大值。

  1. 在VTK中vtkImageReslice类实现图像切片提取功能 
  2. vtkMetaImageReader读取一副医学三维图像
  3. 图像范围(extent),原点origin和像素间隔spacing 

计算图像中心:

center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);

center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);

center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

  1. 切面的变换矩阵

static double axialElements[16] = {

     1, 0, 0, 0,

      0, 1, 0, 0,

     0, 0, 1, 0,

      0, 0, 0, 1 };切面为过中心点center,并平行于XY平面的平面

static double coronalElements[16] = {

1, 0, 0, 0,

 0, 0, 1, 0,

0,-1, 0, 0,

 0, 0, 0, 1 }; 提取平行于XZ平面的切片

static double sagittalElements[16] = {

 0, 0,-1, 0,

 1, 0, 0, 0,

 0,-1, 0, 0,

 0, 0, 0, 1 }; 提取平行于YZ平面的切片

static double obliqueElements[16] = {

 1, 0, 0, 0,

 0, 0.866025, -0.5, 0,

 0, 0.5, 0.866025, 0,

 0, 0, 0, 1 }; 提取斜切切片

7.SetOutputDimensionality(2)指定输出的图像为一个二维图像;而函数SetInterpolationModeToLinear()则指定了切面提取中的差值方式为线性差值,另外该类中还提供了其他的差值方式:

SetInterpolationModeToNearestNeighbor():最近邻方式

SetInterpolationModeToCubic():三次线性差值

  1. 通过滑动鼠标来切换三维图像切片 功能难点是怎样在VTK中控制鼠标来实时提取图像切片 观察者/命令(Observer/Command)模式 VTK中鼠标消息是在交互类型对象(interactorstyle)中响应,因此通过为交互类型对象(interactorstyle)添加观察者(observer)来监听相应的消息,当消息触发时,由命令模式执行相应的回调函数

05-VTK在图像处理中的应用(5)

  1. VTK中实现直方图统计功能的filter是vtkImageAccumulate SetComponentExtent(0,bins-1, 0, 0, 0, 0),该函数设置要计算每个组分的直方图的最小和最大值 SetComponentOrigin(0,0, 0),该函数设置的是统计每个组分直方图时的起始灰度值,SetComponentSpacing(16,0, 0),设置直方图每个间隔代表的灰度范围
  2. 虽然vtkImageAccumulate的输出类型为vtkImageData但是并不能直接按照图像的方式进行显示。VTK中定义了vtkBarChartActor用来显示条形图,因此可以利用其来显示直方图
  3. 图像重采样是指对采样后形成的由离散数据组成的数字图像按所需的像元位置或像元问距重新采样,以构成几何变换后的新图像。重采样过程本质上是图像恢复过程,它用输入的离散数字图像重建代表原始图像二维连续函数,再按新的像元间距和像元位置进行采样。其数学过程是根据重建的连续函数(曲面),用周围若干像元点的值估计或内插出新采样点的值。图像重采样在图像处理中应用非常广泛,如SIFT特征提取。
  4. 图像重采样后图像的维数会发生改变。当重采样图像小于原图像维数时,称为降采样;当重采样图像维数大于原图像时,称为升采样。vtkImageShrink3D类实现图像降采样。降采样需要设置每个方向的采样率,降采样率越大,图像越模糊。升采样的原理与降采样原理一致,只是增加采样点数来增加图像的维数。VTK中vtkImageMagnify来实现图像的升采样。

05-VTK在图像处理中的应用(6)

1.vtkImageMathematics中支持的二元数学操作有:

SetOperationToAdd:两个图像对应像素加法运算

SetOperationToSubtract:两个图像对应像素减法运算

SetOperationToMultiply:两个图像对应像素相乘运算

SetOperationToDivide:两个图像对应像素相除运算

SetOperationToConjugate:将两个标量图像对应像素组合为共轭复数

SetOperationToComplexMultiply:两个图像对应像素复数乘法运算

SetOperationToMin:取两个图像中对应像素较小值

SetOperationToMax:取两个图像中对应像素较大值

一元操作有:

SetOperationToInvert:图像像素值取倒数运算

SetOperationToSin:图像像素值正弦运算

SetOperationToCos:图像像素值余弦运算

SetOperationToExp:图像像素值自然指数运算

SetOperationToLog:图像像素值自然对数运算

SetOperationToAbsoluteValue:图像像素值取绝对值

SetOperationToSquare:图像像素值平方运算

SetOperationToSquareRoot:图像像素值平凡根运算

SetOperationToATAN:图像像素值正切运算

SetOperationToATAN2:图像像素值反正切运算

SetOperationToMultiplyByK:图像像素值乘以常数K,需要先调用SetConstantK()设置K值

SetOperationToAddConstant:图像像素值加上常数K,需要先调用SetConstantK()设置K值

SetOperationToReplaceCByK:将图像中像素为C的像素值替换为K,需要先调用SetConstantK()和SetConstantC设置K和C值

  1. vtkImageLogic接收一个或者两个图像进行布尔逻辑运算,该类主要支持与(AND),或(OR),异或(XOR),与非(NAND),或非(NOR)和非(NOT)。当选择一元操作符时,只对第一个输入图像有效。 当选择二元操作符时,两个输入图像的类型必须一致
  2. 对于二值图像前景由多个对象组成,而每个对象是一个连通分量,对象之间不存在连通关系。在处理图像时,需要将不同的对象分别提取出来或者将不同对象赋一个label值,这样得到的图像成为label图像。目前VTK中没有提取二值图像连通分量的filter以及相应的对二值图像label化的filter。如果要实现该功能,可以考虑与ITK相结合。label图像能够在一个图像中表示多个对象,比如一个腹部的CT图像,我们要分割出肝脏和肾脏,那么在分割结果中背景的label值可以表示为0,肝脏的表示为1,肾脏的表示为2

05-VTK在图像处理中的应用(7)

  1. 图像中不连续的灰度值会产生边缘,图像的边缘检测是基于边界的图像分割方法的基础,例如分水岭算法,通常是分割原图的梯度图像,梯度实际上也是反应的图像边缘信息。图像边缘一般常用图像一阶导数和二阶导数来检测。
  2. VTK中可以使用vtkImageGradient计算图像梯度
  3. 梯度是一个向量,不能直接显示。因此上面代码中定义了vtkImageMagnitude对象来计算梯度向量的2范数,即向量的模
  4. 索贝尔算子(Sobel)
  5. Canny算子是John Canny于20世纪80年代提出的一种多级边缘检测算法。John Canny研究了最优边缘的特性,即检测到的边缘要尽可能跟实际的边缘接近并尽可能的多,同时,要尽量降低噪声对边缘检测的干扰。其计算步骤如下

1)对源图像进行高斯平滑以消除图像中噪声

2)采用差分法近似计算图像每一个像素的梯度,并计算梯度的模值和方向

3)对梯度进行"非极大抑制":图像边缘点梯度值通常在梯度方向是极大值,因此检测边缘需要将非极大值赋值0来抑制非边缘点。检测方法就是在一个局部窗口内,如果中心像素点的梯度不比梯度方向上相邻两个像素值大,那么该中心像素点梯度值赋0。

4)双阈值法检测边缘和连接边缘。取两个梯度阈值high和low,将梯度图像中小于high的像素赋0得到边缘图像I1,该图像能够接近图像边缘但是可能会存在间断点;将梯度图像中小于low的像素赋0得到边缘图像I2,该图中受噪声影响比较大,但是边缘信息更多。在连接边缘时,以I1为基础,对非零点进行边缘跟踪,如果追踪过程中出现中断,则从I2对应像素点及其邻域来寻找可以连接的边缘,直至结束。

vtkImageNonMaximumSuppression将图像中的非局部峰值设置为0,输入和输出类型都是vtkImageData:其中输入有两个,模值图像(magnitude)和向量图像,一个典型的应用就是输入梯度模值图像和梯度向量图像对梯度做非极大值抑制

vtkImageConstantPad增加图像的大小,其输入和输出都为vtkImageData。其中函数SetOutputNumberOfScalarComponents(3)用于设置输出图像的像素数据组分个数,函数SetConstant(0)用于设置输出图像中扩大的区域像素值。而SetOutputWholeExtent()则用于设置输出图像的范围。这里的作用是将梯度图像像素的组分修改为3,方便下面vtkImageToStructuredPoints使用。

6.拉普拉斯算子是一个二阶边缘算子,即梯度的散度,对于图像噪声比较敏感。拉普拉斯算子的结果为标量,表示边缘的宽度。但是它常产生双像素宽边缘,而且不能提供方向信息,因此较少直接用于边缘检测。在VTK中由vtkImageLaplacian实现

  • 论文

语言c++ Qt做ui python跑出模型 转到c++中使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值