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

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

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

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

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

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

①元素法

②旋转正交矩阵法

③迭代应变能量释放法

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

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

弹性变形能E和弹性力f的计算式为:

判断展开标准:

曲面展开算法示例:

以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);
}

运行结果:

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

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

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

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

  1. C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

    概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为1 ...

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

    VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...

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

    当我们将CT切片重建为三维体之后,通常会消除一些不必要的外部组织来观察内部病灶, 一般思路是根据人体常见CT值范围来使得部分组织透明来达到效果, 但这是非黑即白的,即,要么显示皮肤,要么显示神经,要么 ...

  4. C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

    1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...

  5. C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

    1.平移,利用WPF中控件边距来控制位移: /// <summary> /// 平移图像 /// </summary> /// <param name="X&q ...

  6. C#开发PACS医学影像处理系统(十二):绘图处理之图形标记

    在医生实际使用过程中,对于有病灶的影像需要一些2D绘图操作,例如对于病灶的标记和测量, 这就牵涉到在WPF中的2D绘图操作技术,一般的思路是监听鼠标的按下和抬起以及运动轨迹,目前整理出的常用绘图和测量 ...

  7. C#开发PACS医学影像处理系统(十九):Dicom影像放大镜

    在XAML代码设计器中,添加canvas画布与圆形几何对象,利用VisualBrush笔刷来复制画面内容到指定容器: <Canvas x:Name="CvsGlass" Wi ...

  8. C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色

    在医生阅片确诊的过程中,当发线疑似病灶时在灰度显示下有时并不清晰,这时候就需要色彩增强效果来使灰度图像变为彩色图像. LUT可以简单的理解为0-255的颜色映射值,例如:彩虹编码,将其打包成LUT格式 ...

  9. C#开发PACS医学影像处理系统(六):加载Dicom影像

    对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3 ...

  10. C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

    1.任意角度旋转 在XAML设计器中,设置RotateTransform属性 <InkCanvas x:Name="ToolInkCanvas" UseCustomCurso ...

随机推荐

  1. Java多线程(7):JUC(上)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 前面把线程相关的生命周期.关键字.线程池(ThreadPool).ThreadLocal.CAS.锁和AQS都讲完了,现在就剩下怎么来用多线程了 ...

  2. 搭建K8S集群前置条件

    搭建K8S集群 搭建k8s环境平台规划 单master集群 单个master节点,然后管理多个node节点 多master集群 多个master节点,管理多个node节点,同时中间多了一个负载均衡的过 ...

  3. TreeUtils工具类一行代码实现列表转树 实战Java8 三级菜单 三级分类 附视频

    一.序言 在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单.多级目录.多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身,提高开发效率. 本文将基于 ...

  4. 【云原生 · Kubernetes】部署 kube-proxy 组件

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying kube-proxy 运行在所有 worker 节点上,它监听 apiserver 中 se ...

  5. 视觉享受,兼顾人文观感和几何特征的字体「GitHub 热点速览 v.22.46」

    GitHub 上开源的字体不在少数,但是支持汉字以及其他非英文语言的字体少之又少,记得上一个字体还是 霞鹜文楷,本周 B 站知名设计 UP 主开源了的得意黑体在人文观感和几何特征之间找到了美的平衡. ...

  6. vscode 更新后重启恢复旧版

    vscode的自动更新自动安装在C:\Users\admin\AppData\Local\,如果之前的vscode不在默认位置,就会更新出两个版本,如果还用了固定在开始屏幕或者任务栏,则一直在打开旧版 ...

  7. Azure DevOps Server 用户组加入 Azure AD Domain Service 管理用户

    一,引言 今天我们继续讲解 Azure DevOps Server 的内容,对于管理用户组除了在 Azure DevOps Server 服务器上添加管理员方式外,还有没有其他方式,Azure Dev ...

  8. Solon v1.11.0 发布,Hello Java

    一个更现代感的 Java 应用开发框架:更快.更小.更自由.没有 Spring,没有 Servlet,没有 JavaEE:独立的轻量生态.主框架仅 0.1 MB. @Controller public ...

  9. Day26:内部类的详解

    内部类 1.1内部类概述 内部类:就是在一个类中定义另外一个类. 例如我们在A类中定义一个B类,那么B类就是A类的内部类,A则是B的外部类. 好比我们的手机是一个类,而手机内部的零件又属于一个类. 内 ...

  10. 在实际应用中联合体union的妙用

    关键字union,又称为联合体.共用体,联合体的声明和结构体类似,但是它的行为方式又和结构体不同,这里的行为方式主要指的是其在内存中的体现,结构体中的成员每一个占据不同的内存空间,而联合体中的所有成员 ...