不规则曲面上两点距离求取

news2025/4/20 21:17:16

 背景

在CT中求皮肤上两点间的弧长。由于人体表面并不是规则的曲面,不可能用圆的弧长求取方法来计算出两点间的弧长。

而在不规则的曲面上求两点的距离,都可以用类似测地线距离求取的方式来求取(积分),而转化为搜索路径问题。

弧长计算思路

以下在轴位CT的皮肤表面的两点间弧长计算思路。

CT图像是以一个个像素组成的一个规则的图像,通常接触到的都是512*512分辨率的CT,像素间距(一般像素的x和y轴间距相同,若不同需要特殊考虑,本文仅考虑x和y轴像素间距相同的情况)为零点几mm到5mm左右。

那么也就是说,其实CT图像就是一个512*512的网格,每个网格的大小即像素间距d毫米。那么计算两个点在不规则皮肤上的距离,即可找到点A到点B的前进方向,然后沿着前进方向在皮肤与空气的交界处一个像素一个像素的前进到B点,然后按若相邻点是斜相邻则距离为√2个像素间距,竖直或水平相邻则为1个像素间距,最后将累加起来的像素距离转化为真实距离。

A在左下,B在右上

具体则如下,若A点为在左下角,B点在右上角,那以A点为起点。

1.判断A点的左上角像素点是否皮肤,是,则将距离加上√2,然后A前进到左上像素点;

2.若不是,则判断上方像素点是否是皮肤,是,则将距离加上1;

3.若不是,则判断右上方像素点是否是皮肤,是,则将距离加上√2;

4.若不是,则判断右方像素点是否是皮肤,是,则将距离加上1,否则A、B点放置是有问题的。在A、B放置正确的情况下,若前述像素点都不是皮肤,那么最后一个点肯定是皮肤(A、B都是皮肤上的一个点,那那一定能从A点到B点)。

A前进到下一个点后,然后再重复上述4个步骤,一直到到最后A点的x与y坐标等于B点的x与y坐标(由于是在轴位上,故不考虑Z轴坐标)。

注意:最后比较时x、y的值需要转为整数,因为位置移动是按一个一个像素来移动的。

如下示意图所示,A点为棕色点,B点为蓝色点;黑色为空气,黄色为皮肤。

 A在左上,B在右下

若A点在左上角,B点在右下角,那么A到B,那么A点移动时的逻辑,则是应该判断A右方的像素点,A右下角像素,A点下方像素,A点左下方像素。

具体实现

代码如下

internal double ObliqueSearchSkinPoint(Vector3[] directions,Vector3 startPoint, Vector3 endPoint)
{
    var stack = new Stack<(Vector3 Point, double Distance)>();
    var visited = new HashSet<Vector3>();
    
    stack.Push((startPoint, 0));
    visited.Add(startPoint);

    while (stack.Count > 0)
    {
        var (current, distance) = stack.Pop();

        if ((int)current.x == (int)endPoint.x && (int)current.y == (int)endPoint.y)
        {
            return distance; // 找到终点,返回累计距离
        }

        // 按方向顺序检查
        foreach (var dir in directions)
        {
            Vector3 next = current + dir;
            if (!visited.Contains(next) && CheckPointOnSkin((int)next.z, (int)next.x, (int)next.y))
            {
                visited.Add(next);
                double cost = (dir.x != 0 && dir.y != 0) ? Math.Sqrt(2) : 1; // 斜向距离√2,直线距离1
                stack.Push((next, distance + cost));
                break; // 找到第一个可行点就跳出循环,不再检查其他方向
            }
        }
    }

    return double.PositiveInfinity; // 无可行路径,点标记错误
}

上述代码中添加了一个HashSet来记录访问过的点,这个后续发现在当前的场景下,其实是可以不需要的。 

以上CheckPointOnSkin方法的用途是用于判断像素点是否在皮肤上,主要是思路是皮肤上的像素点的CT值与空气的CT值不同,皮肤的CT是100左右的,而空气是-1000左右。

此仅实现了轴位CT图像皮肤上两点在同一张CT上的弧长计算;

若两点不在相同一张CT上的话,思路基本与此一致,不过需要考虑Z轴的变化,搜索前进方向则需要根据AB的方向向量来决定,搜索方向的数组就相对更复杂一些,实现当然也会复杂一些。以后再做讨论。

搜索方向

A点在左下,B点在右上时

   // 定义搜索方向(按优先级顺序)
    Vector3[] directions = 
    {
        new Vector3(-1, -1, 0),  // 左上(斜向,距离√2)
        new Vector3(0, -1, 0),   // 上(直线,距离1)
        new Vector3(1, -1, 0),   // 右上(斜向,距离√2)
        new Vector3(1, 0, 0)    // 右(直线,距离1)
    };

注意:左上为什么y轴是-1,不是1;是因为在Canvas坐标系中,原点在左上角,x轴为从左到事,y轴为从上到下。

A点在左上,B点右下时

   // 定义搜索方向(按优先级顺序)
    Vector3[] directions = 
    {
        new Vector3(1, 0, 0),  // 右(斜向,距离1)
        new Vector3(1, 1, 0),   // 右下(直线,距离√2)
        new Vector3(0, 1, 0),   // 下(斜向,距离1)
        new Vector3(-1, 1, 0)    // 右下(直线,距离√2)
    };

当然上述ObliqueSearchSkinPoint方法也可以递归来实现,不过递归时一定要处理好结束条件,否则极易造成溢出问题,

同时递归一定要注意可能的性能问题,主要是重复计算要尽量避免。

优化

同时上述是单方向的从A搜索向B,若需要加速搜索,是可以同时A向B与B向A双向搜索的,直到最后新的A与B重合即可。

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

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

相关文章

性能比拼: Elixir vs Go

本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 对比 Elixir 和 Go 简介 许多人长期以来一直要求我对比 Elixir 和 Go。在本视频…

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…

lottie深入玩法

A、json文件和图片资源分开 delete 是json资源名字 /res/lottie/delete_anim_images是图片资源文件夹路径 JSON 中引用的图片名&#xff0c;必须与实际图片文件名一致 B、json文件和图片资源分开&#xff0c;并且图片加载不固定 比如我有7张图片&#xff0c;分别命名1~7&…

热门与冷门并存,25西电—电子工程学院(考研录取情况)

1、电子工程学院各个方向 2、电子工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、电子科学与技术25年相较于24年上升20分 2、信息与通信工程、控制科学与工程、新一代电子信息技术&#xff08;专硕&#xff09;25年相较于24年下降25分 3、25vs24推…

Warcraft Logs [Classic] [WCL] BOSS ID query

Warcraft Logs [Classic] [WCL] BOSS ID query 所有副本BOSSID查询 https://wowpedia.fandom.com/wiki/DungeonEncounterID#Retail IDNameMapInstanceIDPatch227High Interrogator GerstahnBlackrock Depths230228Lord RoccorBlackrock Depths230229Houndmaster GrebmarBlackro…

架构师面试(三十一):IM 消息收发逻辑

问题 今天聊一下 IM 系统最核心的业务逻辑。 在上一篇短文《架构师面试&#xff08;三十&#xff09;&#xff1a;IM 分层架构》中详细分析过&#xff0c;IM 水平分层架构包括&#xff1a;【入口网关层】、【业务逻辑层】、【路由层】和【数据访问层】&#xff1b;除此之外&a…

基于若依框架前后端分离的项目部署

文章目录 单项目的部署项目目录后端打包上传前端打包上传配置nginx服务器打开防火墙完成 两个项目的部署两个项目介绍后端打包并上传前端打包并上传nginx配置服务器端口开放完成 腾讯云服务器 之 环境搭建 单项目的部署 项目目录 后端打包上传 查看端口号 在ruoyi-admin的appl…

黑马Java基础笔记-1

JVM&#xff0c;JDK和JRE JDK是java的开发环境 JVM虚拟机&#xff1a;Java程序运行的地方 核心类库&#xff1a;Java已经写好的东西&#xff0c;我们可以直接用。 System.out.print中的这些方法就是核心库中的所包含的 开发工具: javac&#xff08;编译工具&#xff09;、java&…

面向新一代扩展现实(XR)应用的物联网框架

中文标题&#xff1a; 面向新一代扩展现实&#xff08;XR&#xff09;应用的物联网框架 英文标题&#xff1a; Towards an IoT Framework for the New Generation of XR Applications 作者信息 Joo A. Dias&#xff0c;UNIDCOM - IADE&#xff0c;欧洲大学&#xff0c;里斯本&…

pcl各模块

参考资料&#xff1a; https://github.com/Ewenwan/MVision/blob/master/PCL_APP/1_%E7%82%B9%E4%BA%91%E6%BB%A4%E6%B3%A2filter.md 点云库PCL各模块学习 语雀 各模块依赖关系&#xff1a; 模块&#xff1a; common pcl_common中主要是包含了PCL库常用的公共数据结构和方…

Oracle Recovery Tools修复ORA-600 6101/kdxlin:psno out of range故障

数据库异常断电,然后启动异常,我接手该库,尝试recover恢复 SQL> recover database; ORA-10562: Error occurred while applying redo to data block (file# 2, block# 63710) ORA-10564: tablespace SYSAUX ORA-01110: ???????? 2: H:\TEMP\GDLISNET\SYSAUX01.DBF O…

2025MathorcupC题 音频文件的高质量读写与去噪优化 保姆级教程讲解|模型讲解

2025Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;C题保姆级分析完整思路代码数据教学 C题&#xff1a;音频文件的高质量读写与去噪优化 随着数字媒体技术的迅速发展&#xff0c;音频处理成为信息时代的关键技术之一。在日常生活中&#xff0c;从录音设备捕捉的原始…

.net core web api 数据验证(DataAnnotations)

目录 一、什么是 DataAnnotations&#xff1f; 二、扩展验证逻辑&#xff08;自定义验证器&#xff09; 一、什么是 DataAnnotations&#xff1f; DataAnnotations 是一组特性&#xff08;Attributes&#xff09;&#xff0c;用于在模型类上定义验证规则。主要用于属性级别的…

【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…

ICPR-2025 | 让机器人在未知环境中 “听懂” 指令精准导航!VLTNet:基于视觉语言推理的零样本目标导航

作者&#xff1a;Congcong Wen, Yisiyuan Huang, Hao Huang ,Yanjia Huang, Shuaihang Yuan, YuHao, HuiLin and Yi Fang 单位&#xff1a;纽约大学阿布扎比分校具身人工智能与机器人实验室&#xff0c;纽约大学阿布扎比分校人工智能与机器人中心&#xff0c;纽约大学坦登工程…

Shiro-550 动调分析与密钥正确性判断

一、Shiro 简介 Apache Shiro是一个开源安全框架&#xff0c;用于构建 Java 应用程序&#xff0c;提供身份验证、授权、加密和会话管理等功能。 二、Shiro-550&#xff08;CVE-2016-4437&#xff09; 1、漏洞原理 Shiro 在用户登陆时提供可选项 RememberMe&#xff0c;若勾选…

Python制作简易PDF查看工具PDFViewerV1.0查找功能优化

原文说明 为不破坏原文结构&#xff0c;因此功能优化不在原文中维护了。关于这款工具原文请通过下面链接访问。Python制作简易PDF查看工具PDFViewerV1.0 这款小工具基本功能已经可以作为一款文档浏览器使用&#xff0c;但还有一些美中不足的地方&#xff0c;本文将介绍对文本查…

20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤

20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤 2025/4/19 15:38 查询格式YUV/RGB 81 09 04 24 60 FF 90 50 00 00 FF 查询辨率帧率 81 09 04 24 72 FF 90 50 01 03 FF 查询LVDS mode : Singel output/Dual output 81 09 04 24 74 FF 90 50 00 00 FF 配置405的机…

从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题

开头运行可看官网 链接: unibest官网 一&#xff1a;vscode中vue3代码显示报错标红波浪线 去查看扩展商店发现一些插件都弃用了&#xff0c;例如h5的插件以及vue老插件 解决办法&#xff1a;下载Vue - Official插件&#xff08;注意&#xff1a;横杠两边是要加空格的&#xff…

HTML5好看的水果蔬菜在线商城网站源码系列模板4

文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品信息1.4 新闻资讯1.5 联系我们1.5 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/147264262 HTML5好看的水果…