转自:https://www.cnblogs.com/Uncle-Joker/p/13686618.html

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

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

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

2.检查设备示意图

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

3.算法流程

4.代码实现:

创建图像结构

public FrameGeometry(DicomDataset image): this(image.GetString(DicomTag.FrameOfReferenceUID),image.GetValues<double>(DicomTag.ImagePositionPatient),image.GetValues<double>(DicomTag.ImageOrientationPatient),image.GetValues<double>(DicomTag.PixelSpacing),image.GetSingleValue<int>(DicomTag.Columns),image.GetSingleValue<int>(DicomTag.Rows)){// TODO: FrameOfReferenceUID:图片UIDImagePositionPatient:病人方向ImageOrientationPatient:图片方向PixelSpacing:像素间距Columns:宽度Rows:高度}

判断是否符合定位条件:

     /// <summary>/// 判断是否可以画定位线/// </summary>/// <param name="sourceFrame">源图像结构</param>/// <param name="destinationFrame">目标图像结构</param>/// <returns></returns>public static bool CanDrawLocalizer(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;// 检查FrameOfReferenceUidif (string.IsNullOrEmpty(sourceFrame.FrameOfReferenceUid) || string.IsNullOrEmpty(destinationFrame.FrameOfReferenceUid)) return false;if (sourceFrame.FrameOfReferenceUid != destinationFrame.FrameOfReferenceUid) return false;return true;}

计算交线点:

     /// <summary>///回两个图像相交处公共像素线/// </summary>/// <param name="sourceFrame">源图像结构</param>/// <param name="destinationFrame">目标图像结构</param>/// <param name="startPoint">起点输出</param>/// <param name="endPoint">重点输出</param>/// <returns></returns>public static bool CalcualteIntersectionLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame, out Point2 startPoint, out Point2 endPoint){double t; // 平面方程系数double nA, nB, nC, nD, nP;var lstProj = new List<Point3D>();// 初始化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;//  ABif (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));}// BCif (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));}// CDif (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));}// DAif (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客户端:

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

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

C#开发PACS医学影像处理系统(三):界面布局之工具栏

C#开发PACS医学影像处理系统(四):界面布局之状态栏

C#开发PACS医学影像处理系统(五):查询病人信息列表

C#开发PACS医学影像处理系统(六):加载Dicom影像

C#开发PACS医学影像处理系统(七):读取影像Dicom信息

C#开发PACS医学影像处理系统(八):单元格变换

C#开发PACS医学影像处理系统(九):序列控件与拖拽

C#开发PACS医学影像处理系统(十):Dicom影像下载策略与算法

C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议

C#开发PACS医学影像处理系统(十二):绘图处理之图形标记

C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量

C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色

C#开发PACS医学影像处理系统(十九):Dicom影像放大镜

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

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

    1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...

  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. 58. Length of Last Word
  2. 4. 连续时间鞅(REN)
  3. how to add the language things at the idiscover
  4. S5PV210 软件实现电阻屏两点触摸
  5. 科学院开放资源github_什么是开放科学?
  6. 下载地址jquery upload file demo (C#)
  7. windows下mysql备份脚本
  8. 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
  9. php html5 应用缓存,HTML5 应用程序缓存
  10. Cannot resolve plugin org.apache.maven.plugins:xxxx
  11. NLP - snownlp
  12. 景区门票分销系统解决方案
  13. autojs读取文字_Auto.js 获取识别图片文本
  14. Python实现繁体字和简体字的相互转换
  15. linux rm 文件找回_linux rm -rf * 文件恢复记
  16. 华为ensp 错误代码 :40
  17. mysql修改密码报错:Your password does not satisfy the current policy requirements
  18. 基于mindwave脑电波进行疲劳检测算法的设计(1)
  19. 手机的Ram和Rom是什么意思
  20. 电脑桌面图标变成蓝色的怎么办

热门文章

  1. Linux监控工具介绍系列——smem
  2. CentOS 7.2.1511 x64下载地址
  3. Datagridview绘制
  4. 集合框架(一) ----------Map集合遍历的方法
  5. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25
  6. JS 判断滚动底部并加载更多效果。。。。。。。。。
  7. Bringing up interface eth0: Device eth0 does not seem to be presen
  8. linux 修改消息队列大小
  9. 收藏:flex/flash
  10. 机器学习的一些注意事项