6

C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面 - 乔克...

 1 year ago
source link: https://www.cnblogs.com/Uncle-Joker/p/17079269.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面

在医学影像领域中,将三维重建中的人体组织展开平铺至二维,用来研判病灶和制定治疗方案的重要手段之一,

它能够将立体曲面所包含的信息更为直观的展示到二维平面上,常用的情景包括:

牙床全景图、平铺血管、骨骼二维化展开(肋骨平铺)。

众所周知,人体牙床正常情况下是有弧度的,无论是从俯视位还是冠状位观察都是不能直观的了解牙齿状况,

或多或少的都会被其他组织或牙齿遮挡,如下图所示:

1083581-20230131155125606-1481351904.gif

所以我们要将三维或二维的影像拉伸后平铺到桌面上,目前主流曲面展开算法有如下几种:

②旋转正交矩阵法

③迭代应变能量释放法 

本文将根据网络查询现有的算法粗略介绍用能量法展开牙床:

基于弹簧质点系统建立能量模型:

1083581-20230131160312311-171313384.png

1083581-20230131160339600-763310031.png

弹性变形能E和弹性力f的计算式为:
1083581-20230131160408594-479490244.png

 

1083581-20230131160513824-273367649.png

判断展开标准:

 

1083581-20230131160541635-1204688407.png

 曲面展开算法示例:

1083581-20230131161006626-203266700.png

以VTK中圆柱体为例,将一根圆柱展开为一个矩形平面的部分代码:

void  Cylinder_Expansion(vtkPolyData* srcData, vtkPolyData* destData, GEO_CYLINDER src_Cylinder) {
    vtkSmartPointer<vtkPoints>srcPoints = srcData->GetPoints();
    vtkSmartPointer<vtkPoints>destPoints = vtkSmartPointer<vtkPoints>::New();
    int num = srcPoints->GetNumberOfPoints();
    double p[3],r[3],cross[3];
    double v0[3] = { 0 }, v1[3] = {0};
    v0[src_Cylinder.RdTran] = src_Cylinder.CenterTran;
    v0[src_Cylinder.RdLong] = src_Cylinder.CenterLong;
    v1[src_Cylinder.RdTran] = src_Cylinder.R;
    v1[src_Cylinder.RdLong] = 0;    

    double arc_len;
    for (int i = 0; i < num; ++i) {

        srcPoints->GetPoint(i, p);
        v0[src_Cylinder.Axial]= p[src_Cylinder.Axial];
        vtkMath::Subtract(p,  v0, p);
        arc_len = vtkMath::AngleBetweenVectors(v1,p);
        vtkMath::Cross(v1, p, cross);
        if (cross[src_Cylinder.Axial]<0)
arc_len = vtkMath::Pi()*2-arc_len; r[src_Cylinder.RdTran]= src_Cylinder.CenterTran+ arc_len*src_Cylinder.R; r[src_Cylinder.Axial] = v0[src_Cylinder.Axial]; r[src_Cylinder.RdLong] =sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]) - src_Cylinder.R; destPoints->InsertPoint(i,r); } destData->SetPoints(destPoints); }

运行结果:

1083581-20230131162940549-1766335250.png

将此算法应用到医学影像中,开始定位展开锚点:

1083581-20230131164135968-1810799376.gif

现在就可以在同一屏画面中得到了各种视角的牙床图:

1083581-20230131165000881-1201750510.png

同理,还可以应用到血管和骨骼的平铺展开,更好的观察血管阻塞和破裂、骨折骨裂等情况。

C#开发PACS、RIS、3D医学影像处理系统系列教程 目录整理:

菜鸟入门篇

医学影像三维篇

PACS三维处理医学图像:

C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

C#开发PACS医学影像三维重建(二):使用VTK进行体绘制

C#开发PACS医学影像三维重建(三):纹理映射与颜色传输

C#开发PACS医学影像三维重建(四):3D网格平滑效果

C#开发PACS医学影像三维重建(五):基于梯度透明的组织漫游

C#开发PACS医学影像三维重建(六):三维光源与阴影效果

C#开发PACS医学影像三维重建(七):空间测量与标注

C#开发PACS医学影像三维重建(八):VR体绘制

C#开发PACS医学影像三维重建(九):MPR三视图切面重建

C#开发PACS医学影像三维重建(十):MIP最小密度投影

C#开发PACS医学影像三维重建(十一):CPR曲面重建

C#开发PACS医学影像三维重建(十二):VE虚拟内镜技术

C#开发PACS医学影像三维重建(十三):基于人体CT值从皮肤渐变到骨骼的梯度透明思路

C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面

熟手进阶篇

登峰造极篇

C#开发基于Python人工智能的肺结节自动检测

C#开发基于Python人工智能的脊柱侧弯曲率算法

C#开发基于Python机器学习的医学影像骨骼仿真动画

C#开发基于Python机器学习的术后恢复模拟

C#开发基于U3D的VR眼镜设备虚拟人体三维重建

C#开发基于全息投影的裸眼3D医学影像显示技术

医疗影像软件产品友情链接


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK