VTK vtkImageReslice


三维图像切面提取
  切片(Slice)或切面是三维图像比较常用的概念,尤其在医学图像中。通过提取切面可以方便地浏览和分析图像内部组织结构。VTK中vtkImageReSlice类可以实现图像切面的提取。在实际开发中,四视图中冠状视面、矢状面和横断面(显示过图像内部一点且平行于XY、YZ、XZ平面的平面),需要用到此类。

示例说明
CMakeLists.txt文件代码如下:

1 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 2 PROJECT(ImageResliceExample) 3 FIND_PACKAGE(VTK REQUIRED) 4 INCLUDE($) 5 ADD_EXECUTABLE(ImageResliceExample ImageResliceExamplepp) 6 TARGET_LINK_LIBRARIES(ImageResliceExample $)

ImageResliceExamplepp文件代码如下:

1 #include <vtkSmartPointer.h> 2 #include <vtkImageReader2.h> 3 #include <vtkMatrix4x4.h> 4 #include <vtkImageReslice.h> 5 #include <vtkLookupTable.h> 6 #include <vtkImageMapToColors.h> 7 #include <vtkImageActor.h> 8 #include <vtkRenderer.h> 9 #include <vtkRenderWindoh> 10 #include <vtkRenderWindowInteractor.h> 11 #include <vtkInteractorStyleImage.h> 12 #include <vtkCmand.h> 13 #include <vtkImageData.h> 14 #include <vtkMetaImageReader.h> 15 #include <vtkImageCast.h> 16 17 class vtkImageInteractionCallback : public vtkCmand 18 24 25 vtkImageInteractionCallback() 26 31 32 void SetImageReslice(vtkImageReslice *reslice) 33 36 37 void SetImageMapToColors(vtkImageMapToColors *mapToColors) 38 41 42 vtkImageReslice *GetImageReslice() 43 46 47 void SetInteractor(vtkRenderWindowInteractor *interactor) 48 51 52 vtkRenderWindowInteractor *GetInteractor() 53 56 57 virtual void Execute(vtkObject *, unsigned long event, void *) 58 70 else if (event == vtkCmand::LeftButtonReleaseEvent) 71 74 else if (event == vtkCmand::MouseMoveEvent) 75 100 else 101 108 } 109 } 110 } 111 112 private: 113 int Slicing; 114 vtkImageReslice *ImageReslice; 115 vtkRenderWindowInteractor *Interactor; 116 vtkImageMapToColors *mapToColors; 117 }; 118 119 int main() 120 ; 145 146 vtkSmartPointer<vtkMatrix4x4> resliceAxes = 147 vtkSmartPointer<vtkMatrix4x4>::New(); 148 resliceAxes>DeepCopy(axialElements); 149 150 resliceAxes>SetElement(0, 3, center[0]); 151 resliceAxes>SetElement(1, 3, center[1]); 152 resliceAxes>SetElement(2, 3, center[2]); 153 154 vtkSmartPointer<vtkImageReslice> reslice = 155 vtkSmartPointer<vtkImageReslice>::New(); 156 reslice>SetInputConnection(reader>GetOutputPort()); 157 reslice>SetOutputDimensionality(2); 158 reslice>SetResliceAxes(resliceAxes); 159 reslice>SetInterpolationModeToLinear(); 160 161 vtkSmartPointer<vtkLookupTable> colorTable = 162 vtkSmartPointer<vtkLookupTable>::New(); 1 colorTable>SetRange(0, 1000); 164 colorTable>SetValueRange(0.0, 1.0); 165 colorTable>SetSaturationRange(0.0, 0.0); 166 colorTable>SetRampToLinear(); 167 colorTable>Build(); 168 169 vtkSmartPointer<vtkImageMapToColors> colorMap = 170 vtkSmartPointer<vtkImageMapToColors>::New(); 171 colorMap>SetLookupTable(colorTable); 172 colorMap>SetInputConnection(reslice>GetOutputPort()); 173 colorMap>Update(); 174 175 vtkSmartPointer<vtkImageActor> imgActor = 176 vtkSmartPointer<vtkImageActor>::New(); 177 imgActor>SetInputData(colorMap>GetOutput()); 178 179 vtkSmartPointer<vtkRenderer> renderer = 180 vtkSmartPointer<vtkRenderer>::New(); 181 renderer>AddActor(imgActor); 182 renderer>SetBackground(1, 1, 1); 183 184 vtkSmartPointer<vtkRenderWindow> renderWindow = 185 vtkSmartPointer<vtkRenderWindow>::New(); 186 renderWindow>SetSize(500, 500); 187 renderWindow>AddRenderer(renderer); 188 189 vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 190 vtkSmartPointer<vtkRenderWindowInteractor>::New(); 191 vtkSmartPointer<vtkInteractorStyleImage> imagestyle = 192 vtkSmartPointer<vtkInteractorStyleImage>::New(); 193 194 renderWindowInteractor>SetInteractorStyle(imagestyle); 195 renderWindowInteractor>SetRenderWindow(renderWindow); 196 renderWindowInteractor>Initialize(); 197 198 vtkSmartPointer<vtkImageInteractionCallback> callback = 199 vtkSmartPointer<vtkImageInteractionCallback>::New(); 200 callback>SetImageReslice(reslice); 201 callback>SetInteractor(renderWindowInteractor); 202 callback>SetImageMapToColors(colorMap); 203 204 imagestyle>AddObserver(vtkCmand::MouseMoveEvent, callback); 205 imagestyle>AddObserver(vtkCmand::LeftButtonPressEvent, callback); 206 imagestyle>AddObserver(vtkCmand::LeftButtonReleaseEvent, callback); 207 208 renderWindowInteractor>Start(); 209 return EXIT_SUCCESS; 210 }

运行结果:

按下鼠标左键,移动鼠标时的gif图片:

代码解释:
先通过vtkMetaImageReader读取一副三维图像,获取图像范围、原点和像素间隔,由这三个参数可以计算图像的中心位置。
接下来定义了切面的变换矩阵axialElements,该矩阵的前三列分别表示X、Y和Z方向矢量,第四列为切面坐标系原点。通过修改切面坐标系原点,可以得到不同位置的切面图像。
然后将读取的图像作为vtkImageReslice的输入,通过函数SetResliceAxes()设置变换矩阵resliceAxis。



上一篇:VTK 生成MIP图像-vtkImageSlabReslice类

下一篇:SimpleITK 读取医学影像文件


VTK
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图