发明名称 一种基于Android平台的DICOM医学图像显示处理方法
摘要 本发明涉及一种基于Android平台的DICOM医学图像显示处理方法。本发明包括:开启线程获取存储模块中的图片文件,并记录图片文件路径名;判断获取的图片文件的后缀名是否为DCM;读取DICOM文件信息;判断这数据是否为DICM;文件解析模块解析DICOM文件;判断图片文件解析是否完成;保存解析图片文件得到的数据;将保存的图片文件数据中的像素数据做数据规范化转换;加载图片数据;对显示的图片进行图片处理。本发明能够将大容量无压缩的DICOM医学图像显示在Android平台上,显示图片速度快、流畅;一次读取多张图片,加载图片的速度快,能够非常方便的在不同图片间切换。
申请公布号 CN103577699B 申请公布日期 2017.02.08
申请号 CN201310563416.X 申请日期 2013.11.14
申请人 哈尔滨工程大学 发明人 李金;阳伦;梁洪;王磊;丛望;栾宽;宋建华;张秋实;孟祥莲;鲍佩华
分类号 G06F19/00(2011.01)I 主分类号 G06F19/00(2011.01)I
代理机构 代理人
主权项 一种基于Android平台的DICOM医学图像显示处理方法,其特征在于:(1)开启线程获取存储模块中的图片文件,并记录图片文件路径名;(2)判断获取的图片文件的后缀名是否为DCM,若是DCM,则初步判定该图片文件为DICOM文件,转步骤(3),若不是DCM,则关闭线程;(3)读取DICOM文件信息,读取128字节的00H文件序言和4个字节的数据;(4)根据步骤(3)读取的4个字节的数据,判断这4个字节的数据是否为DICM,若是DICM,判定该文件为标准的DICOM文件,转步骤(5),若不是DICM,则关闭线程;具体步骤为:(A)开始程序;(B)开启线程获取存储模块中的文件,并记录文件路径名;(C)判断获取的文件的后缀名是否为DCM,若“是”,则初步判定该文件为DICOM文件,转步骤(D),若“否”,则转步骤(L);(D)打开文件读取该文件信息,读取128字节的00H文件序言和4个字节的数据;(E)根据步骤(D)读取的4个字节的数据,判断这4个字节的数据是否为“DICM”,若“是”,判定该文件为标准的DICOM文件,转步骤(F),若“否”,则转步骤(L);(F)继续解析文件;(G)判断文件解析是否完成,若“是”,转步骤(H),若“否”,则转步骤(F),重复执行步骤(F)、(G),直到文件解析完成;(H)保存解析图片得到的数据;(I)将保存的图片数据中的像素数据做数据规范化转换,并将数据存储在缓存区;(J)控件加载图片数据,在用户界面上显示原始DICOM图像和缓存区的信息;(K)另外开启线程,对显示的图片进行图片处理;(L)关闭线程,退出程序;步骤(I)中,利用缓存模块的文件缓存方式有两种:一种手动缓存,是通过调用onCreateOptionsMenu()方法创建MENU菜单项,再通过调用onMenuItemSelected()方法中的switch语句提供缓存选项,然后单击MENU菜单项中的缓存所有文件选项,加载当前目录下所有标准的DICOM文件;一种是当存储区有DICOM文件时,选择其中一张打开进行显示时,缓存进程会自动的异步加载其他图片到Cached file,完成后通过Handler机制发送消息,并在UI线程中处理消息,然后通过Handler Message来更新UI线程,更新在UI上显示Cached file的文件数目;在缓存过程中程序会调用cacheImages()方法,由于该方法的类引入了线程类ThreadState:在ThreadState类中定义了6个short类型的常量,分别代表6种不同的线程状态,所以在cacheImages()方法中用switch语句提供了6种不同线程状态:①ThreadState.STARTED加载线程开始;②ThreadState.PROGRESSION_UPDATE线程加载进展更新;③ThreadState.FINISHED加载完成,线程结束;④ThreadState.CATCHABLE_ERROR_OCCURRED线程加载时出错,加载失败;⑤ThreadState.UNCATCHABLE_ERROR_OCCURRED线程加载时出错,但该错误能忽略或加载成功;⑥ThreadState.OUT_OF_MEMORY加载时内存空间不够,抛出异常;通过cacheImages()方法中不同的线程状态,来判断缓存的加载情况;手动缓存流程的步骤具体包括:I1、单击MENU菜单选择缓存所有的DICOM文件选项;I2、开启线程扫描存储区,判断存储区中是否有要显示的DICOM图片,并记录满足加载条件的文件数目:若“是”,则执行下一步;若“否”,则存储区没有DICOM图片,则执行步骤F6;I3、图片加载线程进行加载;I4、根据不同加载线程的状态判断所有文件是否全部加载完成:若“是”,则执行下一步;若“否”,则返回执行步骤F3,按照上述步骤循环,直至加载完成;I5、将加载完成的图片存储在Cached file中;I6、更新Cached file的文件数目,关闭加载线程,加载结束;步骤(J)、(K)中,具体显示处理模块首先在用户界面上显示DICOM图像,然后对显示的图像进行处理;DICOM图像在用户界面上显示通过调用DICOMViewer类,该类继承自Activity并实现了监听接口SeekBar.OnSeekBarChangeListener;在DICOMViewer类中实现了SeekBar.OnSeekBarChangeListener监听接口的功能:把缓存文件夹中的图片数量以SeekBar拖动条形式显示用户界面,一端显示当前图片是第几张图片,另一端显示缓存文件夹中的图片数量,通过触摸SeekBar来切换图片;当缓存区只有一张图片时,SeekBar默认不在用户界面显示;在该类中还通过引入其他类如:CLUTMode、ToolMode、ScaleMode、GrayscaleWindowView和调用onOptionsItemSelected()方法来设置各种处理方法;其中CLUTMode和ToolMode这两个类主要实现灰度变换、灰度反变换、伪彩色变换和对灰度值进行调节的功能;ScaleMode类实现对图像的缩放,观察图像更加精细的结构;GrayscaleWindowView类实现CT Bone和CT Lung功能,分别用提取图像中骨骼和肺;显示处理流程的步骤具体包括:J1、将解析所保存的图像数据中的像素数据进行数据规范化转化;J2、View控件加载图片数据,在用户界面上显示原始图像,并同时显示Cached file中文件的数目;J3、开启线程,对显示的DICOM图像进行处理;J4、根据步骤(4)中的处理方法,对图像进行处理;(5)文件解析模块解析DICOM文件;(6)判断图片文件解析是否完成,若完成则执行步骤(7);若未完成,则继续执行步骤(5);(7)保存解析图片文件得到的数据;(8)将保存的图片文件数据中的像素数据做数据规范化转换,并将数据存储在缓存区;(9)加载图片数据,在用户界面上显示原始DICOM图像和缓存区的信息;(10)另外开启线程,对显示的图片进行图片处理;(11)关闭线程;所述获取存储模块中的图片文件的方式为:多线程断点远程下载通过连接web服务器,从服务器中下载文件到Android客服端;直接存储是将文件直接拷贝至文件夹中,分别调用DICOMFileChooser和DICOMFileFilter这两个类,来获取存储模块中的文件,在DICOMFile Chooser中提供onListItemClick()方法进入和退出各个目录并记录路径名,然后通过DICOM FileFilter这个类来过滤文件类型;所述获取存储模块中的图片文件通过调用DICOMBufferedInputStream、DICOMReader、DICOMImageReader这三个类来读取DICOM文件的信息,其中三个类的继承关系是:DICOMBufferedInputStream的父类是BufferedInputStream,DICOMReader类继承DICOMBufferedInputStream类,DICOM ImageReader类继承DICOMReader;在DICOMImageReader类中通过调用解析方法parse():该方法调用内部类DICOMImageReaderFunctions,并且该内部类实现了DICOMReaderFunctions接口解析文件;所述读取DICOM文件的信息包括像素数据和文本信息,文本信息包括患者姓名、年龄、症状判断、图像采集时间与采集所用设备;文件解析模块解析图片文件的步骤包括:1)读取标准DICOM文件的文件元信息,确定编码方式;2)读取4字节标签,根据数据字典获取标签名;3)根据文件中数据元素的数据类型,确定值得数据类型;4)根据数据字典的多值性,确定多值性,读取值长度;5)根据值长度和VM读取值域;6)判断文件解析是否结束:若结束,则文件解析完成,执行下一步;若未结束则返回执行步骤2),并按照上述步骤循环,直至解析完成;7)文件解析结束,转存数据。
地址 150001 黑龙江省哈尔滨市南岗区南通大街145号哈尔滨工程大学科技处知识产权办公室