DRR(Digitally Reconstructured Radiograph)分类及原理

news2024/11/29 4:41:59

DRR(Digitally Reconstructured Radiograph)分类及原理

DRR(Digitally Reconstructured Radiograph),全称为数字重建放射影像,其是通过将三维 (3D) 图像(Volume)透视投影到二维 (2D) 图像平面上而生成的射线照相图像的模拟。DRR被广泛应用于CT模拟定位、图像引导放射治疗(IGRT)及计算机辅助外科等领域。

目前,DRR重建算法主要采用光线投射法(Ray casting)实现。光线投射是一种经典体绘制方法,在计算机图形学和三维可视化方面得到了广泛的应用,其采用光线投射的原理来模拟X线穿透人体并经过人体组织吸收后衰减而产生DRR图像的过程。

Digitally reconstructed radiographs (DRR) are a simulation of radiographic images produced through a perspective projection of the three-dimensional (3D) image (volume) onto a two-dimensional (2D) image plane.

分类

按照计算机硬件实现分类:

  • 基于CPU的
  • 基于GPU的:部分并行化操作放在GPU上进行

按照插值的对象不同进行分类:

  • 基于CT的(CT-based):将模拟的光源和CT中每个体素值(Voxel)连线,连线再延伸至模拟的X光探测器(Detector),在模拟的Detector上重新建立坐标系网格,在每个pixel的内部,按照距离插值求积分,重建出DRR。
  • 基于探测器的(Detector-based):将模拟的光源和模拟的X光探测器(Detector)上每个pixel连线,连线会经过放在两者之间的CT的,按照连线经过的体素进行插值,求取整个连线经过的体素的总和,重建出DRR。

光线投射生成DRR的方法

传统的直接插值法

直线插值方法的的主要过程是:从X线出束口发出多条X射线穿过三维体数据;在每条射线上进行等间距采样,并利用三线性插值方法由距离采样点最近的8个体素计算出该采样点的CT值对应的衰减系数;然后从前至后对所有采样点的衰减系数进行累加,得到该条射线对应成像平面的像素点的灰度值。针对每条射线重复上述过程后,将计算得到的所有像素点合成为一幅完整的DRR图像。基于光线投射方法的DRR生成如图所示:

直接插值法

SAD 为 X 射线源点到体数据等中心的距离,SFD 为 X 射线源点到 DRR 成像平面的距离。从 X 射线源点出发的射线条数与 DRR 图像的像素点个数相同,两者之间是一一对应的关系。为了简化采样计算过程从而提高采样效率本文选择等步长和三线性插值来计算采样点的 CT 值。该方法也是基于探测器的(Detector-based)的一种DRR生成方式。

换一种方法说,传统直接插值的光线投射算法,其具体实现过程可以描述为:首先利用计算机模拟一个虚拟点光源,用来表示传统 X 射线光源,然后从该点发射出若干条虚拟 X 射线,射线穿过三维数据集,照射到垂直与射线中线的投影面板上。投影面板上所有射线的投影点即是 DRR 图像的所有像素点。在投射过程中, X 射线按照既定的步长穿过三维数据集,当射线每经过一个 CT 切片,算法都会模拟真实 X 射线穿过人体时的衰减而得到一个 CT 值,如果射线与切片的交点恰巧不是像素点的时候就需要通过插值算法来估算出此时的 CT 值。最终将每条射线上所有交点的 CT 值累加,通过一定的转换方式将累加值转换成图像灰度,就获得了 DRR 图像。

总之,在传统直接插值的光线投射算法的实现过程中,需要获得每条射线与三位体数据的交点的 CT 值,若交点恰巧没有位于体素点上,则需要通过插值的方式来估算出该点的 CT 值,这个的过程需要大量的插值和求整运算,所以大大降低了 DRR 图像的生成速度,因此会有多种方式来加速该射线生成方式,例如通过三维 Bresenham 直线生成算法改进来快速的生成一条射线

Bresenham 直线生成算法

Bresenham 算法是一种高效的直线生成算法,传统的 Bresenham 算法应用在二维空间内,其原理如图所示:图中点 A, D, E 为实际像素点,点 B 为实际直线与 AD 连线的交点。 该算法所要完成的任务就是判断将点 B 绘制在 D 点,还是绘制在 A 点。最为简洁的方法就判断 AB 与 BD 的距离,如果 AB>BD,则将 B 绘制在 D点,反之将其绘制在 A 点。另外一种辨别方法就是判断点 B 与点 C 的坐标大小,若B>C,则绘制在 A 点,若B<C ,则绘制在 D 点。

Bresenham 直线生成算法

知乎上面也有个专栏很形象地介绍了该过程:https://zhuanlan.zhihu.com/p/106155534

使用Bresenham 算法,就能够快速的获得这条直线与三维数据集的交点序列,这个序列中的每一个像素点都是最接近真实直线与三维数据集的每一个交点,这样就省去了“传统直接插值的光线追踪算法”的插值和求整运算,只需要进行少量的浮点运算,就能够获得每一条射线上交点的总的 CT 值,大大加快了 DRR 图像的生成速度。

SiddonJacobs的光线追踪算法

该方法在itk remote module中的TwoProjectionRegistration有进行实现(链接:https://github.com/InsightSoftwareConsortium/ITKTwoProjectionRegistration),该库也可以直接在编译安装itk的过程中直接build

该方法最初由R. L. Siddon在文章"Fast calculation of the exact radiological path for a 3-dimensional CT array"中介绍,然后由F. Jacobs, E. Sundermann, B. D. Sutter, and I. Lemahieu在文章"A fast algorithm to calculate the exact radiological path through a pixel or voxel space"进行了改进。如果要看得很细节,可以参考后者的文章"A fast algorithm to calculate the exact radiological path through a pixel or voxel space"

SiddonJacobs的光线追踪算法

光线追踪算法究其细节,就是要获得该条射线穿过了哪儿些体素,然后同时要获得这些体素的CT值以及光线穿过该体素时候经过的长度。

SiddonJacobs算法的优势之处就在于,使用α来表示该条射线归一化的长度,其值为0则表示该点是在光源点,其值为1则表示该点是在Detector上的像素点,使用该α可以同时追踪光线和在CT上的像素位置。

下面来详细说明该图,每个方块代表一个体素(图上为了方便只写2D情况,3D下可以很简单地类比过去),每一条横线代表一个x平面,每一条纵线代表一个y平面,p1为光源,p2为Detector上的像素点。在最开始,只知道CT上每个x y平面的物理空间位置以及p1和p2点的物理空间位置,并不清楚入射点出射点的坐标,甚至不清楚光线是否与CT相交。

  1. 首先,通过文章"A fast algorithm to calculate the exact radiological path through a pixel or voxel space"里的公式,将所有的α求出来,α由两个数组构成,分别是“光线与全部x平面的交点” 以及 “光线与全部y平面的交点”,利用该公式,α又同时能反过来算出是与哪儿个x平面或者哪儿个y平面相交(这点很重要,因为最后求和的时候,需要累加光线与体素相交的长度及其对应的CT值,CT值就需要知道是哪儿个像素才行)。

  2. 其次,将全部的α升序排列,然后邻位相减,这样就可以得到每小段长度的比例。

  3. 最后,将上述邻位相减的α值,依次乘以光线总长度,依次得到每小段光线的真实长度;再通过第一步骤计算α的公式,依次反过来拿回每小段光线经过像素的坐标,从而得到每小段光线经过像素的CT值,将两个数组对应相乘,再求和,即可得到该条光线的模拟x光射线的数值。

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

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

相关文章

Oracle客户端 PL/SQL Developer:

1、配置文件进行导入导出 2、提示“ORA-00900: 无效 SQL 语句“解决方法 在PL/SQL中的SQL窗口用desc想显示指定表格abs_generl.prodord_sku的结构&#xff0c;提示无效语句 PL/SQL切换到命令窗口&#xff0c;再用desc显示表格abs_generl.prodord_sku的结构&#xff0c;执行成功…

2023年面试题之Dubbo基础

1. 为什么要用 Dubbo&#xff1f;随着服务化的进一步发展&#xff0c;服务越来越多&#xff0c;服务之间的调用和依赖关系也越来越复杂&#xff0c;诞生了面向服务的架构体系(SOA)&#xff0c;也因此衍生出了一系列相应的技术&#xff0c;如对服务提供、服务调用、连接处理、通…

libtorch c++ 使用预训练权重(以resnet为例)

任务&#xff1a; 识别猫咪。 目录 1. 直接使用 1.1 获取预训练权重 1.2 libtorch直接使用pt权重 2. 间接使用 2.1 BasicBlock 2.2 实现ResNet 2.3 BottleNeck 1. 直接使用 1.1 获取预训练权重 比如直接使用Pytorch版的预训练权重。先把权重保存下来&#xff0c;并打印…

vue+element详细完整实现个人博客、个人网站

一.前言 博客成品在线预览&#xff1a;点击访问 接上一篇《vueelementui实现非常好看的博客、网站首页&#xff0c;网站模板》。 上一篇实现了整个框架的搭建和首页的编码&#xff0c;在此基础上&#xff0c;这一期进行了最终的功能页面完善&#xff0c;增加了功能&#xff1a…

【自学Python】Python合并字符串

Python合并字符串 Python合并字符串教程 在开发过程中&#xff0c;很多时候我们有合并 字符串 的需求&#xff0c;即把一个 元祖 或 列表 中包含的多个字符串连接成一个字符串。这个操作是 分割字符串 的逆操作。 在 Python 中&#xff0c;合并字符串我们使用 join() 函数。…

过气明星李嘉明和《丁香花》唐磊,找哪个录制祝福视频值100万

说起娱乐圈的明星&#xff0c;给人的感觉都是光鲜亮丽&#xff0c;因为他们有流量有热度&#xff0c;想要赚钱就太容易了。过去的娱乐圈明星&#xff0c;都是靠自己的专业赚钱&#xff0c;比如说你是著名歌星&#xff0c;就要靠唱歌赚钱&#xff0c;如果你是影视明星&#xff0…

天天都接触的以太网接口,你知道有哪些类型和参数吗?

以太网接口简介 以太网接口是一种用于局域网组网的接口&#xff0c;包括&#xff1a;以太网电接口、以太网光接口。 为了适应网络需求&#xff0c;设备上定义了以下几种以太网接口类型&#xff1a; 二层以太网接口 是一种物理接口&#xff0c;工作在数据链路层&#xff0c;不…

ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化

1、前言 在早期版本的ASP.NET Core项目中&#xff0c;Newtonsoft.Json的使用率非常高。虽然微软当前主推System.Text.Json来处理JSON的序列化和反序列化&#xff0c;但Newtonsoft.Json在这方面做的也是相当不错&#xff0c;下面就来介绍一下它的用法。 2、引入Newtonsoft.Jso…

echarts柱状图值为0是不显示以及柱状图百分比展示

echarts柱状图值为0是不显示以及柱状图百分比展示 1.效果展示 2.代码 <template><div id"container"><div id"main"></div></div> </template> <script>import * as echarts from echarts import * as lodash…

代码随想录第四天(203、707)

文章目录一、链表知识203. 移除链表元素提交看答案之后的豁然开朗707. 设计链表完全不会&#xff0c;看完答案后改的一、链表知识 1、链表在内存中的存储不是连续的 意思是这个链表的其实节点是2&#xff0c;终止节点是7 2、链表和数组的对比 数组的长的是固定的&#xff0c…

【Iot】阿里云物联网平台入门之什么是消息解析、什么是Topic、JavaScript脚本示例解析

在IoT场景中&#xff0c;很多传感器采集到的都是二进制数据&#xff0c;或者私有协议格式数据流&#xff0c;设备端又不具备转换成结构化JSON的能力&#xff0c;这时候我们可以借助IoT物联网平台云端自定义数据解析能力&#xff0c;转换Modbus&#xff0c;电力协议&#xff0c;…

YOLO家族系列模型的演变:从v1到v8(下)

昨天的文章中&#xff0c;我们回顾了 YOLO 家族的前 9 个架构。本文中将继续总结最后3个框架&#xff0c;还有本月最新发布的YOLO V8. YOLOR Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao “You Only Learn One Representation: Unified Network for Multiple Tasks”202…

JavaWeb-JavaScript

JavaWeb-JavaScript 1&#xff0c;JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#…

43. 【农产品溯源项目前后端Demo】后端二次开发的重点修改位置

前面讲过农产品溯源Demo比较简单,如果想二次开发需要重点关注的目录。 如果要开发一个新的API、对接新的合约,需要有哪些步骤? 定义数据结构,在domain包新增Class,定义好数据字段,定义好get、set方法。domain包没有业务的逻辑实现,只有结构、字段定义。 如果字段首字母小…

手摸手学会node框架之一——koa 傻瓜式小白教程

一、Koa简介 基于 Node.js 平台的下一代 web 开发框架。 由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 详细请参考Koa官网进行学习。 二、Koa基础入门 1.项目初始化 执行 npm init -y, 生成…

博客之星规则能否参照“金球奖”

文章目录课前小差粉丝对我的价值粉丝数量的提升KOL与粉丝链接粉丝影响收入博客之星规则设想博客之星新玩法&#xff1f;内部评审展望2023写在最后课前小差 哈喽&#xff0c;大家好&#xff0c;我是几何心凉&#xff0c;这是一份全新的专栏&#xff0c;唯一得倒CSDN王总的授权&…

小侃设计模式(廿一)-状态模式

1.概述 状态模式&#xff08;State Pattern&#xff09;是行为型设计模式的一种&#xff0c;它主要用来解决对象存在多种状态转换时&#xff0c;需要对外输出不同的行为。状态模式与策略模式有一定相似&#xff0c;区别在于策略模式行为彼此独立&#xff0c;可以进行相互替换&…

VueJs中的toRef与toRefs函数的一个比较

前言ref是处理基本数据类型响应式API函数,在setup中声明定义的变量,可以直接在模板中使用没有被响应式API包裹处理的变量数据,是不具备响应式能力的也就是往往在逻辑中修改了数据,但是页面不会更新,那怎么样将一个非响应式数据变成响应式数据就需要用到toRef()与toRefs()这两个…

【计算机网络】网络编程套接字

文章目录理解源IP地址和目的IP地址理解端口号和进程ID理解源端口号和目的端口号认识TCP协议认识UDP协议网络字节序socket编程接口socket网址查看socket常见APIUDP协议实现网络通信UDP创建socket文件描述符sockaddr结构UDP绑定端口号UDP接收发送网络数据简单的UDP网络程序TCP协议…

拉伯证券|大股东或易主,阿里巴巴换股入局

三大股指齐上扬&#xff0c;早盘主力埋伏这些股。 到午间收盘&#xff0c;“家居零售榜首股”之称的美凯龙一字涨停&#xff0c;港股红星美凯龙涨24%&#xff0c;此前一度涨超30%。 消息面上&#xff0c;1月13日晚间&#xff0c;美凯龙发布公告称&#xff0c;公司控股股东红星…