基于智能手机操作平台的移动医学影像系统软件设计*
2019-03-27史森中
刘 洋 史森中
(陆军军医大学大坪医院野战外科研究所信息科 重庆 400042)
1 引言
医学影像存储与传输系统(Pictures Archiving and Communication System,PACS)是通过计算机软硬件设备以及高速宽带网络将医院CT、X光检查、B超、核磁共振等影像诊断结果及相关信息连接起来,实现医学影像信息的共享、查询、调阅、辅助诊断等功能。有助于医院提高工作效率以及实现无胶片化管理,为综合发挥各类影像检查手段的功能提供广阔空间[1]。但是PACS主要运行在医院有线局域网的台式计算机环境中,医生若离开其办公室无法检索查看所需信息。为解决以上问题,开发一款能在移动网环境中通过智能手机或平板电脑进行操作的移动医学影像信息系统软件,无线连接PACS获取图像,不再受操作场地的限制,方便医生对患者所需医疗影像信息进行检索与浏览诊断,显得非常重要。
2 软件设计
2.1 开发平台选择
近年来移动智能设备以及通讯技术发展迅速,移动智能手机用户日益增多,人们随时随地使用智能手机及平板电脑进行移动办公,促使PACS突破物理线路的限制,实现在智能移动终端进行医学图像的查询、传输、浏览、远程诊断[2]。目前各大移动智能通讯设备平台安卓(Android)平台占有率较高,作为开放平台在厂家生产移动设备时大部分都选择平台。其具备较为优秀的交互界面以及交互逻辑,获得用户青睐[3],同时其较为开放的特性给予开发者更多的资源,平台中应用程序数量逐年增加[4]。因此本文旨在设计一款基于Android的平台软件,在不影响医院已有PACS的情况下实现与PACS服务器无线互联并下载文件以及对文件进行解析,将属性及图像信息提取并显示,为医生和患者提供比较方便快捷的医学影像查看方式。
2.2 患者信息管理模块
主要为医师诊断和分析患者影像医学结果提供帮助。按其功能主要分为3个部分:患者信息管理、配置Ip与Port、患者筛选查询。该模块实现患者信息管理与维护,对于已存在于PACS服务器内的患者资讯可进行查询、检索、筛选以及删除操作。若需查询相应患者信息,如身份、入院时间、检查部位、相应设备等,仅需向PACS服务器中输入统一的资源定位符,PACS 按照 WADO标准文件进行查询,获取查询的目标文件。服务器地址配置PACS Server 的域名,端口号,使软件与服务端连接,为查询服务做准备。该模块实现流程,见图1。首先查询本地讯息,若无法查询则需调整终端端口ID号、相应名称、对应服务器等关键配置文件。在完成以上配置后进入查询界面,输入患者信息进行检索,如ID号、入院号、姓名、体检部位及设备等关键词。然后从列表中下载查询到的所需内容到本地存放。最后返回本地列表,选择并显示已下载的内容。具体实现过程如下:设计3各医师所需交互界面。从左至右依次为ListView控件页面、查询检索控件页面、所需数据资料保存页面;完成检索筛选后,点击所需具体项目,此时进入医学数字影像和通讯的国际标准(Digital Imaging and Communications in Medicine,DICOM)文件浏览界面;若无法准确筛选所需患者数据则需重新配置用户界面数据库及筛选条件数据库文件,直到能实现准确筛选患者信息时对配置文件进行保存。
图1 移动PACS软件患者信息管理模块流程
为获取数据写入权限以及智能设备无线访问PACS服务器的权限,需通过AndroidManifest.xml配置文件进行权限配置。部分代码如下:
读取数据权限
Android:name="android.permission.READ_EXTERNAL_STORAGE"/> 创建及删除文件权限: android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 通过智能手机写入数据权限: android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 无线访问PACS服务器权限: 该模块需在上述3个界面间相互切换,采用ViewPager 控件。ViewPager是在android.support. v4.jar 中的控件,android.support.v4.jar 库设计为An droid7.2(API 等级4)和更高版本的使用。它包括最大应用编程接口(Application Programming Interface,API)集,用于获取处理数据、网络连接和编程公用事业支持应用组件的用户界面。完成 ViewPager控件的主要代码如下: List mViewPager=(ViewPager)findViewById(R.id.vPa ger); 实例化viewList对象: viewList = new ArrayList 布局填充器创建: LayoutInflater mInflater = getLayoutInflater(); 向 viewlist 中添加 View 对象: viewList.add(mInflater.inflate(R.layout.filepage, null)); ........... 设置ViewPager初始页面为第3个页面: mViewPager.setCurrentItem(2); 添加适配器到ViewPager中: mViewPager.setAdapter(new MyPagerAdapter(viewList)); 在适配器ViewPager中实现 instantiateItem方法: public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(mListViews.get(position), 0); return mListViews.get(position); } 采用ListView控件完成患者清单文件数据的本地页面显示,该控件采用的适配器设计具有降低资源功耗从而提高设备效率。该模块设计的重点在于如何实现手机APP接口与PACS接口的互联,将PACS服务器内的数据加载到智能手机APP中。概括而言是将路径 filePath (端口号、IP等所汇集而成的字符串)封装成 URL后访问PACS服务器,以此下载PACS服务器内的数据文件。主要代码如下: 将路径filePath封装成URL: URL filePath=new URL(filepath); 建立与PACS服务器的链接通道: HttpURLConnection fileConn=(HttpURLConnection) filepath.openConnection(); fileConn. setConnectTimeout(5000); 设置请求连接时间,大于这个时间连接失败; 设置请求方式,因下载文件需用GET方法: fileConn. setRequestMethod("GET"); 获得数据流: InputStream ins = fileConn. getInputStream(); DICOM中的内容主要包括图像和文本数据,而移动PACS软件文本信息提取模块主要是将DICOM中的图像数据进行采集并且成像,对其文本数据实现提取、编辑并保存等操作功能。通过Java本地接口(Java Native Interface,JNI)调用由C++语言编写的本地方法。这个过程概括而言是对图像以及文本进行读取,细分为显式与隐式读取,根据图像采样器(VR)数值来确定数据的表示方法以及获取数据的大小和长度,最后将这种数据进行标记与转换。在隐式情况下对图像采样器的数据进行确认后再读取,而显性情况下则基于Android平台医学影像阅片软件设计的数据类型和长度直接读取。在DICOM中对患者的信息数据是通过全球唯一且明确的身份证明标识来辨识。通过在信息模型中创建3个图像数据结构图像层结构体(Patient、Study、Series)来存储患者、研究以及序列的文本信息。这样的结构具备存储所有文本信息的属性,其结构体定义如下: typedef struct InfoData{ int patientId; int seriesTime; …… } InfoData; 将DicomConverter 实例中的相关文本信息获取并将值传递给InfoData 结构体对象,然后返回这个结构体对象。部分代码如下: public InfoData getInfoData (DicomConverter dc){ InfoData infoData = new InfoData(); infoData. patientId = dc.getPatientID; …… }。 PACS数据的显示与传统图像数据一样,主要是由图像像素以及长宽进行表现。而不同的医学影像设备所采集到的影像数据模型并不相同,需将这些原始图像数据转换为统一标准的图像数据字符后进行无线传输,传输过程中以1或0两个字符来表示图像像素。传统PACS显示器与智能手机显示器的分辨率完全不同,需进行图像窗口调整,设计能够在智能手机上进行窗口调节的医学标准数据影像图像,对于低1 250灰度的影像像素用0来表示并显示成黑色,对于1 500灰度以上像素的则以255来表示并显示成白色,而介于1 250~1 500灰度的像素则以x=255y/2 047(x为普通显示器灰度,y为智能手机屏幕灰度值)来表示,根据不同显示器窗口位置以及宽高度来调整窗位。如肌肉与骨骼所呈现的灰度完全不同,利用窗口位置的大小及宽度来重点显示所需查阅的病患部位会得到更加明确的效果。部分代码如下: BitmapFactory.Options options = new Options(); 图像防抖处理: options. inDither = false; 设置最佳解码器方式: options. inPreferredConfig = null; options. inSampleSize=10; Bitmap bitmap = ……. ); imageView. setImageBitmap(bitmap); 首先测试对文件夹遍历,将遍历到的dcm格式文件添加到ListView中,点击该文件后将显示文件内容。有两种不同格式文件,软件在遍历时只将dcm格式文件加载到ListView列表中,其他格式并未加载,符合设计要求[5]。通过点击 ListView 中的9.dcm,测试是否可以加载,载入图片的浏览界面。从测试看出影像资料可以正常加载,在打开文件的最初阶段图像显示的窗位是中间值[6],窗宽是最大值,说明通过JNI 调用本文件将数据传送给java端获得成功[7],设计符合需求。显示区位于页面中心,用于显示二维切片影像及三维体绘制结果[8]。画布左上角显示的是鼠标在画布中移动的位置坐标、当前坐标的标量值和影像的相关信息、参数。这些都是医生在使用医学影像可视化软件过程中所关心的一些数据。显示区上方以及右方为系统功能区,提供图像请求及在智能手机上的交互显示功能[9]。 本研究基于Android平台开发以DICOM为标准的移动手机医学影像操作软件,极大地拓展PACS的应用环境。通过各类无线传输方式实现智能手机的无线网络连接功能,提取医院PACS中心服务器内的医学影像数据资料,通过该软件实现影像资料的查询、浏览以及处理。PACS访问不再受时间和地域的限制,医生随时随地获取医学影像信息,提高诊疗工作中医学影像的能力与效率[10]。此外移动PACS软件作为辅助工具将受到越来越多健康医疗机构的关注。在后续的研究工作中将考虑通过智能移动设备的移动芯片模块GSM/GPRS或CDMA进行影像数据传输,将应用层完全从网络层分离出来,这就能够完全适应将来的移动5G网络[10],具有极大的发展潜力以及实用价值。2.3 文本信息提取模块
2.4 图像显示模块
2.5 移动PACS软件功能测试
3 结语