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