DICOM医学图像处理:WEB PACS初谈

来源:互联网 发布:手机淘宝直通车怎么开 编辑:程序博客网 时间:2024/04/25 07:20

背景:

        周末看到了一篇原公司同事的文章,讲的是关于新的互联网形势下的PACS系统。正好上一篇专栏文章也提到了有想搭建一个worklist服务器的冲动,所以就翻箱倒柜将原本学生时代做课题时搭建的简易Web PACS找了出来,借着再次搭建的机会学习一下Web PACS相关的技术,例如WADO标准、CGI或者FastCGI等技术。

WEB PACS技术浅谈:

        WEB PACS是一种利用互联网技术,跨越了医院和地域限制的,可随意查询和获取DICOM对象的PACS系统。目前常见的方式有两种:第一种是通过Web服务器提供查询定位,将对应DICOM影像存储服务器(通常为FTP)的地址与路径返回,客户端再向DICOM影像存储服务器请求对象;第二种是通过Web服务器统一提供查询及返回请求对象。两者各有利弊,第一种通过分别部署Web服务器和FTP文件服务器,减轻了Web服务器的负担,加快了响应时间,但是该方案也存在着诸多缺点,例如获取图像需要发送两次请求,FTP服务器安全性维护代价高,要求在浏览器下载能够解析DICOM图像的插件等等;第二种Web服务器整合了查询与返回,去除了FTP服务器,部署方便,它的缺点是由于Web服务器返回的数据是真实DCM转换过来的BMPJPEG文件,因此某些依赖于DICOM文件其他信息的操作(例如窗宽窗位调整)需要重新请求服务端,要求更新数据,因此对服务器的处理能力消耗较大,对带宽也有一定要求。

两种方式的示意图如下:


(摘自文献《DICOM WADO原理及应用研究》)

1WADO

        WADOWeb Access to DICOM Persistent Object),是DICOM标准中的一部分,提供了一种通过HTTPHTTPS协议并利用DICOM的标识符从HTML页或XML文档中存取与重现DICOM对象的机制,用于解决在互联网环境下访问DICOM对象——这也可以认为是Web PACS的终极目标。与标准的基于HTTPHTTPS的网络访问方式相同,用户在浏览器地址栏中输入URL,向服务器发送WEB请求,服务器接收到请求后根据URL中提供的参数,在服务端定位要求的图像或报告回送给浏览器,示意图如下(摘自DICOM标准第18章),

        其实WADO标准就是定义了客户端和服务端之间交互的规则,可以简单的理解为双向交互时的参数约定,即服务端可以根据浏览器端发送参数的不同来实现常见的单机版PACSC-FINDC-MOVEC-STORE等功能。DICOM标准中关于WADO部分的介绍也主要是各种参数规则的说明,以及部分URL实例,这里截取一个来简单的说明一下:


        如上图所示,URL采用常见的GET方式,将传统的PACS系统客户端发送查询时的参数发送给服务端,例如studyUIDseriesUIDobjectUID(其实就是DICOM图像中的SOP Instance UID)。

2CGI

        CGICommon Gateway Interface),是WWW技术中最重要的技术之一,有着不可取代的重要地位。CGI定义了外部应用程序(CGI程序)与Web服务器之间的接口标准,独立于开发语言,给用户提供了一种从网页浏览器向执行在服务器上的程序请求数据的方式——Web PACS的实现提供了一种途径。

        为了理解CGI的含义,必须要搞清楚WEB开发中常见的前端和后端。前端就是Web应用中用户可以看得见碰的着的东西,服务端接收到请求后大多直接将数据传输到浏览器;后端更多的是用户看不到的(这里指的看不到不是操作后的结果看不到,而是操作的流程看不到),接收到请求后需要服务端进一步操作的,例如查询数据库、算法运算等等。而CGI就是实现这种由浏览器的输入触发在WEB服务器上运行的程序的标准。

实际环境搭建:

        正如博文第一部分所述,由于第一类Web PACS需要浏览器安装第三方插件,需要单独部署FTP服务器,因此在课题起初没有采用该方案。第二种Web PACS服务端在接受请求后会再向影像服务器发送请求,这正是上文中提到的CGI技术的一种很好的应用场景。下面就具体介绍一下如何搭建CGI应用环境:

1WampServer+FastCGI

Web服务器搭建:

        WampServer安装包下载http://www.wampserver.com/en/#wampserver-64-bits-php-5-5

        安装过程中有可能会遇到缺少msvcr110.dll,程序无法启动错误,可以参照http://jingyan.baidu.com/article/ed2a5d1f3303d709f7be1776.html中给出的方法解决,需要提醒的是下载的Visual C++ Redistributable for VisualStudio 2012 Update 4版本不是由电脑的操作系统类型(32or64位)来决定,而是应该根据WampServer安装包的类型来选择。安装完Visual C++ Redistributable for VisualStudio 2012 Update 4后需要重新安装WampServer

配置FastCGI环境:

参考http://www.admin10000.com/Document/53.htmlhttp://my.oschina.net/Twitter/blog/210044Apache服务器进行配置。在配置完成后重启WampServer竟然失败,出现如下错误:

        更悲剧的是查看ApacheErrorLog竟然没有提示,所以只能对修改的httpd.conf配置文件逐行排查,通过逐行注释的本方法最后找到了问题所在,由于修改DirectoryIndex引发的错误,恢复到原本的顺序后,重启WampServer竟然奇迹般的成功了,小有成就感啊,至于具体的原因后续在慢慢查找,确定了再补充上来。

2C语言CGI实例

        配置完开发环境后,给出一个简单的测试,由于电脑中没有安装PHP,所以这里就讨巧一下,直接利用Apache自带的cgi来调用一下C语言开发的程序,关于C语言CGI的配置比较简单,在Apache目录下的modules中已经包含了cgi模块,只需要在httpd.conf配置文件中指定c-cgi运行的目录即可,添加如下代码:

ScriptAlias /cgi-bin/"C:/wamp/www/c-cgi/"AddHandler cgi-script .exe .pl .cgi<Directory"C:/wamp/www/c-cgi/">Options Indexes FollowSymLinks ExecCGIAllowOverride allOrder allow,denyAllow from allRequire local</Directory>
        具体的配置可参考http://blog.sina.com.cn/s/blog_66ec4d660100rd2h.html,实例的话就不要用该博文中的了,用我下面给出的完整示例。

GET方法实例源码

#include <stdio.h>#include <stdlib.h>int main(void){        char *data;        char a[10],b[10];        printf("Content-Type:text/html\n\n");        printf("<HTML>\n");        printf("<HEAD>\n<TITLE >Get Method</TITLE>\n</HEAD>\n");        printf("<BODY>\n");        printf("<div style=\"font-size:12px\">\n");        data = getenv("QUERY_STRING");if(data==NULL)return 1;        if(sscanf(data,"a=%[^&]&b=%s",a,b)!=2){                printf("<DIV STYLE=\"COLOR:RED\">Error parameters should be entered!</DIV>\n");        }        else{               printf("<DIV STYLE=\"COLOR:GREEN; font-size:15px;font-weight:bold\">a + b = %d</DIV>\n",atoi(a)+atoi(b));        }        printf("<HR COLOR=\"blue\" align=\"left\" width=\"100\">");        printf("<input type=\"button\" value=\"Back CGI\" onclick=\"javascript:window.location='../cgitest-c.html'\">");        printf("</div>\n");        printf("</BODY>\n");        printf("</HTML>\n");        return 0;}
利用VS编译后的可执行文件为gettest.exe,放到/www/cgitest-c目录下。

POST方法实例源码

#include <stdio.h>#include <stdlib.h>int main(void){        int len;        char *lenstr,poststr[20];        char m[10],n[10];        printf("Content-Type:text/html\n\n");        printf("<HTML>\n");        printf("<HEAD>\n<TITLE >post Method</TITLE>\n</HEAD>\n");        printf("<BODY>\n");        printf("<div style=\"font-size:12px\">\n");        lenstr=getenv("CONTENT_LENGTH");        if(lenstr == NULL)                printf("<DIV STYLE=\"COLOR:RED\">Error parameters should be entered!</DIV>\n");        else{                len=atoi(lenstr);                fgets(poststr,len+1,stdin);                if(sscanf(poststr,"m=%[^&]&n=%s",m,n)!=2){                        printf("<DIV STYLE=\"COLOR:RED\">Error: Parameters are not right!</DIV>\n");                }                else{                       printf("<DIV STYLE=\"COLOR:GREEN; font-size:15px;font-weight:bold\">m * n = %d</DIV>\n",atoi(m)*atoi(n));                }        }        printf("<HR COLOR=\"blue\" align=\"left\" width=\"100\">");        printf("<input type=\"button\" value=\"Back CGI\" onclick=\"javascript:window.location='../cgitest-c.html'\">");        printf("</div>\n");        printf("</BODY>\n");        printf("</HTML>\n");        fflush(stdout);        return 0;}
利用VS编译后的可执行文件为posttest.exe,同样放到/www/cgitest-c目录下。

测试网页源码

<html><head><title>CGI Testing</title></head><body><table width="200" height="180" border="0" style="font-size:12px"><tr><td><div style="font-weight:bold; font-size:15px">Method: GET</div><div>please input two number:<div><form method="get" action="./c-cgi/gettest.exe"><input type="txt" size="3" name="a">+<input type="txt" size="3" name="b">=<input type="submit" value="sum"></form></td></tr><tr><td><div style="font-weight:bold; font-size:15px">Method: POST</div><div>please input two number:<div><form method="post" action="./c-cgi/posttest.exe"><input type="txt" size="3" name="m">*<input type="txt" size="3" name="n">=<input type="submit" value="resu"></form></td></tr><tr><td><input type="button" value="Back Home" onclick='javascript:window.location="./index.php"'></td></tr></table></body></html>
放到Apache服务器根目录下,在浏览器中通过localhost/cgitest-c.html可以访问到。

实际运行结果

        上述通过一个简单的计算来演示了CGI技术的实现和开发流程,当然对于简单的数字计算WEB前端自己就搞定了,此处只是为了说明CGI流程。至此整个Web PACSWeb服务端就已经搭建的差不多了,利用CGIFastCGI我们可以使用服务端的其他语言开发的程序来实现我们想要的功能,那么后续的工作就跟开发C/S模式的PACS一样了,用C/C++C#JAVA等高级语言开发PACS服务相关的程序供Web服务器调用即可。本博文中演示的是调用exe可执行文件,这种方式有风险,后续我会介绍在FastCGI模式下的利用PHP调用C++C#JAVA动态库的更安全的实现方式。


后续博文介绍

利用DCMTK搭建WML服务器

利用oracle直接操作DICOM数据

C#的异步编程模式在fo-dicom中的应用

VMWare三种网络连接模式的实际测试




作者:zssure@163.com

时间:2014-10-19

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做的衣柜没有门怎么办 蒸馒头熟了会瘪怎么办 3dmax贴图太大了怎么办 嘴皮边缘颜色深怎么办 嘴巴周围肤色暗沉怎么办 中奖彩票被洗了怎么办 牙龈下面长米粒肉疙瘩怎么办 书画印章盖反了怎么办 金龙鱼一个月不吃东西怎么办 罗汉鱼头撞扁了怎么办 房顶开槽埋线白色不一样怎么办 顶上灯挪位置线怎么办 马蜂窝弄掉又来怎么办 蜂窝弄掉又有怎么办 2018年小龙虾底板脏怎么办 一本分数线擦边过怎么办 玩具塑料球扁了怎么办 胶皮与海绵开了怎么办 安卓不支持flash了怎么办 看视频要加载flash怎么办 下水道管子铁皮破了怎么办 炸金花牌一样大怎么办 玩棋牌游戏输了怎么办 苹果7插耳机外放怎么办 出国种菠菜抓了怎么办 在菲做菠菜抓到怎么办 3串1中两个怎么办 微博账号封停怎么办 阴阳师账号被永久封停怎么办 寒刃2账号被禁用怎么办 输了好多钱我该怎么办 亲朋打鱼别处在玩怎么办 做糯米蛋的蛋清怎么办 水田地没耙地平怎么办 宝宝拉鸡蛋花样大便怎么办 电子琴伴奏区无旋律音怎么办 手机触摸屏摔坏了怎么办 手机充着电玩游戏卡怎么办? 4个月宝宝拉肚子怎么办 6个月宝宝上火怎么办 1月婴儿大便干燥怎么办