三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用

您所在的位置:网站首页 3d可视化建模方法 三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用

三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用

2023-11-14 09:19| 来源: 网络整理| 查看: 265

一、 概述

此系统实现了常见的VTK四视图,实现了很好的CT图像分割,可以用于骨骼,头部,肺部,脂肪等分割,,并且通过三维重建实现可视化。使用了第三方库 VTK,ITK 实现分割和生不重建。

窗口分为 (横断面)、冠状面、矢状面,和3D窗口;包含了体绘制和面绘制;

效果:

CT分割重建

二、 开发环境 

操作系统: Windows 10:

工具:Qt 5.12.4+ Visual Studio 2017,

使用开源库:VTK-8.1 ITK4.13。

三、主要任务:

图像的输入与预处理,组织或器官的分割与提取,由二 维轮廓线重构三维形体,基于规则体数据的三维表面重建;

四、图像重建介绍:

1.医学图像分割: 根据需要选择一定的特征量或指定特定的测量准则来检测图像中不同区域的一致性,根据检测出来的区域一致性将图像区别成不同区域,从而可以更加方便地进行进一步的分析和理解

2.医学图像分割方法: a.基于图像区域的方法:通过检测同一区域内的均匀性是否一致来将图像中的不同区域识别出来。 区域分割方法包括:阈值分割法,区域生长法,基于随机场的方法。 b.基于边缘检测的分割方法:边缘检测技术提取区域进行分割。 常用的边缘检测技术有:并行微分算子、基于边界曲线拟合的方法、基于局部图像的方法、串行边界查找等。 c.结合区域和边缘信息的方法:采用基于形变模型的方法将基于区域的分割方法和边缘检测方法结合起来进行图像分割处理。

3.医学图像三维可视化 : 将医学影像设备输出的二维切片图像序列重新组合重建为三维图像模型,并对重建后的模型进行定性定量分析的技术;

三维重建方法: a.面绘制:表面重建,即从医学影像设备输出的切片数据集构造出三维数据,然后在三维数据中抽取出等值面,然后进行三角剖分,获得三角形面片,在用图形学中的图元绘制技术将三角形面片绘制出来实现表面绘制。 根据用户需要提取的目标物体的属性设定一个特定的阈值,从体数据中提取到与该阈值相同的数据点,并根据三角剖分分为若干个三角面片集,在利用图形学中基本的三角形图元的绘制方法对三角面片进行渲染,形成三维图像。 常用的面绘制算法有:移动立方体算法,剖分立方体算法,立方体算法。 b.体绘制:。将体数据中的“体素”作为基本的绘制单位。把体数据中的每个体素看成是可以接收或发出光线的点,选择光照模型,对体素进行分类并根据其实际的介质属性分配不同的颜色和不透明度,并沿着视线观察的方向进行合成,在视点所在的位置形成具有一定颜色和透明度的三维投射图像。 常用的体绘制算法有:光线投射算法、错切变形法、和基于硬件的3D纹理映射算法。

医学图像三维重建流程: 获得和封装体数据、模型的建立、映射体数据、三维图形绘制。 体数据分类(根据三维空间上每个数据点之间的相互关系):结构化体数据、非结构化体数据、结构化和非结构化混合型体数据

五、主要实现过程

1.数据读取:

reader = vtkSmartPointer::New(); reader->SetDirectoryName(path.toStdString().c_str()); reader->Update();

 这里有一个bug,VTK 读取会丢失信息;

后面换成 ITK

2.CT分割

这里我们使用了 阈值分割,则CT图像的CT值在这个阈值内的保留原值不变,小于下界阈值的变黑,大于上界阈值的变白。

vtkNew threshould; threshould->SetInputData(reader->GetOutput()); threshould->ThresholdBetween(LowValue, HighValue); threshould->SetInValue(1024); threshould->SetOutValue(-1024);

效果:

可以看到肺部已经被分割出来

4、三维重建:

面绘制,这里使用 阈值分割后的结果:

vtkSmartPointer< vtkMarchingCubes > boneExtractor = vtkSmartPointer< vtkMarchingCubes >::New(); boneExtractor->SetInputConnection(threshould->GetOutputPort()); boneExtractor->SetValue(0, 400); //设置提取的等值信息 boneExtractor->Update();

面绘制具体可见:

vtk 常用绘制方法 vtkMarchingCubes 面绘制_恋恋西风的博客-CSDN博客

效果,这里使用了 肺部,骨头两种测试:

 体绘制:

这里同样使用阈值分割后的结果

vtkSmartPointer volumeMapper = vtkSmartPointer::New(); volumeMapper->SetInputData(threshould->GetOutput());; volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance() / 2); //设置光线采样距离 //volumeMapper->SetAutoAdjustSampleDistances(0);//设置图像采样步长 //volumeMapper->SetImageSampleDistance(4); /*************************************************************************/ vtkSmartPointer volumeProperty = vtkSmartPointer::New(); volumeProperty->SetInterpolationTypeToLinear(); volumeProperty->ShadeOn(); //打开或者关闭阴影测试 volumeProperty->SetAmbient(0.4); volumeProperty->SetDiffuse(0.6); //漫反射 volumeProperty->SetSpecular(0.2); //镜面反射 //设置不透明度 vtkSmartPointer compositeOpacity = vtkSmartPointer::New(); compositeOpacity->AddPoint(70, 0.00); compositeOpacity->AddPoint(90, 0.40); compositeOpacity->AddPoint(180, 0.60); volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数 //设置梯度不透明属性 vtkSmartPointer volumeGradientOpacity = vtkSmartPointer::New(); volumeGradientOpacity->AddPoint(10, 0.0); volumeGradientOpacity->AddPoint(90, 0.5); volumeGradientOpacity->AddPoint(100, 1.0); volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比 //设置颜色属性 vtkSmartPointer color = vtkSmartPointer::New(); color->AddRGBPoint(0.000, 0.00, 0.00, 0.00); color->AddRGBPoint(64.00, 1.00, 0.52, 0.30); color->AddRGBPoint(190.0, 1.00, 1.00, 1.00); color->AddRGBPoint(220.0, 0.20, 0.20, 0.20); volumeProperty->SetColor(color); /********************************************************************************/ vtkSmartPointer volume = vtkSmartPointer::New(); volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty); vtkSmartPointer ren = vtkSmartPointer::New(); ren->SetBackground(0, 0, 0); ren->AddVolume(volume);

 效果如下:

 最后分割出的结果如下:

(横断面)、冠状面、矢状面,三个窗口可以通过拖动条,切换图层; 

由于一些关系,还有些细节不便透露;大体流程如此;



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3