当前位置: 首页 > 网络知识

VTK vtkImageReslice

时间:2026-01-27 08:40:00

三维图像切面提取
  切片(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。



上一篇:C++ 设计模式之模板方法模式
下一篇:C++ 设计模式之外观模式
VTK
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素