1.三维图像切片提取

切片是指三维图像中的一个切面对应的图像。切面可以是过图像内部一点且平行于XY、YZ、XZ平面的平面,也可以是任意的过三维图像内部一点任意方向的平面。通过提取切片可以方便的浏览和分析图像内部组织结构,是医学图像浏览软件中的一个重要的功能。在VTK中vtkImageReslice类实现图像切片提取功能。

下面是切片提取的代码:


#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkMetaImageReader.h>
#include <vtkMatrix4x4.h> //
#include <vtkImageReslice.h>
#include <vtkLookupTable.h>
#include <vtkImageMapToColors.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>int main(int argc, char *argv[])
{vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New(); //创建读取dicom图片指针对象reader->SetDirectoryName("D:/workSpace/DICM/sunguihua/SGH"); //设置医学图像文件夹路径reader->SetDataByteOrderToLittleEndian();reader->Update();cout << "读取数据完成" << endl;int extent[6];double spacing[3];double origin[3];reader->GetOutput()->GetExtent(extent);reader->GetOutput()->GetSpacing(spacing);reader->GetOutput()->GetOrigin(origin);double center[3];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]);//*****************************************************************//static double axialElements[16] = {1, 0, 0, 0,0, 1, 0, 0,0, 0, 1, 0,0, 0, 0, 1};vtkSmartPointer<vtkMatrix4x4> resliceAxes =vtkSmartPointer<vtkMatrix4x4>::New();resliceAxes->DeepCopy(axialElements);resliceAxes->SetElement(0, 3, center[0]);resliceAxes->SetElement(1, 3, center[1]);resliceAxes->SetElement(2, 3, center[2]);vtkSmartPointer<vtkImageReslice> reslice =vtkSmartPointer<vtkImageReslice>::New();reslice->SetInputConnection(reader->GetOutputPort());reslice->SetOutputDimensionality(2);reslice->SetResliceAxes(resliceAxes);reslice->SetInterpolationModeToLinear();//*****************************************************************//vtkSmartPointer<vtkLookupTable> colorTable =vtkSmartPointer<vtkLookupTable>::New();colorTable->SetRange(-500, 1500);colorTable->SetValueRange(0.0, 1.0);colorTable->SetSaturationRange(0.0, 0.0);colorTable->SetRampToLinear();colorTable->Build();vtkSmartPointer<vtkImageMapToColors> colorMap =vtkSmartPointer<vtkImageMapToColors>::New();colorMap->SetLookupTable(colorTable);colorMap->SetInputConnection(reslice->GetOutputPort());colorMap->Update();//*****************************************************************//vtkSmartPointer<vtkImageActor> imgActor =vtkSmartPointer<vtkImageActor>::New();imgActor->SetInputData(colorMap->GetOutput());vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(imgActor);renderer->SetBackground(0.4, 0.5, 0.6);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderWindow->Render();renderWindow->SetSize(640, 480);renderWindow->SetWindowName("Extract3Dslice");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> imagestyle =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(imagestyle);rwi->SetRenderWindow(renderWindow);rwi->Initialize();rwi->Start();return 0;}

首先通过vtkMetaImageReader读取一张医学三维图像,并获取得到图像范围(extent),原点和像素间隔;由这三个参数可以计算图像的中心位置center;接下来定义了切面的变换矩阵axialElements,该矩阵的前三列分别表示x、y和z方向向量,第四列为中心点坐标;

2.切面的定义

理解:VTK的切面,是在切面坐标系下进行的,总是垂直Z轴方向,原点位置进行切割的。因此需要把三维图像变换到切面坐标系中进行切割。

vtkSmartPointer<vtkMatrix4x4> resliceAxes = vtkSmartPointer<vtkMatrix4x4>::New();reslice->SetResliceAxes(resliceAxes);

首先通过vtkDICOMImageReader读取一张医学三维图像,并获取得到图像范围(extent),原点和像素间隔;由这三个参数可以计算图像的中心位置center;接下来定义了切面的变换矩阵axialElements,该矩阵的前三列分别表示x、y和z方向向量,第四列为中心点坐标;

代码中的axialElements表示切面变换矩阵与当前坐标系一致,且切面为过中心点center,并平行于XY平面的平面(垂直Z轴),当前,定义该切面时,也可以是其他平面,甚至是任意平面,但是必须要过图像内部点。

下面给出了一个常用的变换矩阵。

提取平行于XY平面的切片:

static double axialElements[16] = {1, 0, 0, 0,0, 1, 0, 0,0, 0, 1, 0,0, 0, 0, 1};

提取平行于XZ平面的切片:

static double coronalElements[16] = {1, 0, 0, 0,0, 0, 1, 0,0,-1, 0, 0,0, 0, 0, 1 };

提取平行于YZ平面的切片:

static double sagittalElements[16] = {
0, 0,-1, 0,
1, 0, 0, 0,
0,-1, 0, 0,
0, 0, 0, 1 };

提取斜切切片:

static double obliqueElements[16] = {
1, 0, 0, 0,
0, 0.866025, -0.5, 0,
0, 0.5, 0.866025, 0,
0, 0, 0, 1 };

注意:使用这些变换矩阵的时候,需要将第四列替换为切片经过图像的一个点坐标,上例中将图像的中心添加到axialElements矩阵,并通过函数SetResliceAxes设置变换矩阵,SetOutputDimensionality(2)指定输出的图像为一个二维图像;而函数SetInterpolationModeToLinear()则指定了切面提取中的差值方式为线性差值,另外该类中还提供了其他的插值方式:
SetInterpolationModeToNearestNeighbor():最近邻方式
SetInterpolationModeToCubic():三次线性差值
设置完毕后,执行Update()即可完成切面计算。

VTK_Learning_三维图像切片(一)相关推荐

  1. VTK修炼之道27:图像基本操作_三维图像切片交互提取(回调函数、观察者-命令模式)

    1.鼠标滑动提取三维图像切片 学习三维图像切面的提取后,我们可以实现一个稍微复杂的程序--通过滑动鼠标来切换三维图像切片,这也是医学图像处理软件中一个很基本的功能.实现该功能难点是怎样在VTK中控制鼠 ...

  2. VTK修炼之道26:图像基本操作_三维图像切片提取

    1.三维图像切片提取 切片是指三维图像中的一个切面对应的图像.切面可以是过图像内部一点且平行于XY.YZ.XZ平面的平面,也可以是任意的过三维图像内部一点任意方向的平面.通过提取切片可以方便的浏览和分 ...

  3. VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互

    VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互 一.四视图介绍 vs直接创建Qt Widgets Application项目 四视图界面,采用vtk和QVTKOpenGLNativeWidge ...

  4. 浅谈二维和三维图像数据

    首先对于任何一个二维图像,加载入内存后都能看作一个二维像素数组.假如是一张8位图像,它的每个像素值可以用一个0~255的unsigned char表示,也就是说图像可以看成一个unsigned cha ...

  5. matlab如何对三维图进行裁剪,一种三维图像的裁剪方法

    一种三维图像的裁剪方法 [技术领域] [0001] 本发明涉及图像处理技术领域,尤其涉及一种三维图像的裁剪方法. [背景技术] [0002] 无论是为了获得对象的完美三维(3D)图像,还是需要在对象的 ...

  6. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

  7. “后浪95后”吴尚哲的 CVPR 最佳论文:无需任何监督,即可重建三维图像

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 我有一张二维照片,能让它变成三维图像么?可以,当前的一些3D电影相册工具,给图片加一个相框也能形成动态 ...

  8. R语言使用persp函数绘制三维图像实战(3D):自定义3D图、图像旋转、添加轴标签

    R语言使用persp函数绘制三维图像实战(3D):自定义3D图.图像旋转.添加轴标签 目录

  9. python【Matlibplot绘图库】-绘制三维图像

    文章目录 1.绘制三维图像 2.plt.axes() 1.绘制三维图像 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import ...

最新文章

  1. [日常]总结2016年7月入职至2016年7月26号微盘所遇bug
  2. Lambda表达式常用代码示例
  3. Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json
  4. api怎么写_PHP开发api接口安全验证
  5. 微型计算机与接口技术考试题,微机原理与接口技术试题库2
  6. 数据结构之字典序全排列
  7. scala 线性回归_Scala的特征线性化
  8. 小顶堆时间复杂度_时间轮算法以及时间轮在Netty和Kafka中的应用的
  9. 计算机上机考试的系统,计算机上机考试系统
  10. 宝石争霸如何保存进度
  11. 高通Snapdragon Sensor Core(SSC)笔记
  12. PostgreSQL 导入和导出 CSV
  13. 计算机一级系统压缩密码,压缩文件加密,教您给winRAR压缩的文件设置密码
  14. 【工业相机】【深度3】相机选择-精度和曝光需求计算 - 输入:1 被测试物体的最小体积 2 被测物体的移动相对速度
  15. ASP + Serv-u 實現FTP的代碼
  16. 导航地图分类隐私政策
  17. 中山培训学校python
  18. 01-css经典布局整理-圣杯布局
  19. 电脑上使用计算机命令行,我的电脑运行命令_我的电脑什么运行命令
  20. 软件测试 | 测试开发 | 视频编辑SDK测试

热门文章

  1. OK6410开发板学习之安装linux系统至开发板
  2. 随笔记录 松下烘干洗衣机门打不开怎么处理
  3. ITE IT66353FN/AW HDMI 重新定时器开关
  4. 软考高级-系统架构设计师 经验总结
  5. 【重构篇js案例解析重构】第一章 重构的原则
  6. opporeno5k信息加密方法分享
  7. ECM技术学习:基于模板的帧内模式推导(Template based intra mode derivation )
  8. matlab画xyz的等高线图,matlab如何画等高线图
  9. 【推荐】pairwise、pointwise 、 listwise算法是什么?怎么理解?主要区别是什么?
  10. 晶体管和mos管区别,MOS管是什么?