徐奇 周万春 郭峰 刘栋梁
摘要:针对移动医疗概念在医疗机构的逐渐普及,在智能终端特别是Android设备上调阅和分析医学影像成为迫切需求的情况,提出基于Android的医学影像处理软件项目。选择DICOM标准的开源实现之一DCMTK库作为基础,并使用Qt平台进行开发。结果,根据临床PACS软件的实际需求,初步实现了医学影像的数据通信、搜索显示、图像编辑等基本功能。
关键词:安卓应用 ;Qt平台;图像处理;MVC框架
中图分类号:TN929 文献标识码:A 文章编号:1009-3044(2015)03-0209-03
The Design and Implementation of Medical Image Processing Software Base on Android System
XU Qi, ZHOU Wan-chun, GUO Feng, LIU Dong-liang
(WenZheng College Of Soochow University ,Suzhou215104 , China)
Abstract: Since the concepts of mobile medical increasing popularity in medical institutions , it has become an urgent demand that review and analysis of medical images in the intelligent terminal especially Android device . In view of this situation , the medical image processing software base on android system project has been raised . Select the DCMTK library as a basis , which is the implementation of DICOM standard.In addition , the software is developed by Qt platform . As a result , according to the actual demand of PACS software,it has realized basic functions of medical image , such as data communication , search and display , image processing and so on.
Key words: Android applications; Qt platform; image processing; model view controller
图像存储与传输系统是基于医学数字成像及通信标准(Digital Imaging and Communication in Medicine ,简称DICOM)。DICOM3.0标准使得不同厂商生产的医学设备拍摄的医学影像进行统一的存档和传输成为现实。PACS系统就是把医院影像科日常产生的各种医学影像通过DICOM3.0标准以数字方式保存起来,当需要的时候在一定的授权下能够很快的调回使用,同时增加一些辅助诊断管理功能。为了适应现代移动应用的发展趋势,开发移动平台上的PACS软件,已经成为当前必要的工作了。医生、病人和医科大学学生都非常希望能在移动设备上进行医学影像的显示以及处理,从而达到提高工作学习效率,方便病人看病的目的。但是,移动应用与个人电脑上的软件不同,没有强大的CPU和巨大的内存支持,在读取大量数据的DICOM图片时内存不足,需要进行特别的优化。考虑到手机ARM芯片处理效率低,许多浮点数的运算算法在手机上难以实现、许多数据库的排序以及缓存机制都需要修改至适应移动平台等等的问题需要解决,特别是软件本身的架构设计与实现也需要重新考虑。本文主要介绍了基于Android的医学影像处理软件的设计和其中三个模块的实现,将分为三个部分:环境介绍、软件结构和模块介绍,重点在详细阐述软件结构的设计,能让读者迅速理解设计思路以及部分模块的实现方法,提供设计思路[1-2]。
1 开发环境简介
开发移动设备的应用时,强大的移植性是非常有利的优势,因此使用Qt平台作为开发工具,Qt平台强大的代码复用性能够使C++代码应用到不同的系统上,而选择Android系统是因为Android系统作为开源的操作系统,具有最高的市场占用率,且开发文档比较完整,遇到问题能够及时解决,开发成本较低。
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。第一部Android智能手机发布于2008年10月。至此,Android迅速逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。 Android系统的市场占有率已经达到了惊人的78.1%
Qt是面向对象的c++开发框架,使用元对象编译器(Meta Object Compiler, moc),易于扩展,允许组件编程。2014年4月,Qt实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WinPhone平台的全面支持。
2 软件结构
2.1 软件需求分析
针对Android系统,此次开发使用的基础版本为Android 2.3,并且向上兼容。针对软件功能方面,分为三个部分:数据库通信、界面显示和图片处理。数据库通信方面,Android端的软件需要实现和服务器的通信功能,能登录服务器,将服务器上的DICOM格式的影像文件按照安全协议有选择地下载到本地,并检查文件完整性和安全性。界面显示方面,软件能够读取本地DICOM文件[3-4],以列表的形式实现从选择病人的一次Study(检查序列)定位到该次Study下的所有影像,然后通过选择一个影像序列展示该影像序列下的第一幅DICOM图片。最后在图像处理方面,需要完成常规PACS客户端软件的基础功能,包括旋转、平移、窗宽窗位的调整、多帧影像的播放等功能,要求能使用手指简单快速的完成所有功能的使用[5]。
2.2 软件结构设计
对于软件需求,笔者与团队成员采用Qt的MVC模型来实现,实现的方式为QML和C++混合编程模式,QML语言负责界面的显示,而C++语言负责逻辑处理,其中逻辑部分使用Qt自带的类库、以及庞大的CTK库下DCMTK类库。为了实现软件的需求,我们设计如下软件结构:
图1 UI的代码设计
我们将界面分为三个部分,StudyUI(检查序列界面)、SeriesUI(影像序列界面)、ImageViewer(图像编辑器)。此外每一个界面对应着相应的C++逻辑代码,以及数据model代码。[6]StudyUI负责显示每一条study记录,逻辑代码部分对应着远程数据库通信模块、能完成本地数据库与服务器比对,增删查改等任务。SeriesUI对应着本地数据库查询模块。ImageVewer对应着复杂的图像处理模块,包括DICOM格式图片的读入模块、窗宽窗位调整模块、图像缩放、旋转、平移、翻转模块、 病人信息显示模块、影像标记模块、病人前后左右信息计算模块、多帧播放模块、触摸事件模块、图像标记模块等等。
3 软件模块的实现
3.1 触摸模块的设计与实现
手势控制一向是移动应用吸引眼球的特色功能,相对于个人电脑端复杂的操作,手势控制显得更加的简单高效。针对本款软件的多种图像处理模块,我们对相关操作进行了手势简化。本软件复用了个人电脑端软件鼠标事件的C++代码,考虑到Android端和个人电脑端触摸屏的使用,需要在设计中加入触摸模块以改善用户在触摸屏方面的体验。对于触摸屏的触摸控制QT平台已经有相关代码的封装,使用QTouchEvent已经可以完成触摸事件的接收和处理。代码结构设计如下图:
图2 触摸事件流程
TouchEvent与MouseEvent并列,共用图像处理模块的逻辑代码,在触摸设备上TouchEvent响应触摸,连上鼠标操作由MouseEvent响应。经过测试,在Android手机上手势控制体验良好,优化过的图像处理代码,能配合手势控制顺畅运行。
3.2 病人前后左右信息计算模块的设计与实现
病人前后左右信息的显示对于医生和患者观看影像信息显得极其重要,此模块的设计需要学习些许的医学知识以及计算机图形学知识。[7]查阅DICOM标准我们可以发现这样一个字段Image Orientation(0020,0037)表示的是图像第一行和第一列相对于病人的方向。而在DICOM坐标系是根据病人的方向来确定的,其中X轴正向指向病人的左侧,Y轴正向指向病人的背部,Z轴正向指向病人的头部。在医学影像处理软件中,最常见的是将导入系统的MRI/CT序列以三视图的形式进行呈现,分别为轴状平面(Transverse/Axisplane)、冠状平面(Coronal/Frontal plane)和矢状平面(Sagittal plane)。以下图显示的是这三个方位对应的切面方位,以及在成像过程中对应的坐标系。
图3 成像坐标系
首先需要在窗口的top,bottom,left,right中间找到四个单位向量,(0,1,0),(0,-1,0),(-1,0,0),(1,0,0),将其对应的窗口坐标点转化为世界坐标系的点,求出与(0,0,0)所对应的世界坐标原点的四个向量并且归一化,作为下述ComputeOrientaton函数的参数传进去,即可得到当前图像在世界坐标系下的方位。使用以下算法,能计算出DICOM图片中拍摄内容的方向,实现了PACS软件的重要功能之一。代码如下:
ImageOrientationLayer::ComputeOrientation(Vector3D vector)
{
char *orientation=new char[4];
char *optr = orientation;
*optr='\0';
char orientationX = vector.getX() < 0 ? 'R' : 'L';
char orientationY = vector.getY() < 0 ? 'A' : 'P';
char orientationZ = vector.getZ() < 0 ? 'F' : 'H';
double absX = fabs(vector.getX());
double absY = fabs(vector.getY());
double absZ = fabs(vector.getZ());
int i;
for (i=0; i<3; ++i) {
if (absX>.0001 && absX>absY && absX>absZ)
{
*optr++=orientationX;
absX=0;
}
else if (absY>.0001 && absY>absX &&
absY>absZ)
{
*optr++=orientationY;
absY=0;
}
else if (absZ>.0001 && absZ>absX &&
absZ>absY)
{
*optr++=orientationZ;
absZ=0;
}
else break;
*optr='\0';
}
return orientation;
}
3.3 多帧图像播放模块的设计与实现
对于DICOM文件的图像格式进行一下简单的介绍:DICOM 标准的的文件通常由一个DICOM文件头部和一个DICOM数据集合组成。DICOM文件头部 ( DICM File Meta Information) 是用来标记数据集信息的字段。文件导言是文件头部的最先出现的字段, 而且由128个两位16进制字节组成的, 紧接着的是DICOM文件标记前缀 , 这是字段长度为4个字节的一个字符串,它的内容为“DICM”, 可根据这个字段的值来判断当前使用的文件格式是否符合DICOM标准。[8]文件头部还包含着其它的文件信息,这些信息有着很重要的作用, 像传输文件的数据格式等等。参考以上格式,对于多帧图像的文件数据流(以JPG格式为例)文件内容如下:
(7FE0, 0010) + ‘OB+ (0000) + (FFFF, FFFF) 解释:最后4个字节全是F,表明是未知长度
(FFFE, E000) + (xxxx, xxxx) + (FrameNum*4)
(FFFE, E000) + (xxxx, xxxx) 解释:(xxxx,xxxx)是第一帧图像大小
………… 第一帧图像数据区
(FFFE, E000) + (xxxx, xxxx) 解释:(xxxx,xxxx)是第二帧图像大小
………… 第二帧图像数据区
…………
以此类推……
(FFFE, E000) + (xxxx, xxxx) 解释:(xxxx,xxxx)是最后一帧图像大小
………… 最后一帧图像数据区
(FFFE, E0DD) + (0000, 0000) 解释:图像结束
针对DICOM文件数据读取的设计,为了能读取各种医学影像格式如CT 、M R等。我们设计了一套算法,能正常导出我们所需的像素值,原理如图4所示。
图4 医学影像读取流程
在Load Pixel 这一步会进行复杂的类型判断,包括图像是否压缩、使用何种压缩格式、是否为彩色等等,之后通过DICOMTK库提供的接口读取像素信息转换为QPixelMap输出,添加进度条控件,使用Qt的多线程机制控制图片的播放、暂停、加速、减速。
4 小结
医院是一个社会经济实体,PACS系统是现代医院的重要标志之一,是数字化医院的核心业务软件,它的顺利运行将为电子病历、医疗区域化、社会保险网络化打下坚实基础。本文介绍了在Android系统上设计和实现PACS系统的医学影像处理软件,详细阐述了该软件的设计方式以及三个功能模块的实现。本文的工作可以为后续类似开发提供参考。
致谢:感谢指导老师纪其进副教授的悉心指导,感谢项目组其他成员的通力合作!
参考文献 ;
[1] 张帆, 李晓陵, 王丰, 等. 基于PACS平台PBL结合CBL教育模式在医学影像学教学中的应用[J]. 黑龙江教育: 理论与实践, 2015(3): 60-61.
[2] 蒋伟浩, 钟征祥, 王志刚, 等. 公共平台型PACS建设的关键问题研究[J]. 中国医院, 2013(9): 72-75.
[3] 张起荣, 赵芳云, 顾嘉楠, 等. 基于小型医院放射科的PACS模板设计[J]. 科学之友, 2013(12): 156-157.
[4] 王虹, 刘景文, 李学斯, 等. 基于iOS设备的移动PACS应用开发[J]. 中国数字医学, 2014(1): 50-51,55.
[5] 谢明伟, 胡辉军, 许健敏, 等. PACS/RIS临床应用中常见问题及解决方法[J]. 中国医疗设备, 2013(12): 96-98.
[6] 薛艺红, 杨素玉, 李蕊, 等. 基于安卓的移动护理信息系统开发与应用[J]. 中国数字医学, 2014(4): 64-65.
[7] 李鹏, 段云燕, 赵宏波, 等. PACS系统在医学影像见习课中的应用[J]. 科技视界, 2015(5): 147,154.
[8] 何俊诗, 梁鹏, 罗英华, 等. 基于语义的医学图像检索系统在PACS系统中的设计与实现分析[J]. 临床医学工程, 2013(7): 781-782.