dicom网络协议的python实现

pynetdicom的Python项目详细描述


Pynetdicom

dicom的python实现 网络协议,最初基于(传统) pynetdicom

说明

dicom 是国际医疗标准 图像和相关信息。它定义了格式和通信 放射、心脏病学、放射治疗和其他领域的媒体交换协议 医学领域。

pynetdicom 是一个纯python(2.7/3.4+)包,它实现了dicom 网络协议。使用pydicom 它允许轻松创建dicom 服务类用户(scu)和 服务类提供商 (SCP)。

主要用户类是 ae ,用于表示dicom应用程序 实体。一旦创建了 ae ,您通常会:

  • 通过指定 您将支持,然后调用ae.start_server((host,port))并等待 对于传入的关联请求
  • 通过指定表示上下文,将应用程序用作SCU 希望对等SCP支持,然后请求关联 通过 ae.associate(host,port) 方法,返回 关联 线程.

一旦应用程序与对等ae、dicom数据ca相关联n发送于 通过使用dimse-c和-n服务(参见dicom标准第7部分, 章节 7.5 9 , 以及 10 )。

支持的服务类

pynetdicom 支持以下dicom服务类:

  • 相关病人信息查询服务类
  • RT机器验证服务类
  • 存储服务类
  • 眼科屈光测量存储
  • 软拷贝表示状态存储
  • 结构化报告存储
  • 体积表示状态存储
  • 存储承诺服务类
  • 物质管理查询服务类
  • 统一过程步骤服务类
  • 验证服务类
  • 支持的Dimse SCU服务

    当ae作为scu并与 对等SCP,提供以下dimse-c和-n服务(前提是 对等方支持服务类,相应的表示上下文具有 已被接受):

    <表> < COLGROUP > < COL/> < COL/> <广告> Dimse服务 关联方法 < /广告> <正文> c-echo 发送c_echo() c-查找 发送查找(数据集、查询模型) c-get 发送获取(数据集、查询模型) C-移动 发送移动(数据集、移动AET、查询模型) C-商店 发送存储(数据集) n-动作 发送操作(数据集、操作类型、类uid, 实例uid) n-创建 发送创建(数据集、类uid、实例uid) n-删除 发送删除(类uid,实例uid) n-事件-报告 发送事件报告(数据集,事件类型, 类uid,实例uid) n-get 发送获取(标识符列表、类uid、实例uid) n-集 发送集合(数据集、类uid、实例uid) <表>

    其中, 数据集 是pydicom 数据集 对象, 查询模型 是一个uid字符串, 标识符列表 是一个pydicom列表 标记 对象、 事件类型 操作类型 是int和 类uid 实例uid 是uid字符串。见 关联文档 了解更多信息。

    支持的dimse scp服务

    当ae充当scp时,以下dimse-c和-n服务是 一旦建立了关联,对等方就可以使用:

    <表> < COLGROUP > < COL/> < COL/> <广告> Dimse服务 干预事件 < /广告> <正文> c-echo evt.evt_c_echo c-查找 evt.evt_c_find c-get evt.evt_c_get C-移动 evt.evt_c_move C-商店 evt.evt_c_商店 n-动作 evt.evt_n_操作 n-创建 evt.evt_n_创建 n-删除 evt.evt_n_删除 n-事件-报告 evt.evt_n_事件报告 n-get evt.evt_n_get n-集 evt.evt_n_集 <表> <P>除了c-echo服务,一个用户定义的可调用函数, 处理程序 ,必须绑定到相应的 干预事件 以便完成一个dimse服务请求。事件 可以使用 从PynetDicom导入evt 导入,并且处理程序可以 在通过 evt_处理程序启动关联之前绑定到事件 ae.start_server() ae.associate() 中的关键字参数

    当事件发生时,调用并传递一个 参数, event ,它是一个具有特定属性的 evt.event 对象 取决于发生的事件类型。绑定到的处理程序 干预事件必须返回或产生某些值。见 处理程序文档 有关 事件中可用的属性和属性的信息 对于每个事件类型和 相应的处理程序。

    安装

    依赖关系

    pydicom

    安装当前版本
    $ pip install pynetdicom
    

    安装开发版本
    $ pip install git+git://github.com/pydicom/pynetdicom.git
    

    示例

    向对等验证scp发送dicom c-echo(在tcp/ip地址 addr , 侦听端口号 端口 ):

    frompynetdicomimportAEae=AE(ae_title=b'MY_ECHO_SCU')# Verification SOP Class has a UID of 1.2.840.10008.1.1#   we can use the UID string directly when requesting the presentation#   contexts we want to use in the associationae.add_requested_context('1.2.840.10008.1.1')# Associate with a peer DICOM AEassoc=ae.associate(addr,port)ifassoc.is_established:# Send a DIMSE C-ECHO request to the peer# `status` is a pydicom Dataset object with (at a minimum) a#   (0000,0900) Status element# If the peer hasn't accepted the requested context then this#   will raise a RuntimeError exceptionstatus=assoc.send_c_echo()# Output the response from the peerifstatus:print('C-ECHO Response: 0x{0:04x}'.format(status.Status))# Release the associationassoc.release()

    在端口11112上创建一个阻塞的dicom c-echo侦听scp(您可以选择 如果要返回某些内容,请将处理程序绑定到evt.evt_c_echo 事件 除a 成功 状态之外:

    frompynetdicomimportAE,VerificationPresentationContextsae=AE(ae_title=b'MY_ECHO_SCP')# Or we can use the inbuilt VerificationPresentationContexts list,#   there's one for each of the supported Service Classes# In this case, we are supporting any requests to use Verification SOP#   Class in the associationae.supported_contexts=VerificationPresentationContexts# Start the SCP on (host, port) in blocking modeae.start_server(('',11112),block=True)

    或者,可以在非阻塞模式下启动scp,这将返回 正在运行服务器实例。当您希望运行存储scp时,这将非常有用 并在同一个客户机中提出移动请求。在下一个示例中,我们将创建 非阻塞验证scp并绑定c-echo服务的处理程序 记录请求者地址和端口的请求事件 事件的编号和时间戳。

    importloggingfrompynetdicomimportAE,evt,VerificationPresentationContexts,debug_logger# Setup logging to use the StreamHandler at the debug leveldebug_logger()LOGGER=logging.getLogger('pynetdicom')ae=AE(ae_title=b'MY_ECHO_SCP')ae.supported_contexts=VerificationPresentationContexts# Implement the EVT_C_ECHO handlerdefhandle_echo(event):"""Handle a C-ECHO service request.
    
        Parameters
        ----------
        event : evt.Event
            The C-ECHO service request event.
    
        Returns
        -------
        int or pydicom.dataset.Dataset
            The status returned to the peer AE in the C-ECHO response.
            Must be a valid C-ECHO status value as either an ``int`` or a
            ``Dataset`` object containing an (0000,0900) *Status* element.
        """# Every *Event* includes `assoc` and `timestamp` attributes#   which are the *Association* instance the event occurred in#   and the *datetime.datetime* the event occurred atrequestor=event.assoc.requestortimestamp=event.timestamp.strftime("%Y-%m-%d %H:%M:%S")msg=("Received C-ECHO service request from ({}, {}) at {}".format(requestor.address,requestor.port,timestamp))LOGGER.info(msg)# Return a *Success* statusreturn0x0000handlers=[(evt.EVT_C_ECHO,handle_echo)]# Start the SCP in non-blocking modescp=ae.start_server(('',11112),block=False,evt_handlers=handlers)# Send a C-ECHO request to our own Verification SCPae.add_requested_context('1.2.840.10008.1.1')assoc=ae.associate('localhost',11112)ifassoc.is_established:status=assoc.send_c_echo()assoc.release()# Shutdown the SCPscp.shutdown()

    将.dcm文件中的dicom ct图像存储数据集发送到对等存储 SCP(在TCP/IP地址 地址 ,侦听端口号 端口 ):

    frompydicomimportdcmreadfrompydicom.uidimportImplicitVRLittleEndianfrompynetdicomimportAE,VerificationPresentationContextsfrompynetdicom.sop_classimportCTImageStorage,MRImageStorageae=AE(ae_title=b'MY_STORAGE_SCU')# We can also do the same thing with the requested contextsae.requested_contexts=VerificationPresentationContexts# Or we can use inbuilt objects like CTImageStorage.# The requested presentation context's transfer syntaxes can also#   be specified using a str/UID or list of str/UIDsae.add_requested_context(CTImageStorage,transfer_syntax=ImplicitVRLittleEndian)# Adding a presentation context with multiple transfer syntaxesae.add_requested_context(MRImageStorage,transfer_syntax=[ImplicitVRLittleEndian,'1.2.840.10008.1.2.1'])assoc=ae.associate(addr,port)ifassoc.is_established:dataset=dcmread('file-in.dcm')# `status` is the response from the peer to the store request# but may be an empty pydicom Dataset if the peer timed out or# sent an invalid dataset.status=assoc.send_c_store(dataset)assoc.release()

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    java有没有工具可以将zephyr转换为velocity模板?   java在安卓 studio中从JSON响应中获取值   jvm如何在Java中设计一个好的permgen空间字符串?   java如何防止Rest webservice使用被盗令牌进行身份验证   java无法遍历列表JSTL   找不到用于ResourceServerTokenServices的java Bean SpringSecurityOauth2   java子字符串替换问题   爪哇玻璃鱼3。十、 以编程方式处理任意HTTPSession的终止   java如何检查输入是否为整数,并在最后添加一个命令来重新启动while循环?   引发java ical4j 1.0.6不可解析日期异常   Java等价于Delphi的DBCtrlGrid?   如果发生错误,java将查找下一个预期标记ANTLR 3   java自打开应用程序(创建锁屏)   java为什么netty有自己的ConcurrentHashMap?   Gradle任务中的java拉取和运行依赖项   继承与Java继承的混淆   java使用shell脚本中的版本执行jar   java我无法让Sqlite数据库与带有Maven的JavaFX应用程序IDE Eclipse包正确通信   java控制台日志未通过org打印。阿帕奇。hadoop。mapreduce。作业的waitForCompletion(true)方法   JAVAlang.NoSuchMethodError:apachestorm螺栓中的spring getrequest