当前位置: 代码迷 >> 综合 >> KISS Dicom Viewer : 一个简单的 DICOM 浏览器
  详细解决方案

KISS Dicom Viewer : 一个简单的 DICOM 浏览器

热度:3   发布时间:2024-02-20 11:03:26.0

KISS Dicom Viewer : 一个简单的 DICOM 浏览器

  • 0 前言
  • 1 软件介绍
    • 1.1 软件命名
    • 1.2 使用拓展库
    • 1.3 程序架构
    • 1.4 代码规范
    • 1.5 软件界面
    • 1.6 参考代码
    • 1.6 Dicom Modality 支持
  • 2 开发计划和进度
    • 2.1 已经开发
    • 2.2 待开发
  • 3 具体实现
    • 3.1 显示ui --- 屏幕分割显示布局
    • 3.2 Dicom数据结构 ---- DicomImage --> QSharedData
    • 3.3 Dicom数据结构 ---- DicomImage --> Series
    • 3.4 打开数据 ---- 打开 dcm 文件、打开 dcm 文件夹
    • 3.5 图片浏览器交互 ---- 框选ROI 自适应窗位窗宽
    • 3.6 图片浏览器交互 ---- 浏览序列
    • 3.X 慢慢完善 ......
  • 4 源码

0 前言

??一直没有找到一个合适的Dicom 浏览器。Windos下的小蚂蚁很好用RadiAnt Dicom Viewer但可惜不是跨平台的,只有Windos版本。平时工作系统是Deepin,虽然用deepin-wine5也可以安装RadiAnt Dicom Viewer但是跟Windos下比起来很多功能不能用,比如pacs scu,数据库(rdvdb)用deepin-wine5装的也有bug,小蚂蚁中文版还有很多乱码。
??
??全平台都支持并且跟小蚂蚁一样又小又快的还有两个Papaya和DWV,该有的功能很齐全,虽然开源但是一个是JavaScript一个是lua,如果想大改自己改也无从下手。
??
?? ItkSnap 和 3DSlicer 也都是全平台的,都很强大而且都是开源的。架构都很好,可以自己任意开发插件添加进去。如果把这两个只当成DICOM 浏览器实在有点大材小用。

??
??
????RadiAnt Dicom Viewer
??在这里插入图片描述
??
??
????Papaya
??
在这里插入图片描述

??
??
????DWV
??在这里插入图片描述
??
??
???? ItkSnap
??
在这里插入图片描述

??
??
????3DSlicer
??
在这里插入图片描述

??本着学习DICOM协议的目的,干脆仿照小蚂蚁自己做一个DicomViewer好了。小蚂蚁安装完了所有本地文件才8M,而且包含了(cpu/gpu)体渲染模块,速度快效率高,实在不知道他是怎么实现的。自己做的肯定跟小蚂蚁没法比,学习为主嘛。

1 软件介绍

??一个仿照RadiAnt Dicom Viewer的开源的Dicom浏览器,主要用于自己学习,和方便快速开发自己的医学影像浏览器。

1.1 软件命名

??KISS Dicom Viewer
??
????KISS指:Keep it Simple and Stupid

1.2 使用拓展库

  • 界面 Qt
  • DICOM协议相关用?DCMTK
  • 数据库用?Sqlite3
  • 数据库浏览打算改一下?sqlitebrowser
  • PACS用?DICOM storage (C-STORE) SCU
  • 2D图片浏览用 ?QGraphicsView
  • 多平面重建-MPR用 ? QVTKOpenGLNativeWidget
  • 三维重建-体渲染用? QVTKOpenGLNativeWidget
  • 图像融合和图像处理用? Opencv

1.3 程序架构

??就是简单的事件驱动架构。
??为了加快打开速度,计划 MPR体渲染图像处理 等跟vtk Opencv相关的采用插件(或者独立软件,如果添加vtk软件大小和速度直接增加一倍)形式作为拓展选项。

1.4 代码规范

??目前还在开发阶段,而且是空余时间,没做代码优化逻辑很乱也不是很规范,到处抄的代码,命名也一塌糊涂,等都开发完成再统一修改。

1.5 软件界面

??就先完全抄小蚂蚁好了,后期有时间再美化。

1.6 参考代码

??学习为主,而且自己造轮子也肯定一堆Bug。还不如先到处抄代码呢。除了几款常用的开源Dicom软件,还抄了下边这几个。

  • 朱满根 / DicomViewer
  • 飞扬青云 / QWidgetDemo
  • 浓咖啡 / QtOpenUtils

1.6 Dicom Modality 支持

??目前适配的Modality包括 CT、XA、IVUS、OCT、US,其余的可以浏览影像,但是注释等设置和交互参数只能为默认值。这个已经封装成 XML 配置,后续慢慢加。

在这里插入图片描述
在这里插入图片描述

2 开发计划和进度

2.1 已经开发

模块 操作
打开数据 打开 dcm 文件
打开数据 打开 dcm 文件夹
- -
导出数据 导出当前图像 jpeg bmp …
导出数据 导出图片到剪贴板
- -
显示ui 屏幕分割显示布局
显示ui 序列预览条
显示ui 全屏
显示ui 显示注释
显示ui 显示鼠标位置和灰度
显示ui 显示窗位窗宽
显示ui 显示比例尺
显示ui 设置显示字体
- -
图片浏览器交互 浏览序列
图片浏览器交互 调整窗位窗宽
图片浏览器交互 移动图像
图片浏览器交互 缩放图像
图片浏览器交互 放大图像
图片浏览器交互 局部放大图像
图片浏览器交互 框选ROI 自适应窗位窗宽
图片浏览器交互 自适应放大图像
图片浏览器交互 100/200/400放大图像
图片浏览器交互 测量长度/角度/矩形面积/椭圆面积/添加描述文字
- -
图像处理 旋转
图像处理 翻转

2.2 待开发

模块 操作
打开数据 打开 dcmzip 文件
- -
导出数据 导出当前序列 pngs
导出数据 导出当前序列 mp4
- -
显示ui 显示所有dicom标签
- -
图片浏览器交互 差值测量
图片浏览器交互 脊柱侧弯测量
图片浏览器交互 播放模式
- -
图像处理 锐化
图像处理 平滑
图像处理 提取边缘
图像处理 emboss滤波
- -
插件 多平面重建(MPR)
插件 三维重建(体渲染)
插件 图像融合
插件 减值操作
- -
数据库 一个小型单机本地数据库 (.rdvdb)
数据库 数据库浏览器
- -
PACS 提供一个小型的pacs scu
PACS 提供一个小型的pacs scp

3 具体实现

3.1 显示ui — 屏幕分割显示布局

????Qt 实现 屏幕分割显示布局,可以任意拖拽显示
??
??

在这里插入图片描述
??
??
在这里插入图片描述

??
??

3.2 Dicom数据结构 ---- DicomImage --> QSharedData

??把DicomImage封装成 QSharedData 使用 (显式共享)

?? 把DicomImage封装成 QSharedData ,让后利用Qt实现可视化。
?? ?? ├── PATIENT (病人)
?? ?? │ │ └── STUDY (检查)
?? ?? │ │ │ │ └── SERIES (序列)
?? ?? │ │ │ │ │ │ └── IMAGE (影像 高度为未知)
?? ?? │ │ │ │ └── SERIES (序列)
?? ?? │ │ │ │ │ │ └── IMAGE (影像 高度为1)
?? ?? │ │ │ │ │ │ └── IMAGE (影像 高度为1)
?? ?? │ │ └── STUDY (检查)
?? ?? │ │ │ │ └── SERIES (序列)
?? ?? │ │ │ │ │ │ └── IMAGE (影像)

3.3 Dicom数据结构 ---- DicomImage --> Series

??Dicom数据结构 ---- DicomImage --> SeriesInstance

?? 根据协议可以知道每个Series中可以有单帧或多帧。
?? 多帧时 每帧影像尺寸高度是1
?? 单帧时 每帧影像尺寸高度未知

  • 单帧模式高度代表当前时间 !
  • 多帧模式高度代表空间位置 !
    enum  SeriesPattern {
    Empty_Frame,  //Single_Frame, // 单帧Multi_Frame,  // 多帧};

?? 涉及到Series,2D可视化肯定会有方向

??(多帧模式下)区分平面
??(单帧模式下)只有XY平面显示模式,另外两个平面表示时间密度曲线,与其相关打算作为插件用opencv做,所以这里封装的Series其余两个平面均指多帧模式。

3.4 打开数据 ---- 打开 dcm 文件、打开 dcm 文件夹

??Qt 实现 打开 文件/文件夹 同一个接口

??Qt 实现一个批量加载线程(单线程)

??Qt 实现一个 文件监听线程

如何打开一个dcm影像
??把DicomImage封装成 QSharedData 使用 (显式共享) 2.4 DcmFileFormat 获取 常用标签/图片

3.5 图片浏览器交互 ---- 框选ROI 自适应窗位窗宽

??Qt 实现 RubberBandDrag 框选

在这里插入图片描述

在这里插入图片描述

3.6 图片浏览器交互 ---- 浏览序列

??QGraphicsView 按住鼠标实现帧数切换

在这里插入图片描述

3.X 慢慢完善 …

4 源码

??目前还在开发阶段,而且是空余时间,没做代码优化逻辑很乱也不是很规范,到处抄的代码,命名也一塌糊涂,等都开发完成再统一修改。

  相关解决方案