前言
一直没有找到一个合适的Dicom浏览器。Windos下的小蚂蚁(RadiAnt Dicom Viewer)很好用但可惜不是跨平台的,只有Windos版本。平时工作系统是Ubuntu/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
干脆自己做一个吧,正好还可以自己学习。花了一个月在2020.9搞了个大概能用就搁浅了。2021年由于疫情的关系,就留在杭州过年了。时间充裕,计划把KISS Dicom Viewer做完吧。
Demo展示
软件介绍
1) 软件命名
KISS Dicom Viewer
KISS指:Keep it Simple and Stupid。
2) 第三方库
- 界面 Qt
- DICOM协议相关 DCMTK
- 数据库 Sqlite3
- 数据库浏览 sqlitebrowser
- PACS用 DICOM storage (C-STORE) SCU
- 2D图片浏览用 QGraphicsView
- 插件:多平面重建(MPR)用 QVTKOpenGLNativeWidget
- 插件:三维重建-体渲染(VR) QVTKOpenGLNativeWidget + ITK
- 插件:前处理 Opencv
3) 程序架构
想了下好像也没啥功能,只是个图片浏览器。简单的事件驱动就够了。
4) 代码规范
目前还在开发阶段,而且是空余时间,没做代码优化逻辑很乱也不是很规范,到处抄的代码,命名也一塌糊涂,等想做的功能都实现了在Reviewer
。
5) Modality支持
目前适配的Modality包括CT、XA、IVUS、OCT、US,其余的可以浏览影像,但是注释等设置和交互参数只能为默认值。这个已经封装成XML
配置,后续慢慢加。
实现方法
记录下实现的办法,方便日后查找。如果有一样需求的也可以帮助大家快速实现。
1) 显示ui — 屏幕分割显示布局
2) Dicom数据结构 ---- DicomImage --> QSharedData
把DicomImage封装成 QSharedData 使用 (显式共享)
把DicomImage封装成 QSharedData ,让后利用Qt实现可视化。
├── PATIENT (病人)
│ │ └── STUDY (检查)
│ │ │ │ └── SERIES (序列)
│ │ │ │ │ │ └── IMAGE (影像 高度为未知)
│ │ │ │ └── SERIES (序列)
│ │ │ │ │ │ └── IMAGE (影像 高度为1)
│ │ │ │ │ │ └── IMAGE (影像 高度为1)
│ │ └── STUDY (检查)
│ │ │ │ └── SERIES (序列)
│ │ │ │ │ │ └── IMAGE (影像)
3) Dicom数据结构 ---- DicomImage --> Series
Dicom数据结构 ---- DicomImage --> SeriesInstance
根据协议可以知道每个Series中可以有单帧或多帧。
多帧时 每帧影像尺寸高度是1
单帧时 每帧影像尺寸高度未知
- 单帧模式高度代表当前时间 !
- 多帧模式高度代表空间位置 !
enum SeriesPattern {
Empty_Frame, //
Single_Frame, // 单帧
Multi_Frame, // 多帧
};
涉及到Series,2D可视化肯定会有方向
(多帧模式下)区分平面
(单帧模式下)只有XY平面显示模式,另外两个平面表示时间密度曲线,与其相关打算作为插件用opencv做,所以这里封装的Series其余两个平面均指多帧模式。
4) 打开数据 ---- 打开 dcm 文件、打开 dcm 文件夹
Qt 实现 打开 文件/文件夹 同一个接口
Qt 实现一个批量加载线程(单线程)
Qt 实现一个 文件监听线程
如何打开一个dcm影像:
把DicomImage封装成 QSharedData 使用 (显式共享) 2.4 DcmFileFormat 获取 常用标签/图片
5) 图片浏览器交互 ---- 框选ROI 自适应窗位窗宽
6) 图片浏览器交互 ---- 浏览序列
7) Dcmtk Pacs 开发:小型dicom数据库(sqlite)
Dcmtk Pacs 开发:小型dicom数据库(sqlite)
8) Dcmtk Pacs 开发:StoreScp 实现
9) Dcmtk Pacs 开发:Echo 实现
10) DCMTK 遍历 DICOM 标签/Tags 并 可视化
11) 利用QTimer实现 Dicom 播放功能
12) KISS Dicom Viewer:插件实现方法
13) 仿照小蚂蚁实现 sharpen smooth Edge Emboss
仿照小蚂蚁实现 sharpen smooth Edge Emboss