1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线。

举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫描,扫描到眼睛这个位置,

而左边图像是从左手到右手的扫描切片,那么右边图像的位置就恰好在左边图像的眼睛的位置,用红线标出的位置则为定位线,一般用于医生参考病灶在矢状面、冠状面和横断面的具体方位。

2.检查设备示意图

在笛卡尔空间直角坐标系中,Y 右肩膀到左肩膀,X 后背到前胸,Z 足到头

3.算法流程

4.代码实现:

创建图像结构

publicFrameGeometry(DicomDataset image)

:this(image.GetString(DicomTag.FrameOfReferenceUID),

image.GetValues(DicomTag.ImagePositionPatient),

image.GetValues(DicomTag.ImageOrientationPatient),

image.GetValues(DicomTag.PixelSpacing),

image.GetSingleValue(DicomTag.Columns),

image.GetSingleValue(DicomTag.Rows))

{//TODO:

FrameOfReferenceUID:图片UID

ImagePositionPatient:病人方向

ImageOrientationPatient:图片方向

PixelSpacing:像素间距

Columns:宽度

Rows:高度

}

判断是否符合定位条件:

/// ///判断是否可以画定位线///

/// 源图像结构

/// 目标图像结构

///

public static boolCanDrawLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame)

{//检查图像结构

if (sourceFrame == null) return false;if (destinationFrame == null) return false;//如果两个帧中的任何一个不是空间坐标系,则无法定位

if (sourceFrame.Orientation == FrameOrientation.None || destinationFrame.Orientation == FrameOrientation.None) return false;//只有正交图像才能绘制,方向相同则退出

if (sourceFrame.Orientation == destinationFrame.Orientation) return false;//检查FrameOfReferenceUid

if (string.IsNullOrEmpty(sourceFrame.FrameOfReferenceUid) || string.IsNullOrEmpty(destinationFrame.FrameOfReferenceUid)) return false;if (sourceFrame.FrameOfReferenceUid != destinationFrame.FrameOfReferenceUid) return false;return true;

}

计算交线点:

///

///回两个图像相交处公共像素线

///

/// 源图像结构

/// 目标图像结构

/// 起点输出

/// 重点输出

///

public static bool CalcualteIntersectionLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame, out Point2 startPoint, outPoint2 endPoint)

{double t; //平面方程系数

doublenA, nB, nC, nD, nP;var lstProj = new List();//初始化

startPoint =Point2.Origin;

endPoint=Point2.Origin;//验证

if(destinationFrame.DirectionNormal.IsZero)return false;

nP= destinationFrame.DirectionNormal *destinationFrame.PointTopLeft;

nA= destinationFrame.DirectionNormal *sourceFrame.PointTopLeft;

nB= destinationFrame.DirectionNormal *sourceFrame.PointTopRight;

nC= destinationFrame.DirectionNormal *sourceFrame.PointBottomRight;

nD= destinationFrame.DirectionNormal *sourceFrame.PointBottomLeft;//AB

if (Math.Abs(nB - nA) >Constants.Epsilon)

{

t= (nP - nA) / (nB -nA);if (t > 0 && t <= 1)

lstProj.Add(sourceFrame.PointTopLeft+ t * (sourceFrame.PointTopRight -sourceFrame.PointTopLeft));

}//BC

if (Math.Abs(nC - nB) >Constants.Epsilon)

{

t= (nP - nB) / (nC -nB);if (t > 0 && t <= 1)

lstProj.Add(sourceFrame.PointTopRight+ t * (sourceFrame.PointBottomRight -sourceFrame.PointTopRight));

}//CD

if (Math.Abs(nD - nC) >Constants.Epsilon)

{

t= (nP - nC) / (nD -nC);if (t > 0 && t <= 1)

lstProj.Add(sourceFrame.PointBottomRight+ t * (sourceFrame.PointBottomLeft -sourceFrame.PointBottomRight));

}//DA

if (Math.Abs(nA - nD) >Constants.Epsilon)

{

t= (nP - nD) / (nA -nD);if (t > 0 && t <= 1)

lstProj.Add(sourceFrame.PointBottomLeft+ t * (sourceFrame.PointTopLeft -sourceFrame.PointBottomLeft));

}

if (lstProj.Count != 2)return false;//从空间坐标系返回平面坐标系

startPoint = destinationFrame.TransformPatientPointToImage(lstProj[0]);

endPoint= destinationFrame.TransformPatientPointToImage(lstProj[1]);return true;

}

得到坐标之后就可以利用绘图操作类(参考本系列教程之图形标记)来自己绘制定位线。

看效果:

对于较复杂的身体部位,也可以同时绘制定位线范围,来确定当前序列的定位范围,思路是先计算第一帧和最后一帧,用黄色虚线标出,再计算当前帧。

看效果:

C#开发PACS、RIS、3D医学影像处理系统系列教程目录整理:

菜鸟入门篇:

PACS客户端:

PACS三维处理医学图像:

C#开发PACS医学影像三维重建(二):使用VTK进行体绘制

C#开发PACS医学影像三维重建(三):纹理映射与颜色传输

C#开发PACS医学影像三维重建(四):3D网格平滑效果

C#开发PACS医学影像三维重建(五):基于梯度透明的组织漫游

C#开发PACS医学影像三维重建(六):三维光源与阴影效果

C#开发PACS医学影像三维重建(七):空间测量与标注

C#开发PACS医学影像三维重建(八):VR体绘制

C#开发PACS医学影像三维重建(九):MPR三视图切面重建

C#开发PACS医学影像三维重建(十):MIP最小密度投影

C#开发PACS医学影像三维重建(十一):CPR曲面重建

C#开发PACS医学影像三维重建(十二):VE虚拟内镜技术

熟手进阶篇:

医学图像算法:

C#处理医学图像(二):图像锐化增强对比

PACS网页端 开发Web版本的PACS:

C#开发Web端PACS(一):基于PACS客户端思想重写Web端

C#开发Web端PACS(二):使用 .Net MVC 开发手机端PACS服务端

C#开发Web端PACS(三):使用HTML5和CSS3开发PACS手机端页面

C#开发Web端PACS(四):Web端与服务端的DICOM传输

C#开发Web端PACS(五):Web端的平移缩放旋转2D操作

C#开发Web端PACS(六):Web端的窗宽窗位调整

C#开发Web端PACS(七):将移动端接入微信公众号实现医院云胶片

登峰造极篇:

C#开发基于Python人工智能的肺结节自动检测

C#开发基于Python人工智能的脊柱侧弯曲率算法

C#开发基于Python机器学习的医学影像骨骼仿真动画

C#开发基于Python机器学习的术后恢复模拟

C#开发基于U3D的VR眼镜设备虚拟人体三维重建

C#开发基于全息投影的裸眼3D医学影像显示技术

周边附加篇:

胶片打印:

C#开发医学影像胶片打印系统(一):功能与胶片排版

C#开发医学影像胶片打印系统(二):胶片打印机通讯

C#开发医学影像胶片打印系统(三):不规则排版打印

PACS服务端:

C#开发PACS医学影像处理系统服务端(一):医疗设备的连接与收图

C#开发PACS医学影像处理系统服务端(二):高并发架构

PACS与RIS系统的通信与集成

在RIS系统中调起PACS并打开Dicom影像

云PACS与远程会诊

C#开发PACS医学影像处理系统之云PACS(区域PACS)(一):架构概述

C#开发PACS医学影像处理系统之云PACS(区域PACS)(二):远程会诊与双向转诊

科幻级视频特效:

使用Adobe After Effects 制作PACS影像处理系统宣传视频

QQ:1850969244

近10年开发经验,主攻C#、ASP MVC,HTML5,

B/S C/S 皆可,目前研究医疗领域医学影像相关技术,

任何技术问题欢迎加QQ交流。

pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法相关推荐

  1. 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

    转自:https://www.cnblogs.com/Uncle-Joker/p/13686618.html 1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向 ...

  2. 【转】C#开发PACS医学影像处理系统(一):开发背景和功能预览

    转自:https://www.cnblogs.com/Uncle-Joker/p/13646949.html 本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关 ...

  3. 【转】C#开发PACS医学影像处理系统(二):界面布局之菜单栏

    转自:C#开发PACS医学影像处理系统(二):界面布局之菜单栏 - 乔克灬叔叔 - 博客园 在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并 ...

  4. vtk相机_C#开发PACS医学影像三维重建(一)使用VTK重建3D影像

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

  5. 使用模型驱动开发(MDD)的十五个理由

    什么是模型驱动开发(MDD)?为什么使用MDD?本文将回答这些问题,告诉您在软件项目中使用模型驱动开发的十五个理由. AD: [51CTO译文]什么是模型驱动开发(MDD)?为什么使用MDD?本文将回 ...

  6. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  7. Android开发笔记(一百三十五)应用栏布局AppBarLayout

    应用栏布局AppBarLayout Android5.0推出工具栏Toolbar用来替代ActionBar,灵活性和易用性大大增强,有关Toolbar的详细介绍参见< Android开发笔记(一 ...

  8. 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  9. ARM开发(6)系统移植初步(搭建交叉开发环境)

    先和大家聊一聊我对于系统移植学习的感悟,之前在老师的带领,我们移植系统的时候执行了一条条指令,但是总感觉哪里有一些问题又说不出来,这些指令都解决了很多问题:但是说到底,自己却不明白这些指令到底是怎么去 ...

最新文章

  1. 宇宙中至少有两种方式能灭绝人类,第一种仅需两秒
  2. 国内首家智能心电SaaS平台“琅瑞医疗”获Pre-A轮融资,磐霖资本主投...
  3. android Json详解
  4. 生日快乐的代码_生日快乐,我的上电!
  5. python里none什么意思_python中stream=None什么意思?
  6. 炉石android更新日志,炉石传说每逢更新必卡门,安卓用户你们想哭了吗?
  7. android 文件mimetype_android获取文件getMimeType的两种方法
  8. angular跳转指定页面_通过 angular CDK 实现页面元素拖放
  9. sqlmap地表最强sql注入检测工具学习使用
  10. 【clickhouse】clickhouse 最佳实践
  11. Windows Server 2008 故障转移群集简介
  12. Android视频播放
  13. C++ Primer Plus 第三章编程练习
  14. 软件定义汽车-AUTOSAR解决方案
  15. 机器人学之动力学笔记【11】—— 拉格朗日 动力学方程
  16. 软件工程基础知识-软件质量
  17. 利用Eigen求广义逆矩阵
  18. Planning with Goal-Conditioned Policies读书笔记
  19. 常见地图服务(WMS、WFS、WCS、TMS、WMTS
  20. DCOS之Mesos-DNS介绍

热门文章

  1. 外景黑纱婚纱照高级感十足
  2. 常微分实验(1.1) 变量分离方程与变量变换
  3. 【练拳不练功,到老一场空】深入浅出计算机组成原理
  4. 用户运营的核心本质是什么?分级、分类、分阶段
  5. 附PPT|阿里巴巴实时数仓最新架构图
  6. 计算机ppt技巧,5个PPT设计小技巧,让PPT不再呆板
  7. 耳下长包图片_【耳廓里长了个硬包图片】_表现_症状-大众养生网
  8. 国家返工潮?国外放假潮?疫情控制我们狠狠秀了一次“肌肉”
  9. 公众号如何申请微信支付?
  10. FreeRTOS 移植