pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
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影像交叉定位线算法相关推荐
- 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
转自:https://www.cnblogs.com/Uncle-Joker/p/13686618.html 1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向 ...
- 【转】C#开发PACS医学影像处理系统(一):开发背景和功能预览
转自:https://www.cnblogs.com/Uncle-Joker/p/13646949.html 本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关 ...
- 【转】C#开发PACS医学影像处理系统(二):界面布局之菜单栏
转自:C#开发PACS医学影像处理系统(二):界面布局之菜单栏 - 乔克灬叔叔 - 博客园 在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并 ...
- vtk相机_C#开发PACS医学影像三维重建(一)使用VTK重建3D影像
VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...
- 使用模型驱动开发(MDD)的十五个理由
什么是模型驱动开发(MDD)?为什么使用MDD?本文将回答这些问题,告诉您在软件项目中使用模型驱动开发的十五个理由. AD: [51CTO译文]什么是模型驱动开发(MDD)?为什么使用MDD?本文将回 ...
- 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试
上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...
- Android开发笔记(一百三十五)应用栏布局AppBarLayout
应用栏布局AppBarLayout Android5.0推出工具栏Toolbar用来替代ActionBar,灵活性和易用性大大增强,有关Toolbar的详细介绍参见< Android开发笔记(一 ...
- 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- ARM开发(6)系统移植初步(搭建交叉开发环境)
先和大家聊一聊我对于系统移植学习的感悟,之前在老师的带领,我们移植系统的时候执行了一条条指令,但是总感觉哪里有一些问题又说不出来,这些指令都解决了很多问题:但是说到底,自己却不明白这些指令到底是怎么去 ...
最新文章
- 宇宙中至少有两种方式能灭绝人类,第一种仅需两秒
- 国内首家智能心电SaaS平台“琅瑞医疗”获Pre-A轮融资,磐霖资本主投...
- android Json详解
- 生日快乐的代码_生日快乐,我的上电!
- python里none什么意思_python中stream=None什么意思?
- 炉石android更新日志,炉石传说每逢更新必卡门,安卓用户你们想哭了吗?
- android 文件mimetype_android获取文件getMimeType的两种方法
- angular跳转指定页面_通过 angular CDK 实现页面元素拖放
- sqlmap地表最强sql注入检测工具学习使用
- 【clickhouse】clickhouse 最佳实践
- Windows Server 2008 故障转移群集简介
- Android视频播放
- C++ Primer Plus 第三章编程练习
- 软件定义汽车-AUTOSAR解决方案
- 机器人学之动力学笔记【11】—— 拉格朗日 动力学方程
- 软件工程基础知识-软件质量
- 利用Eigen求广义逆矩阵
- Planning with Goal-Conditioned Policies读书笔记
- 常见地图服务(WMS、WFS、WCS、TMS、WMTS
- DCOS之Mesos-DNS介绍