计算机系统:Win8.1( 64 bit )
VTK版本:6.2.0
1 说明
关于三维数据的重切主要通过vtkImageReslice实现(实例:ImageSlicing),而更加方便的是通过vtkImagePlaneWidget类来实现( 实例:FourPaneViewer,或者TestImagePlaneWidget.py )。在例子ImageSlicing中,实现的是对体数数据整体切割,而在例FourPaneViewer中,可以实现对对体数据的局部切割。实例FourPaneViewer比较复杂,参考资料[5]中简单说明了vtkImagePlaneWidget的用法。在实际过程中,发现快捷键无效,根据参考资料[6]的说明可知,这是VTK本身的bug,因此为了避免使用快捷键,要自行设计button。
2 2D坐标-->3D坐标
使用上述方法获得切片后,切片的坐标是2D的,如何将其转换为对应的3D坐标呢?这是一个问题。从2D坐标到3D坐标的转换,其实是从一个坐标系到另外一个坐标系的转换(《坐标系转换》)。
vtkImagePlaneWidget函数GetResliceAxes()可以获得一个转换矩阵(vtkMatrix4x4),根据《坐标系转换》第3章的公式,将虚拟切片的2D坐标拓展到4D,其第3维和第4维分为别为0和1,然后使用转换矩阵乘以这拓展后的坐标,即可得到一个新的4D坐标(齐次坐标)。这个新的4D坐标的最前3维就是虚拟切片的2D坐标所对应的3D坐标。
具体实现代码如下:
double in[4], *out;
in[0] = 274; % 将2D坐标(274,363)拓展为(274,363,0,1)
in[1] = 363;
in[2] = 0;
in[3] = 1;
vtkMatrix4x4 *mat = imagePlaneWidget->GetReslice()->GetResliceAxes(); % 获取转换矩阵
out = mat->MultiplyDoublePoint(in); % out中的前3个元素即是对应的3D坐标
参考资料
[2]基于VTK的任意平面切割
[4]VTK鼠标交互三例
[5] 胡战利. 基于VTK的医学图像三维重建及交互研究. 哈尔滨工业大学. 2008年1月