用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)

news2024/11/27 4:29:50

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码、数据、文献


💥1 概述

头影测量分析用于评估面部生长,研究面部内的解剖关系。头影测量评估基于矢状面或冠状面的二维放射影像,是一种本质上不准确的方法。2D成像技术(如计算机断层扫描和磁共振成像)的广泛可用性使得面部形态的常规3D分析成为可能。3D头颅测量法不仅可以更准确地量化颅面形态和纵向生长,还可以区分咬合的细微变化。然而,用于计算颅面对称性和量化颅面形态的可靠协议仍然是一个广泛研究的主题。在这里,提出并评估了一种用于识别自然头部位置(NHP)和准确量化面部生长和面部不对称的3D头影测量分析协议。进行了一项幻影研究,以评估该方案的性能,并量化重复可靠地将头骨与 NHP 对齐的能力,并量化可以测量面部生长和面部不对称的准确性。

头影测量分析用于评估面部生长,研究面部内的解剖关系,并作为正畸和颅颌面畸形手术治疗计划的常规工具。标准的头影测量评估基于在矢状面(侧头颅造影)或冠状平面(头后前位图)中拍摄的二维放射影像,其中识别多个标志、线条和角度以量化面部的垂直和水平关系。该分析主要取决于标准化头部位置的准确且可重复的定义,因此患者在定制的图像采集系统中成像[2]。无论筛查方案如何,头影测量图像都可能受到放大伪影、颅面不对称和解剖结构叠加的影响,所有这些都会导致面部形态的传统评估方法不精确和不准确。

二维头影测量是一种本质上不准确的方法,涉及面部生长小增量的量化和横向维度的分析,特别是面部不对称性的分析。由于图像捕获、图像质量和地标识别方面的变异、不一致和错误,以及观察者内部和观察者之间的可靠性和再现性有限,当代头影测量分析的准确性进一步复杂化[2]。无法检测颅面形态的微小变化限制了该技术的临床应用,并阻碍了其在纵向生长的量化或闭塞细微变化的区分等领域的研究有用性,例如尖间和回缩的接触位置。迄今为止,没有任何技术可以提供牙齿咬合的精确虚拟再现[2],研究模型和面弓记录是目前牙科中再现咬合间关系的黄金标准。

3D成像技术的广泛可用性,如计算机断层扫描(CT),锥形束CT(CBCT)和磁共振成像(MRI),使得面部形态的常规3D分析成为可能。与传统的头颅测量法相比,三维重建头颅测量法具有几个优点。它避免了对头部进行标准化固定的需要,并允许对解剖头部位置进行后验定义。它还可以防止成像过程中固有的结构放大和变形,同时可以全面评估3D颅面形态,这对于术前评估、手术计划和术后评估非常重要[3]。1D成像技术有可能提供显着的精度改进,但是将成熟的3D概念准确转换为2D框架需要进一步发展。3D头颅测量法的研究显示结果相互矛盾,一些研究得出结论,它提供了更准确的颅面解剖学评估[3,4,5],而另一些研究则认为这两种技术之间没有统计学差异[6,7],或者不如8D技术准确[2]。

3D头影测量评估的最关键方面是颅骨在空间中的准确定位,需要准确定义颅面对称平面和头部的适当解剖框架。在侧头颅图的二维分析中,通过识别真正的水平或真正的垂直方向来定位头骨,并识别S,作为图像叠加和比较的参考点。法兰克福水平(FH)平面用于在某些特定分析中定向侧头影图像,需要识别两个双边地标(porion,Po和orbitale,Or),由于人脸的自然不对称性,它们与使用2D成像评估的不在同一平面上。此外,与FH相关的地标是最主观的地标之一,因此容易被错误识别[3,5]。另一种方法是定义真正的垂直方向,例如Nasion-Pogonion线[10]。这种方法的优点是基于对鼻(N)和pogonion(Pog)的识别,它们也比Po和Or[11]主观性小,可以认为位于头部的对称平面上。这些地标提供有关面部中线结构的直接信息,并且不会因面部不对称而受到解剖学变化的影响。此外,在儿童和青少年期间,颅面生长的特征是颅底和大孔相对稳定,与颅穹窿的显着扩张以及上颌骨和下颌骨的远端和向前生长相比,颅底和大孔保持相对不变[5,1,12]。在13D环境中,碱性颅可以为进一步的颅面生长评估提供可靠的参考结构[3]。

开发一致且可靠的 3D 头影测量工作流程将为临床医生提供有价值的工具,用于面部生长的 3D 表征和量化、评估牙颌面关系和随后解剖学上准确的正畸和手术计划,以及评估治疗结果。我们提出了一种准确估计颅面对称性的协议,使用随机颅骨方向、面部生长载体和不同类型的面部不对称性来评估这一点。测试的原假设是分析面部生长和不对称性的3D方法无法可靠地量化。另一种假设是,所提出的3D算法可以准确量化颅面对称平面,面部生长和面部不对称。

📚2 运行结果

部分代码:

function [v, f, n, name] = stlReadAscii(fileName)
%STLREADASCII reads a STL file written in ASCII format
%V are the vertices
%F are the faces
%N are the normals
%NAME is the name of the STL object (NOT the name of the STL file)

%======================
% STL ascii file format
%======================
% ASCII STL files have the following structure.  Technically each facet
% could be any 2D shape, but in practice only triangular facets tend to be
% used.  The present code ONLY works for meshes composed of triangular
% facets.
%
% solid object_name
% facet normal x y z
%   outer loop
%     vertex x y z
%     vertex x y z
%     vertex x y z
%   endloop
% endfacet
%
% <Repeat for all facets...>
%
% endsolid object_name

fid = fopen(fileName);
cellcontent = textscan(fid,'%s','delimiter','\n'); % read all the file and put content in cells
content = cellcontent{:}(logical(~strcmp(cellcontent{:},''))); % remove all blank lines
fclose(fid);

% read the STL name
line1 = char(content(1));
if (size(line1,2) >= 7)
    name = line1(7:end);
else
    name = 'Unnamed Object';
end

% read the vector normals
normals = char(content(logical(strncmp(content,'facet normal',12))));
n = str2num(normals(:,13:end));

% read the vertex coordinates (vertices)
vertices = char(content(logical(strncmp(content,'vertex',6))));
v = str2num(vertices(:,7:end));
nvert = size(vertices,1); % number of vertices
nfaces = sum(strcmp(content,'endfacet')); % number of faces
if (nvert == 3*nfaces)
    f = reshape(1:nvert,[3 nfaces])'; % create faces
end

% slim the file (delete duplicated vertices)
[v,f] = stlSlimVerts(v,f);

function [v, f, n, name] = stlReadAscii(fileName)
%STLREADASCII reads a STL file written in ASCII format
%V are the vertices
%F are the faces
%N are the normals
%NAME is the name of the STL object (NOT the name of the STL file)

%======================
% STL ascii file format
%======================
% ASCII STL files have the following structure.  Technically each facet
% could be any 2D shape, but in practice only triangular facets tend to be
% used.  The present code ONLY works for meshes composed of triangular
% facets.
%
% solid object_name
% facet normal x y z
%   outer loop
%     vertex x y z
%     vertex x y z
%     vertex x y z
%   endloop
% endfacet
%
% <Repeat for all facets...>
%
% endsolid object_name

fid = fopen(fileName);
cellcontent = textscan(fid,'%s','delimiter','\n'); % read all the file and put content in cells
content = cellcontent{:}(logical(~strcmp(cellcontent{:},''))); % remove all blank lines
fclose(fid);

% read the STL name
line1 = char(content(1));
if (size(line1,2) >= 7)
    name = line1(7:end);
else
    name = 'Unnamed Object';
end

% read the vector normals
normals = char(content(logical(strncmp(content,'facet normal',12))));
n = str2num(normals(:,13:end));

% read the vertex coordinates (vertices)
vertices = char(content(logical(strncmp(content,'vertex',6))));
v = str2num(vertices(:,7:end));
nvert = size(vertices,1); % number of vertices
nfaces = sum(strcmp(content,'endfacet')); % number of faces
if (nvert == 3*nfaces)
    f = reshape(1:nvert,[3 nfaces])'; % create faces
end

% slim the file (delete duplicated vertices)
[v,f] = stlSlimVerts(v,f);

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、数据、文献

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1028928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试第一个进去会不会当炮灰?

首先要说的就是&#xff0c;面试时第一个进入房间并不一定会成为“炮灰”&#xff0c;因为面试官会对你的面试表现进行综合评估&#xff0c;而不仅仅是因为你比其他面试者更早进入房间。因为在面试过后都会给上一个求职者打分&#xff0c;所以不存在说前面进去的就会被面试官打…

Kafka-UI

有多款kafka管理应用&#xff0c;目前选择的是github上star最多的UI for Apache Kafka。 关于 To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself. UI for Apache Kafka is a versatile, fast, and lightweight…

Tungsten Fabric Rabbitmq故障处理

开源SDN软件Tungsten Fabric&#xff08;以下简称TF&#xff09;有时莫名其妙出现服务宕机情况。 使用TF自带工具contrail-status排查&#xff0c;多数时候是rabbitmq出现宕机&#xff0c;或者某个组件连接rabbitmq出错。 本次仅排查、处理rabbitmq问题。 1. 查rabbitmq日志发…

python进程和线程(05)

python进程和线程(05) 文章目录 python进程和线程(05)1 python进程和线程1.1 进程和线程概念1.2 并行执行1.3 核心使用语法_threading模块1.4 多线程编程1.4.1 案例单线程不能满足情况如下&#xff1a;1.4.2 多线程1.4.2.1 多线程创建语句1.4.2.2 案例 1.4.2 多线程传参使用1.4…

电影格式怎么转换mp4?电影格式转换教程

电影格式怎么转换mp4&#xff1f;平时喜欢看电影的小伙伴都知道&#xff0c;平时我们下载到的电影文件格式可谓是五花八门&#xff0c;如Mp4、Flv、AVI、WMV、MKV、MOV等。然而&#xff0c;相较于其他常用格式&#xff0c;MP4是一种使用最为广泛的视频格式&#xff0c;并且文件…

echarts另外存为图片

今天同事画了个Echarts,我看了下居然有下载功能&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;之前一直不知道&#xff09; 这是原图&#xff0c;右上角有个下载功能&#xff0c; 下载后是这样的 貌似是没有了y轴的参数和x轴的参数&#xff0c;估计是可以配置的…

解决报错:Error:digital envelope routines::unsupported

antDesignPro版本&#xff1a;5.2.0 包管理工具&#xff1a;pnpm 本地pnpm dev&#xff08;用的node版本为18&#xff0c;18.15.0&#xff09;运行AntDesignPro后台项目时&#xff0c;控制台报错&#xff0c;截图如下。 解决方法&#xff1a;使用的node版本过高导致&#xff0…

ChatGPT批量写作文章软件

什么是ChatGPT批量写作文章。简单来说&#xff0c;它是一种使用ChatGPT技术的方法&#xff0c;可以帮助您批量生成各种类型的文章和内容。无论您是需要新闻报道、博客文章、产品描述、社交媒体帖子还是其他类型的内容&#xff0c;ChatGPT都能满足您的需求。它可以在极短的时间内…

利用亚马逊 云服务器 EC2 和S3免费套餐搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制&#xff0c;比如限制下载速度&#xff0…

微信成绩查询

在现代教育中&#xff0c;教师经常需要发布学生成绩&#xff0c;并方便学生查询。为了提高效率和便利性&#xff0c;开发一个微信学生成绩查询发布系统是一种不错的选择。本文将介绍如何开发这样一个系统&#xff0c;使教师能够轻松管理学生成绩&#xff0c;并让学生方便地查询…

附录一-pandas操作excel

文章参考 Python之如何使用pandas操作Excel表_1XXXXXXXXXXXXXXXXX1的博客-CSDN博客 我现在有一个 test.xlsx 文件&#xff0c;内容如下 目录 1 获取行列信息 2 获取单元格的值 3 改变单元格的值并保存到原文档 1 获取行列信息 pandas读取行号会不读取第一行 2 获取单…

广义线段树上树剖再拿线段树维护:0914T4

cp 一种常见套路&#xff08;也是广义线段树问题的核心解决方法&#xff0c;UNR1好像也有一题&#xff09;&#xff1a; 如果在线段树上进行一段区间修改&#xff0c;那么必然是一段右节点一段左节点 这个过程其实就是zkw的本质 下面都要用zkw来理解 考虑原题&#xff0c;有…

VR全景拍摄:打破传统拍摄角度限制,营造全新体验

VR全景拍摄不仅仅是拍摄环境&#xff0c;更多的是展示意境&#xff0c;我们的传统文化就是讲究意境&#xff0c;仅仅是看一张清晰无比的图片&#xff0c;自然显得没有趣味&#xff0c;但是这种真实的视觉体验&#xff0c;明明不在现场却能直观体验现场场景&#xff0c;这种意境…

SHIBUYA109 首次推出的人物化身系列!

准备好迎接由 SHIBUYA109 监督设计的原创人物化身系列&#xff0c;名为“SHIBUYA109 时尚系列 2023”&#xff0c;以各种引领潮流的时尚为特色。这个限量系列融合了日本的潮流和文化&#xff0c;全球仅有 2060 个独一无二的人物化身&#xff08;其中 2000 个限量发售&#xff0…

【JVM】类加载的过程

文章目录 类的生命周期加载验证准备解析初始化简要概括 类的生命周期 一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期将会经历加载 &#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xf…

基于SSM+Vue的网络教学平台的设计与实现的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

抖音开网店无货源怎么找

随着社交媒体的快速发展&#xff0c;抖音已经成为了一种极具潜力的电商平台。许多人想要利用这个平台开设网店&#xff0c;但是其中很多人面临的问题是如何找到货源。无货源的抖音网店经营固然具有一定的难度&#xff0c;但并非不可行。以下是一些帮助你在抖音开网店无货源的方…

idea中maven项目打包成jar,报错没有主清单属性解决方法

使用idea自带的打包可能会出现一下问题 在pom.xml中引入下面的依赖&#xff0c;即可解决 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions&…

Linux 多线程 | 线程安全、死锁、线程同步

在前面的文章中我们讲述了锁的理解、原理、用户级线程库的内容&#xff0c;以及对Linux中的锁和线程进行了封装&#xff0c;本文中将继续对多线程的内容进行讲解。 可重入与线程安全 概念 线程安全&#xff1a;多个线程并发同一段代码时&#xff0c;不会出现不同的结果。常见…

ImGui显示中文

ImGui显示中文 前言 首先要加载中文字体&#xff0c;相信大家在网上能搜到或者某些教程都是这么说明的&#xff0c;或者说在字符串前面加上u8前缀的&#xff0c; 例如&#xff1a;ImGui::Text(u8"中文中文 chinese.");&#xff0c;但是大概率中文还是??&#xff…