系列文章

1.C# 实现医学影像 DICOM  工作站(1):项目介绍

2.C# 实现医学影像 DICOM 工作站(2):Dicom影像导入和工作列表

3.C# 实现医学影像 DICOM 工作站(3):实现Dicom影像的展示

4.C# 实现医学影像 DICOM 工作站(4):实现Dicom影像的调窗,缩放,移动,旋转,透镜等功能

5.C# 实现医学影像 DICOM 工作站(5):实现Dicom影像序列的多平面重建(MPR)

6.C# 实现医学影像 DICOM 工作站(6):使用VTK实现影像序列的体绘制(VR)

7.C# 实现医学影像 DICOM 工作站(7):使用AI功能完成肺间质性疾病(ILD)的分析和源码下载

核心代码:

  private async void StartTask(){bool isImport = false;try{var fileInfos = await Task.Run(() =>{DirectoryInfo dir = new DirectoryInfo(SelectPath);var files = dir.GetFiles("*.*", SearchOption.AllDirectories);return files;});llLoading.Visibility = Visibility.Hidden;llLoadBar.Visibility = Visibility.Visible;llLoadBar.Value = 0;llLoadBar.Minimum = 0;llLoadBar.Maximum = fileInfos.Length;Action<string> actionBar = new Action<string>(UpdateBar);Action<string> actionMsg = new Action<string>(UpdateMsg);Dictionary<string, DcmSeries> dic = new Dictionary<string, DcmSeries>();await Task.Run(() =>{foreach (var fileInfo in fileInfos){try{this.Dispatcher.BeginInvoke(actionBar, fileInfo.FullName);var suffix = fileInfo.Extension.ToLower();if (suffix == ".dcm" || string.IsNullOrEmpty(suffix)){if (!DicomFile.HasValidHeader(fileInfo.FullName)){continue;}var file = DicomFile.Open(fileInfo.FullName);var data = file.Dataset;var seriesIuid = data.GetValueOrDefault<string>(DicomTag.SeriesInstanceUID, 0, null);if (string.IsNullOrEmpty(seriesIuid)){continue;}if (!dic.ContainsKey(seriesIuid)){var dcmSeries = new DcmSeries();dcmSeries.SeriesIuid = seriesIuid;dcmSeries.AccessionNo = data.GetValueOrDefault<string>(DicomTag.AccessionNumber, 0, null);dcmSeries.PatientName = data.GetValueOrDefault<string>(DicomTag.PatientName, 0, null);dcmSeries.PatientName = DicomUtil.GetPatientName(dcmSeries.PatientName);dcmSeries.Gender = data.GetValueOrDefault<string>(DicomTag.PatientSex, 0, null);dcmSeries.Modality = data.GetValueOrDefault<string>(DicomTag.Modality, 0, null);dcmSeries.PatientBrithDate = data.GetValueOrDefault<string>(DicomTag.PatientBirthDate, 0, null);dcmSeries.PatientId = data.GetValueOrDefault<string>(DicomTag.PatientID, 0, null);dcmSeries.SeriesDescription = data.GetValueOrDefault<string>(DicomTag.SeriesDescription, 0, null);dcmSeries.StudyDate = data.GetValueOrDefault<string>(DicomTag.StudyDate, 0, null);dcmSeries.StudyId = data.GetValueOrDefault<string>(DicomTag.StudyID, 0, null);dcmSeries.SeriesNumber = data.GetValueOrDefault<string>(DicomTag.SeriesNumber, 0, null);dcmSeries.Thinkness = data.GetValueOrDefault<string>(DicomTag.SliceThickness, 0, null);dcmSeries.FileCount = 0;dcmSeries.DicomFiles = new List<DcmFile>();dic.Add(seriesIuid, dcmSeries);}DcmSeries temSeries = dic[seriesIuid];DcmFile dcmFile = new DcmFile();dcmFile.InstanceNumbder = data.GetValueOrDefault<int>(DicomTag.InstanceNumber, 0, 1);dcmFile.SliceLocation = data.GetSingleValue<double>(DicomTag.SliceLocation);dcmFile.InstanceUid = data.GetValueOrDefault<string>(DicomTag.SOPInstanceUID, 0, null);dcmFile.Path = fileInfo.FullName;temSeries.DicomFiles.Add(dcmFile);}}catch (Exception ex){}}if (dic.Count > 0){isImport = true;this.Dispatcher.BeginInvoke(actionMsg, "正在进行归档.......");using (DicomDBContext db = DicomDBContext.getInstance()){foreach (var item in dic){string seriesUID = item.Key;var tem = db.DcmSerieses.Where(m => m.SeriesIuid == seriesUID).ToList();DcmSeries series = null;if (tem.Count() > 0){series = tem.First();db.DcmSerieses.Remove(series);var temList = db.DcmFiles.Where(m => m.SeriesId == series.Id).ToList();db.DcmFiles.RemoveRange(temList);db.SaveChanges();}series = item.Value;var listFiles = series.DicomFiles;series.DicomFiles = null;series.LastModified = DateTime.Now;series.FileCount = listFiles.Count;db.DcmSerieses.Add(series);db.SaveChanges();foreach (var dcmFile in listFiles){dcmFile.SeriesId = series.Id;}db.DcmFiles.AddRange(listFiles);db.SaveChanges();}}}});}catch (Exception ex){HandyControl.Controls.MessageBox.Show(ex.Message, "错误信息", MessageBoxButton.OK, MessageBoxImage.Error);}finally{this.Close();if (isImport){EventBus.Instance().TriggerReloadWorkList();}}}

核心代码讲解:

1. 代码首先完成获取目录下包括子目录中所有的文件

2.使用Fo-Dicom对所有文件进行判断,判断是否是DICOM文件

3.对于是Dicom的文件进行解析.对于工作站,和普通的PACS终端不同,我们使用Series作为工作列表的层级,方便处理.

DIcom中一般存在这样的层级关系Patient->Study->Series->Instance,即一般情况下,一个病人有多个检查,一个检查存在多个序列,一个序列有可能有多个实例.

我们这里使用Series作为工作列表的层级.

4.在获取获取序列底下所有dicom文件的同时,获取InstanceNumbder ,后面我将用该属性对序列文件进行排序.

5.数据库入库,保存为2个表,一个是Series表,主要记录检查相关信息,一个是File表,用来记录该序列所包含的文件

C# 实现医学影像 DICOM 工作站(2):Dicom影像导入和工作列表相关推荐

  1. C# 实现医学影像 DICOM 工作站(1):项目介绍

    系列文章 1.C# 实现医学影像 DICOM  工作站(1):项目介绍 2.C# 实现医学影像 DICOM 工作站(2):Dicom影像导入和工作列表 3.C# 实现医学影像 DICOM 工作站(3) ...

  2. 医学图像处理入门知识 | 格式DICOM,MHD+RAW | 坐标系 | ITK-SNAP | 重采样

    医学图像处理入门知识 引言 常见的医学图像格式 DICOM mhd+raw 坐标系 世界坐标体系 解剖学坐标体系 图像坐标体系 这三个坐标体系有什么关系呢?怎样转换呢? ITK-SNAP工具使用 基本 ...

  3. 基于CUDA的医学影像数据处理工作站的配置方法

    基于CUDA的医学影像数据处理工作站的配置方法 王飞 高嵩 [摘要]:目的:以个人电脑为平台,结合CUDA(Compute Unified Device Architecture,统一计算设备架构)以 ...

  4. Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)

    引言   DICOM(Digital Imaging and Communications in Medicine)医学数字成像与通信,是医疗影像领域一个非常重要的标准,本文主要简单介绍 DICOM ...

  5. 【转】Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)

    转自:https://www.jianshu.com/p/2812b0b6e548 引言   DICOM(Digital Imaging and Communications in Medicine) ...

  6. 医学图像DICOM文件解析——DICOM内部信息详解篇

    文章目录 一.医学影像学介绍 二.DICOM文件简介 三.DICOM内部信息详解(DICOM Tag与VR) 1.常见的TAG (1) Patient Tag (2) Study Tag (3) Se ...

  7. 当医学影像遇上深度学习 | 影像数据类型一览

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 写在前面 随着医学成像技术的发展与进步,图像处理在医学研究与临床医 ...

  8. dicom虚拟打印服务器,DICOM打印服务器软件

    dicom打印服务器|dicom相机|PrintSCP|dicom胶片打印服务器|与多家PACS产品对接通过dicom胶片打印服务器(PrintSCP),接收放射设备(CT.ECT.CR.DR.MRI ...

  9. ANTS医学影像配准+Li‘s 核磁共振影像数据处理

    ANTS医学影像配准+Li's 核磁共振影像数据处理 讲解视频内容请移步Bilibili: https://space.bilibili.com/542601735 入群讨论请加v hochzeits ...

最新文章

  1. mysql中主从复制需要的酶_mysql主从复制
  2. HNOI2015题解
  3. java aes key iv_java – AES / CBC真的需要IV参数吗?
  4. 数据库schema 是什么
  5. .Net与Oracle地数据库连接池(Connection Pool)
  6. mysql 5.5 slave 配置_mysql5.5 master-slave(Replication)配置方法
  7. python中的常量可以修改吗_python实现不可修改的常量
  8. 华为p50预装鸿蒙系统,华为P50系列将至,内部测试预装鸿蒙系统,还有4款重磅新品将发布...
  9. 4 转推流格式_ppt 转 pdf怎么转?这个宝藏技巧不会太亏了!
  10. 常见六大 Web 安全攻防解析 | 技术头条
  11. 医疗相关计算机系统,智能医疗信息管理系统
  12. Wireshark抓包详细分析
  13. 全国最大孔雀养殖基地在哪里???
  14. 微信小程序怎么实现陪诊服务_陪诊小程序怎么做
  15. [JavaScript][AJAX] 前后端交互流程,ajax工作流程
  16. java使用爬虫工具jsoup实现抓取网页的内容及图片并写入到word文档中
  17. 苹果6s系统更新无服务器,我的iPhone6s国行 系统更新一直显示“正在检查更新”,无法更新是为什么?...
  18. C++中typeid的使用
  19. 【基本功】深入剖析Swift性能优化
  20. 基于机智云物联网平台的智能电梯管理系统

热门文章

  1. echarts饼图轮播效果
  2. 物流管理和计算机那个专业好,我是学计算机的女生,想跨专业考物流管理专业的研究生,好不好?...
  3. 拍摄VR全景这些硬件设备缺一不可!
  4. java猴子分桃_java编写程序五只猴子分海滩上的一堆桃子答案
  5. 在Linux中ipcs命令,Linux下ipcs指令的用法详解。
  6. 数据分析数字取证-attack 中职网络安全
  7. vue子组件向父组件传值的三种方式
  8. 剩余定理(孙子定理)
  9. 正则 数字和逗号,数字和英文,数字和点
  10. pyecharts绘制折线图