首页 > 其他分享 >VTK 生成MIP图像-vtkImageSlabReslice类

VTK 生成MIP图像-vtkImageSlabReslice类

时间:2023-07-13 11:25:09浏览次数:46  
标签:double VTK vtkImageSlabReslice reslice MIP include vtkNew

MIP
  MIP(Maximum/Minimum Intensity Projection),最大/最小密度投影重建。
  MIP可以较真实地反应组织密度差异,使得血管的异常改变、形态、走形强化;但是只适用于外观形态的显示。
  在容积扫描数据中对每条径线上每个像素的最大强度值进行编码并投射成像。MIP的灰阶度反映CT值的相对大小,且比较敏感,即使小的差异也能被检测,如钙化灶、骨骼CT非常高,充盈对比剂的血管同样很高的CT值,但总是低于钙化灶和骨骼,在MIP图像上,其亮度不一样,可区分。

MIP应用价值(最大密度投影重建)

  广泛应用于具有相对高密度的组织和结构,如显影的血管、骨骼、肺部肿块以及明显强化的软组织病灶等,对于密度差异甚小的组织结构以及病灶则难以显示。

最小密度投影重建(MinP)

  它是在某一平面方向上对所选取的三维组织层块中的最小密度进行投影,主要用于气道的显示。偶尔也用于肝脏增强后肝内扩张胆管的显示。
  多张胸部CT图像生成的MIP;

vtkImageSlabReslice

  vtkImageSlabReslice类派生自vtkImageReslice类,在切片的基础上,可以设定Slab的厚度,进行多切面的投影叠加。由于vtkImageReslice类继承自vtkThreadedImageAlgorithm类,内部是多线程的,使用方法SetNumberOfThreads()来设置线程个数。vtkImageSlabReslice类以三维图像为输入,沿某一方向产生一个二维的有一定厚度的MPR。
  很像vtkimanageslice,reslice轴方向余弦可以通过SetResliceAxes或SetResliceAxesDirectionCosines方法设置。输出间距由SetOutputSpacing控制,输出原点由SetOutputOrigin控制。重新格式化时,由SetBackgroundColor或SetBackgroundLevel控制的位于Volume外部的像素的默认值。SetResliceAxesOrigin()方法还可以用于提供切片将通过的(x,y,z)点。
  注意:vtkGPUVolumeRayCastMapper类也有MIP的体渲染方式,具体使用请看官方文档;

接口
投影方式
  vtkImageSlabReslice类使用混合函数获取有厚度的切片图像,支持的混合函数包括穿过板的最小强度混合(VTK_IMAGE_SLAB_MIN)、最大强度混合(VTK_IMAGE_SLAB_MAX)和穿过板的平均(平均)强度值(VTK_IMAGE_SLAB_MEAN)。

1 int BlendMode;
2 vtkSetMacro(BlendMode, int);
3 vtkGetMacro(BlendMode, int);
4 void SetBlendModeToMin() { this->SetBlendMode(VTK_IMAGE_SLAB_MIN); }
5 void SetBlendModeToMax() { this->SetBlendMode(VTK_IMAGE_SLAB_MAX); }
6 void SetBlendModeToMean() { this->SetBlendMode(VTK_IMAGE_SLAB_MEAN); }

板间距
  板间距是切片层与切片层之间的距离,是在世界坐标系下的真实距离,单位为mm;
板内层个数NumBlendSamplePoints可以由SlabThickness和SlabResolution计算得到,即(2 x (int)(0.5 x SlabThickness/SlabResolution)) + 1;

1 double SlabResolution;
2 vtkSetMacro(SlabResolution, double);
3 vtkGetMacro(SlabResolution, double);

板厚

  SlabThickness用来记录板的厚度,必须是非0的正数;

1 double SlabThickness;
2 vtkSetMacro(SlabThickness, double);
3 vtkGetMacro(SlabThickness, double);

切片层个数
  NumBlendSamplePoints是指在板内横截面使用的采样点数。如果NumBlendSamplePoints等于1,就相当是vtkImageReslice,一个薄的Reslic切片;NumBlendSamplePoints可以由SlabThickness和SlabResolution计算得到;

1 int NumBlendSamplePoints;   
2 vtkGetMacro(NumBlendSamplePoints, int);  

示例

 1 #include "vtkMetaImageReader.h"
 2 #include "vtkImageData.h"
 3 #include "vtkMatrix4x4.h"
 4 #include "vtkImageReslice.h"
 5 #include "vtkLookupTable.h"
 6 #include "vtkImageMapToColors.h"
 7 #include "vtkImageActor.h"
 8 #include "vtkImageMapper3D.h"
 9 #include "vtkRenderer.h"
10 #include "vtkRenderWindow.h"
11 #include "vtkRenderWindowInteractor.h"
12 #include "vtkInteractorStyleImage.h"
13 #include "vtkImageSlabReslice.h"
14 #include "vtkAutoInit.h" 
15 VTK_MODULE_INIT(vtkRenderingOpenGL2);
16 VTK_MODULE_INIT(vtkInteractionStyle);
17 
18 using namespace std;
19 int main() {
20     vtkNew<vtkMetaImageReader> reader;
21     reader->SetFileName("D:\\brain.mhd");
22     reader->Update();
23 
24     int extent[6];
25     double spacing[3];
26     double origin[3];
27 
28     reader->GetOutput()->GetExtent(extent);
29     reader->GetOutput()->GetSpacing(spacing);
30     reader->GetOutput()->GetOrigin(origin);
31 
32     double center[3];
33     center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
34     center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
35     center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
36 
37     static double axialElements[16] = {
38         1, 0, 0, 0,
39         0, 1, 0, 0,
40         0, 0, 1, 0,
41         0, 0, 0, 1
42     };
43 
44     vtkNew<vtkMatrix4x4> resliceAxes;
45     resliceAxes->DeepCopy(axialElements);
46     resliceAxes->SetElement(0, 3, center[0]);
47     resliceAxes->SetElement(1, 3, center[1]);
48     resliceAxes->SetElement(2, 3, center[2]);
49 
50     vtkNew<vtkImageSlabReslice> reslice;
51     reslice->SetInputConnection(reader->GetOutputPort());
52     reslice->SetOutputDimensionality(2);
53     reslice->SetResliceAxes(resliceAxes);
54     reslice->SetInterpolationModeToLinear();
55     reslice->SetSlabThickness(200);
56     reslice->SetBlendModeToMax();
57     reslice->Update();
58 
59     vtkNew<vtkLookupTable> colorTable;
60     colorTable->SetRange(0, 1000);
61     colorTable->SetValueRange(0.0, 1.0);
62     colorTable->SetSaturationRange(0.0, 0.0);
63     colorTable->SetRampToLinear();
64     colorTable->Build();
65 
66     vtkNew<vtkImageMapToColors> colorMap;
67     colorMap->SetLookupTable(colorTable);
68     colorMap->SetInputConnection(reslice->GetOutputPort());
69 
70     vtkNew<vtkImageActor> imgActor;
71     imgActor->GetMapper()->SetInputConnection(colorMap->GetOutputPort());
72 
73     vtkNew<vtkRenderer> renderer;
74     renderer->AddActor(imgActor);
75     renderer->SetBackground(1.0, 1.0, 1.0);
76 
77     vtkNew<vtkRenderWindow> renderWindow;
78     renderWindow->AddRenderer(renderer);
79     renderWindow->Render();
80     renderWindow->SetSize(640, 480);
81     renderWindow->SetWindowName("ImageResliceExample");
82 
83     vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
84     vtkNew<vtkInteractorStyleImage> imagestyle;
85 
86     renderWindowInteractor->SetInteractorStyle(imagestyle);
87     renderWindowInteractor->SetRenderWindow(renderWindow);
88     renderWindowInteractor->Initialize();
89     renderWindowInteractor->Start();
90     return 0;
91 }

SetSlabThickness使用2.0的效果;

 SetSlabThickness使用20.0的效果;

 SetSlabThickness使用200.0的效果;

 

标签:double,VTK,vtkImageSlabReslice,reslice,MIP,include,vtkNew
From: https://www.cnblogs.com/ybqjymy/p/17549862.html

相关文章

  • VTK vtkImageReslice
    三维图像切面提取切片(Slice)或切面是三维图像比较常用的概念,尤其在医学图像中。通过提取切面可以方便地浏览和分析图像内部组织结构。VTK中vtkImageReSlice类可以实现图像切面的提取。在实际开发中,四视图中冠状视面、矢状面和横断面(显示过图像内部一点且平行于XY、YZ、XZ平面的......
  • VTK 显示为 2D
    voidrestrict_to_2d(QVTKOpenGLNativeWidget*widget){//Settherenderwindow'smultisamplingto0.vtkRenderWindow*render_window=widget->renderWindow();render_window->SetMultiSamples(0);//Settherenderwindow'sstereoren......
  • 微网优化调度matlab 采用matlab+yalmip编制含分布式和储能的微
    微网优化调度matlab采用matlab+yalmip编制含分布式和储能的微网优化模型,程序采用15分钟为采集节点,利用cplex求解,程序考虑发电机的启停约束,程序运行可靠ID:1390640936432679......
  • VTK - 编译安装
    1.准备工作1-1.Qt(5.15)1-2.CMake(3.26.4)1-3.VTK源码(9.2.6)1-4.CUDA环境(1080ti/cudnn12/cuda536)以上环境自行安装准备2.下载VTK源码 VTK官网下载源码文件  Download|VTK  3.配置CMake配置cuda配置Qt配置VTK库的安装路径 配置编译好的库的安装......
  • VTK 设置视觉位置和焦点
    VTK基本视图说明:相机设置1renderer=vtk.vtkRenderer()2self.camera=renderer.GetActiveCamera()3self.camera.SetViewUp(0,-1,0)#设视角位置4self.camera.SetPosition(0,0,0)#设观察对象位5self.camera.SetFocalPoint(0,0,1)#设焦点最终效果z......
  • VTK 体绘制之vtkVolume
    基本概念vtkVolume类似于几何渲染中的vtkActor,用于表示渲染场景中的对象。除了存储基本的变换信息(平移、旋转、放缩等),其内部还存储了两个重要对象。这两个对象分别是vtkAbstactVolumeMapper对象和vtkVolumeProperty对象。相应的函数如下。1)voidSetMapper(vtkA......
  • 含微网的配电网优化调度yalmip 采用matlab编程,以IEEE33节点为算例,编写含sop和3个微网
    含微网的配电网优化调度yalmip采用matlab编程,以IEEE33节点为算例,编写含sop和3个微网的配电网优化调度程序,采用yalmip+cplex这段程序是一个微网系统的建模程序,用于对微网系统进行优化调度。下面我将对程序进行详细的解释和分析。原创文章,转载请说明出处,资料来源:http://imgcs.cn/5......
  • 浅谈生活中常见的三大应用程序架构(PE、ELF、Mach-O)、五大操作系统(windows、linux、mac
    ·今天不聊复杂的技术,就是想做一下科普。我们生活中常见的操作系统,大致有5种分别是 电脑: Windows linux    macos手机 androidiosWindows手机操作系统没有发展起来,不同的操作系统间软件不能......
  • 12. 100ASK-V853-PRO开发板 MIPI屏测试指南
    硬件要求:100ASK-V853-PRO开发板四寸MIPI屏软件要求:固件下载地址:链接:百度网盘提取码:sp6a固件位于资料光盘中的10_测试镜像/2.测试4寸MIPI屏/v853_linux_100ask_uart0.img1.硬件连接按照下图所示将MIPI屏连接开发板按照下图所示连接12V电源和两条Type-C数据线2.烧录......
  • 关于 mipi cphy 与 dphy 的理解
    客户提出问题:需要cphy的mipi的显示。由于对cphy与dphy不是很了解,查了一些资料。网上的资料。    好了,接下来看看3588核心板原理图。   来说一下自己的理解: mipiD/Cphyport0/1,这个phy, 这个phy有两个port,port是什么意思不知道,对于 ......