背景技术
医学图像分辨率较高,像素灰阶值通常不低于12位(bit)4096级,而普通显示器由于动态范围有限,并受到操作系统限制,只能提供8位256级灰度。并且,由于各种人体组织的医学图像有相对稳定的取值,进行图像分割处理时只对特定范围内的像素值感兴趣,因此,医学图像处理系统必须能根据研究者的需要而显示特定像素值,屏蔽其它范围的像素值。一般而言,该功能通过调节窗宽和窗位实现。
在调窗处理中,窗宽(Window center)是指需要显示图像的范围,调节窗宽主要是影响显示对比度,窗宽越大,图像灰度层次多,组织对比度减少,细节显示差。窗位(Window center)表示显示区域的中心位置。
调节窗宽和窗位是医学图像处理中用以观察不同密度的组织结构或病变的一种显示技术。调窗处理的原理是根据预知的窗宽和窗位值,获得需要显示的窗口的大小(窗宽)和中心位置(窗位),从而将窗口内的像素点的灰阶值转换成显示时的最亮和最暗范围内的值,高于窗口灰度范围的部分置为最亮,低于窗口灰度范围部分设为最暗。
调窗处理在数学表达上就是图像灰度值与显示值的转换,具体转换公式如下:
其中,V为图像数据,G(V)为显示器的显示值,gm为显示器的最大显示值,W为窗宽,C为窗位。
医学图像因其特殊性一直在浏览器上得不到很好的应用,数字影像和通信标准(DICOM,Digitalimaging and Communications in Medicine)提出了WADO协议(其中,WADO协议是DICOM 标准的一部分(Supplement 85 / DICOM 2004 Part 18),同时 WADO协议也是ISO 国际规格(ISO/WD1.14),所以,WADO协议是作为 DICOM 服务器和电子病历之间的共通标准接口的重要内容)用于在web上访问DICOM对象,通过向http服务器传递指定参数来获得调整好窗宽窗位的jpg格式图像。但是,在浏览器上进行显示和调整窗宽窗位时需要安装AxtiveX控件或Java Applet控件。如果没有浏览器插件(如ActiveX控件、Java Applet等)的辅助,则Web上无法处理原始的DICOM医学图像。
发明内容
本发明所要解决的技术问题是提出一种在浏览器没有插件支持的条件下,在浏览器上快速显示多帧医学图像的方法,
本发明采用如下技术方案实现:一种在浏览器上快速显示多帧医学图像的方法,其包括步骤:
浏览器从Web服务器获取DICOM医学图像的帧数;
浏览器根据图像帧数创建每帧图像对象,保存每帧图像的地址;
浏览器加载每帧图像并逐帧显示各帧图像。
其中,所述获取DICOM医学图像的帧数的步骤具体包括:
浏览器通过AJAX技术将获取DICOM医学图像的WADO参数请求发送给Web服务器;
Web服务器从浏览器的请求中解析出UID,然后计算出此UID代表的DICOM医学图像的路径,加载后解析出DICOM医学图像的帧数;
Web服务器将DICOM医学图像的帧数返回给浏览器。
其中,Web服务器将DICOM医学图像的帧数以XML文件返回给浏览器。
其中,WADO参数请求中包含DICOM医学图像的StudyUID、SeriesUID和ImageUID这三个UID。
其中,浏览器通过每帧图像的src属性的值来加载每帧DICOM医学图像。
其中,浏览器加载每帧图像后,通过缓冲延迟逐帧显示各帧图像。
其中,浏览器并行加载各帧图像,根据帧序号记录已加载图像的帧数,当已加载图像的帧数与当前播放的帧序号小于一个阈值时,浏览器加载后续帧的图像。
与现有技术相比,本发明具有如下有益效果:
本发明不用安装客户端或不用在用户的浏览器安装任何插件,即可实现多帧DICOM医学图像的显示,实现过程更简洁,用户使用更方便。
具体实施方式
本发明就是在浏览器没有安装任何插件下完成,通过将多帧医学图像数据下载到浏览器端,然后通过前端技术播放多帧图像,实现多帧DICOM医学图像(以下又简称为“图像”)显示。
如图1所示,在本实例中,前端为浏览器,后端为具有PHP(Hypertext Preprocessor,超级文本预处理语言)脚本程序的Web服务器,PHP脚本程序主要通过web服务器转发由浏览器发送的请求参数生成相应的图像返回给浏览器。
由于PHP脚本无法处理二进制数据,本发明在PHP脚本程序中开发了PHP扩展库,专门用于解析DICOM医学图像,并封装在PHP脚本程序中。
步骤S11、为了让浏览器能创建每帧医学图像,首先要获取多帧图像的帧数,通过AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)技术,将获取图像WADO参数请求发送给Web服务器。其中,DICOM医学图像的WADO参数中包含代表此图像的三个用户标识符(Uer Identification,UID),包括StudyUID、SeriesUID和ImageUID。
步骤S12、Web服务器从浏览器的请求中解析出UID,然后计算出此UID代表的DICOM医学图像的路径,加载后解析出图像帧数frameNum,以XML(可扩展标记语言,Extensible Markup Language)文件返回给浏览器,浏览器解析XML文档读取出图像帧数frameNum。
这里,我们在PHP脚本程序中定义了LWADO类,LWADO类封装了PHP扩展库中解析DICOM图像的函数,LWADO类中成员函数getInteger可以用来获取DICOM图像中的模块信息,通过传入标签(TAG),读取指定的值,在DICOM协议中,代表图像帧数的TAG为(0028,0008):
$wado = new LWADO($wadostr);
$frameNum = $wado->GetInteger(0x00280008);
步骤S13、浏览器根据图像帧数创建每帧图像对象。
获取到图像帧数后,浏览器为每帧图像组装WADO参数请求。在WADO协议中,参数FrameNumber表示请求多帧图像中的帧序号,FrameNumber最小值为1,最大值为图像总帧数。假定服务端PHP脚本程序为DICOMimage.PHP,图像的StudyUID、SeriesUID和ImageUID分别为a、b、c,根据WADO协议的要求,那么图像的请求地址url为:
url = /DICOMimage.PHP?RequestType=WADO&StudyUID=a&SeriesUID=b&ImageUID=c
第n帧图像地址为:
url1 = url + "&FrameNumber=n";
其中n为1~count中的任意整数。
这里我们定义数组urlArray记录下所有图像帧的地址,定义imgArray记录所创建的图像对象,代码如下:
for (var i=0; i < count; i++) {
var img = new Image();
img.style.display = "none";
img.index = i+1;
img.loaded = false;
var urln = url + "&FrameNumber=" + String(i+1);
urlArray.push(urln);
imgArray.push(img);
}
步骤S14、浏览器加载每帧图像。
在HTML标准中,图像image的src(scr是Source的简写,意思是“源”即image的源文件)属性为图像地址,通过指定src属性的值来加载相应图像,即根据src属性对应的图像地址,读取该图像并进行显示。
由于步骤S13中只是创建了图像对象,并保存了图像的地址,但没有立即加载图像,这样做是为了降低网络负载,因为医学影像大多是高分辨率的灰度图像,每帧图像压缩后大小一般有200k,如果让浏览器立即加载所有帧的图像,那么加载瞬间的网络流量将十分巨大,如果要加载的图像帧数很多,很有可能使网络流量达到峰值,影像图像显示的速度,所以我们采取延迟加载的方法,利用缓冲技术在后台平缓加载图像,使网络流量均衡,并平滑图像显示过程。
在Javascript中,函数setInterval用来重复执行某一过程,我们定义函数LoadImage来并行加载图像,并声明变量framePlay来记录播放的帧序号,声明变量frameLoaded来记录已加载的帧数,当frameLoaded-5小于framePlay时,开始加载后续帧的图像,也就是说,我们在播放过程中缓冲5帧图像(当然可以根据实际需要,设置其他数目的缓冲图像帧数),如果当前播放速度为5帧每秒,那么我们每秒只需请求5帧数据,比立即加载图像的流量会小很多,这一过程的实现方法如下:
var funcLoad = setInterval(loadImage,1000);
function loadImage()
{
if(frameLoaded-5>framePlay)
{
return;
}
frameLoaded = framePlay + 5;
for(var i=framePlay;i<frameLoaded;i++)
{
imgArray[i].src = urlArray[i];
imgArray[i].onload = function(){
This.loaded = true;
}
}
if(frameLoaded >= count)
{
clearInterval(funcLoad);
}
}
步骤S15、由浏览器逐帧显示图像。
由于在步骤S13创建图像时,我们设置了图像初始状态为不显示,所以虽然后台已经缓冲了图像,但还没有显示,显示图像的原理很简单,通过修改图像的对象级联样式表(Cascading Style Sheet, CSS,通常又称为“风格样式表(Style Sheet))中的display属性来控制图像的显示和隐藏。在实际过程中,每次只能显示一幅图像,所以在显示下一幅图像之前,要先将当前显示的图像隐藏,具体方法如下:
function showImage()
{
imgArray[framePlay++].style.display = "none";
if (framePlay>=frameNum)
{
framePlay=0;
}
imgArray[framePlay].style.display = "block";
}
综上,本发明不用安装客户端或不用在用户的浏览器安装任何插件,即可实现多帧DICOM医学图像的显示。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。