三维牙齿模型的自动化预处理

项目简介

上海交大2019年秋计算机图形学(CS337)课程设计 —— 三维牙齿模型的自动化预处理。提供未分割的整口牙的牙齿扫描数据(STL牙齿模型文件),要求开发出具有牙齿分割、计数、编号、牙齿轴向标定和牙齿缺失识别功能的系统,并将处理结果渲染到屏幕上,辅助牙医进行医疗诊断。开发工具为 VS 2017 + Qt5.13.2 + Vtk8.2.0。借助 Vtk 库,利用该库的工具函数进行牙齿的连通分量提取(即牙齿的分割),完成牙齿的计数;根据牙齿的中心点位置和包围盒的半径确定牙齿编号(FDI牙位表示法)和缺失情况;借助OBB包围盒确定牙齿轴向;利用 Vtk 的绘制函数将结果显示在屏幕上;借助 Qt 设计了简易的用户交互界面。

环境配置

本项目未上传整个工程,仅上传了源代码文件,见 /scripts 文件夹。/data 提供了一些可供实验的牙齿模型文件。如有运行需求,请按照如下步骤配置依赖环境。

  • 安装Visual Studio 2017,VS是一个基本完整的开发工具集,选择套件时只需选择“使用C++的桌面开发”;
  • 安装Qt 5.13.2,Qt是一个跨平台的C++图形用户界面应用程序开发框架,易扩展,可以嵌入VS进行开发使用,使用Vtk开发时会用到Qt进行GUI开发;然后在VS中安装Qt扩展插件,下载并安装QT Visual Studio Tools;
  • 安装Cmake,Cmake是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程;
  • 编译安装Vtk,用Cmake选择路径,然后Configure和Generate,就可以得到Vtk.sln文件,用VS 2017打开此工程文件,点击重新生成,开始长时间的编译过程,重新生成工作结束之后,环境配置完毕。

已实现的功能

使用VS运行工程,会显示该系统UI界面

  • 点击界面右栏中的【牙齿模型】按钮,会显示读取的牙齿模型,可通过鼠标点击、拖拽和滚轮的方式对牙齿模型进行旋转和缩放,以便全方位的观察。

  • 点击【去除牙龈】:

  • 点击【连通分量提取】,会显示将牙齿分成独立的各个牙齿的画面,其中包含去除牙龈后的整口牙的画面,和每个窗口显示单独的牙齿的画面:

  • 点击【包围盒】,会显示出各个牙齿的OBB包围盒。

  • 点击【FDI牙位表示法】,会显示各个牙齿使用FDI牙位表示法编号后的画面,红色的字体即为各个牙齿的编号:

  • 点击【牙齿缺失情况】,若有缺失,窗口上半部分会显示“miss”,下半部分显示缺失的牙齿编号(包括智齿);若无缺失情况,上半部分则显示“complete”。

  • 点击【牙齿数量】,会显示输入牙齿模型的牙齿个数。

  • 点击【轴向】,会显示添加了牙齿轴向的画面。

关键算法

  • 牙齿分割

    前期通过数字扫描仪的多次精密扫描获得患者牙齿的点云数据,通过 DBSCAN 算法 (一种密度聚类算法,参考可跳转至此) 完成牙齿点云的聚类,再将各组点云三角化,就得到了完整的 STL 三维牙齿模型。

    因此,对于一个作为输入的 STL 牙齿模型,其不同的牙齿之间不存在相邻的面片。类比寻找最大连通分量问题,我们可以考虑采用广度优先搜索,对面片进行聚类。但是,如果不对该算法进行优化,时间复杂度为面片的平方级。经实验,若未经优化,在 CPU 为 i7 7700 的计算机上运行该算法,含有14个牙齿(8万个面片)的模型需要40min才能分割完毕。

    鉴于此,本项目采取 Vtk 库特殊的 VtkPolyDataConnectivityFilter 类进行连通分量的提取。封装在该类中的工具函数使用特殊的数据结构保存三维模型的几何信息和拓扑信息,可完成面片的高效索引,从而大大加快连通分量的提取速度,在数秒内即可完成牙齿的分割工作。

  • 牙齿编号和牙齿缺失情况的确定

    首先要确定各个牙齿的中心点坐标和在XOZ平面上投影的半径,以便用于后续的计算。通过连通分量的边界变量Bound,得到各个牙齿的AABB包围盒的顶点坐标,再通过简单的计算,即可得到牙齿的中心点坐标和投影半径。接下来,在此基础上,进行牙齿编号和缺失识别的计算。

    牙齿的编号建立在牙齿缺失识别的基础上进行,在得到正确的牙齿编号后,便可以通过遍历现有牙齿的编号,与完整的牙齿编号进行比对,输出牙齿缺失情况。

    对于牙齿缺失的识别,我们从左往右扫描牙齿模型(即按照中心点坐标x递增的顺序遍历各个牙齿),根据每颗牙齿的中心点坐标,计算相邻两颗牙齿的中心点坐标之间的距离在XOZ平面上的投影,如果这个值大于这两颗牙齿的半径之和,则表明这两颗牙齿之间存在缺失的牙齿。为了便于后续编号,对于缺牙的地方,填充一个“空牙齿”(没有面片,但有中心点和半径等信息),“空牙齿”会被标记为“空”。

    接下来进行牙齿的编号,牙齿编号采用的方法如下:

    • 首先确定第一颗右门牙。确定方法:中心点x坐标为正值且最小的那颗牙齿即为右门牙。注:即便右门牙缺失,鉴于在缺失识别阶段已经填充了“空牙齿”,所以没有影响。
    • 对右门牙进行编号。
    • 以右门牙为基准,沿中心点x坐标值递增的方向,对右侧的牙齿进行挨个编号。
    • 确定左门牙。确定方法:利用牙齿中心点坐标来确定,左侧离右门牙最近的牙齿即为左门牙。
    • 进行左侧牙齿的命名,沿中心点x坐标值递减的方向,对左侧的牙齿进行挨个编号。
    • 将各个非空牙齿的名称按照连通分量的顺序保存,输出。

    由此就得到了各个牙齿连通分量对应的编号,完成了牙齿的命名工作。代码实现详见 scripts/tooth.h

    本算法能保证较高的鲁棒性,即便是缺失了门牙或者最边缘的磨牙,依然能对牙齿进行正确的编号和缺失情况的正确识别。同时,该算法对牙齿进行编号的根据是牙齿坐标,而不是牙齿的具体形态,简单高效而又不失准确性。

未来需要优化的部分

  • 对连续缺失两颗以上牙齿的情况的处理不周。当有两颗以上牙齿连续的缺失时,算法只会补上一颗很大的“空牙齿”,而这会导致缺失部位周围牙齿的编号错误,因为两侧的牙齿的编号依赖于相对中间的牙齿的编号,因此会导致连续的错误。可以考虑的解决方案为:当两颗牙的中心的间距大于半径之和的二倍时,添加连续两颗“空牙齿”。连续缺失三颗乃至以上的情况同理。但是这样处理的问题是,系统的计算是直接计算两颗牙齿中心点之间的直线距离,当连续缺失的牙齿个数较多时,由于牙齿排列是有弧度的,依赖直线距离进行牙齿缺失的判断的误差会变大,导致编号和缺失识别不准确,因此对连续多颗牙齿缺失情况的识别,该系统还是需要进一步改善,改善的思路可以考虑根据牙模弧度来矫正牙齿中心点之间的距离的计算。
  • 在牙齿特征点的识别方面,比如牙尖的识别,虽然也进行了曲率特征的可视化分析,但主要采取的方法还是利用OBB包围盒的轴向来近似牙齿的牙尖方向,这个估计的误差还是挺大的。将来的工作应考虑深入研究利用曲率来识别牙尖的方法,通过曲率计算,精确的标记出各个牙齿的牙尖方向。

♻️ 资源

大小: 8.42MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87503850
注:如当前文章或代码侵犯了您的权益,请私信作者删除!

基于C++实现三维牙齿模型的自动化预处理【100011019】相关推荐

  1. matlab 摄动波浪理论,基于MATLAB的三维海浪模型数值仿真_齐宁.pdf

    ISSN1009-3044 E-mail:eduf@ 第9卷第25期 (2013年09月) ComputerKnowledgeandTechnology电脑知识与技术 ComputerKnowledg ...

  2. Matlab模拟三维海浪模型

    1 简介 海洋工程领域中的浮式结构物设计,需要精确计算海浪载荷,保证满足稳定性和安全性.该文利用MATLAB对Longuet-Higgins长峰波海浪模型和三维不规则短峰波随机海浪模型进行了仿真研究. ...

  3. 【论文笔记】基于GAN的三维医学图像跨模态配准模型 Deform-GAN

    本文是关于<DEFORM-GAN:AN UNSUPERVISED LEARNING MODEL FOR DEFORMABLE REGISTRATION>论文的阅读笔记. 一.简介 文章提出 ...

  4. 【数学建模】基于matlab三维海浪模型仿真【含Matlab源码 1159期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab三维海浪模型仿真[含Matlab源码 1159期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付 ...

  5. 基于CEM算法的三维人脸模型贴图matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 采用三维人脸贴图算法conformal energy minimization,将二维图片贴 ...

  6. 卡内基梅隆大学提出基于学习的动作捕捉模型,用自监督学习实现人类3D动作追踪

    原文来源:Cornell University Library 作者:Hsiao-Yu Fish Tung.Hsiao-Wei Tung.Ersin Yumer. Katerina Fragkiada ...

  7. [论文]基于强化学习的无模型水下机器人深度控制

    基于强化学习的无模型水下机器人深度控制 摘要 介绍 问题公式 A.水下机器人的坐标框架 B.深度控制问题 马尔科夫模型 A.马尔科夫决策 B.恒定深度控制MDP C.弯曲深度控制MDP D.海底追踪的 ...

  8. CUDA上的量化深度学习模型的自动化优化

    CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...

  9. NeuIPS | 蛋白设计新方法?基于图的蛋白生成模型

    今天给大家介绍的是麻省理工大学计算机科学和人工智能实验室在NeuIPS 2019会议上发表的一篇文章.在文中,作者提出了一种基于图结构的蛋白质序列生成模型,通过聚焦三维空间上相邻的蛋白质区域,在基于神 ...

最新文章

  1. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第2课2.6节隐藏和锁定对象...
  2. 设计模式:设计模式七大原则
  3. 区块链核心技术:委任权益证明算法DPoS
  4. python里compile的作用_Python代码中compile()函数具有哪些功能呢?
  5. 一站式体验腾讯云音视频及融合通信技术
  6. 机器学习笔试面试超详细总结(四)
  7. js css模仿打字效果
  8. 『实用』判断一个噩梦客户的7个预警信号
  9. 前人栽树,后人擦屁股
  10. Bailian4044 小白鼠再排队【排序】
  11. 序列化和反序列化的概念
  12. 洛谷 P1312 Mayan游戏
  13. P12 | N-path filter (ISSCC2021 JSSC-2011-03)
  14. 获取 jquery 版本号
  15. 关于Matlab中括号用法的总结
  16. LINUX——正则表达式
  17. 工程师也该学习机器学习了!
  18. 神经功能缺损评分 css,不同神经功能缺损程度脑梗死病人血尿酸水平变化及其与近期预后关系分析...
  19. R中的特殊值NAN\NA\inf\NULL
  20. 航母级app手机淘宝是如何炼成的丨独家解密

热门文章

  1. 三星980处理器和骁龙855_麒麟980和骁龙855,谁才是CPU之王
  2. 云就是网络,云计算呢
  3. python语法简洁清晰特色之一是强制用什么作为语句缩进_python语言特色
  4. python语言的特点有没有面向过程_Python语言的特点有哪些?
  5. leaflet+postgres+postgis(附源码下载)
  6. 安科瑞高精度开口电流互感器的规格(安科瑞-卓宋兰)
  7. opencv多摄像头测试
  8. cube-ui—安装
  9. vue拖拽组件生成页面代码,vue可视化拖拽组件模板
  10. live-pusher出现黑屏解决办法