DICOM是医学图像和相关信息的国际标准。 它定义了放射。心脏。放疗和其他医疗领域中媒体交换的格式和通讯协议。
pynetdicom是一个纯 python 程序,它实现了DICOM网络协议。 使用 该插件可以轻松创建DICOM客户机和服务器,插件获取地址:http://www.github.com/pydicom/pynetdicom
主要用户类是 AE
,它用于表示一个DICOM应用程序实体。 创建 AE
之后,通常你将:
AE.start()
作为SCP启动应用程序,并等待传入的关联请求AE.associate(addr, port)
方法请求与对等SCP的关联,将应用程序作为SCU使用。一旦应用程序与对等点关联,就可以通过使用dimse服务(。请参阅DICOM标准 PS3.7, 节 7.5,9和 10 ) 在它们之间发送DICOM数据。
支持SCU服务
当AE充当 SCU,并且与对等SCP建立关联时,下列 dimse c 服务可用:
Association.send_c_echo()
用于验证与对等方的end-to-end通信。Association.send_c_store(dataset)
请求对复合SOP实例数据集的存储。Association.send_c_find(dataset)
请求对等点搜索它的托管SOP实例,以便匹配与数据集中给定的属性相匹配的那些实例。Association.send_c_get(dataset)
实例实例集合,然后将这些匹配的实例返回到数据集,然后将这些匹配实例返回给 SCU。Association.send_c_move(dataset, move_aet)
requests对等 search move_aet SOP dataset dataset dataset managed search search search。支持SCP服务
当作为SCP时,在建立关联之后,下面的dimse c 服务对于对等方可以用。 除了 on_c_echo()
之外,用户还需要通过实现以下 AE
回调来处理所需的操作:
AE.on_c_echo()
AE.on_c_store(dataset)
AE.on_c_find(dataset)
和 AE.on_c_find_cancel()
AE.on_c_get(dataset)
和 AE.on_c_get_cancel()
AE.on_c_move(dataset, move_aet)
和 AE.on_c_move_cancel()
下面的代码的主要工作是连接已有的PACS的AE,并用c_stroe实现CT/MR文件归档:
#coding=utf-8
from pydicom import dcmread
from pynetdicom import AE
from pynetdicom.sop_class import CTImageStorage, MRImageStorage
# Initialise the Application Entity
ae = AE(ae_title=b'WHTM-116')
# Add a requested presentation context
ae.add_requested_context(CTImageStorage)
ae.add_requested_context(MRImageStorage)
# Read in our DICOM CT dataset
#ds = dcmread('E:\code\dicom\MR.dcm')
ds = dcmread('E:\code\dicom\CT.dcm')
# Associate with peer AE at IP 127.0.0.1 and port 11112
assoc = ae.associate('10.3.2.85',3333,ae_title=b'UIHPACSSERVER')
if assoc.is_established:
# Use the C-STORE service to send the dataset
# returns the response status as a pydicom Dataset
status = assoc.send_c_store(ds)
# Check the status of the storage request
if status:
# If the storage request succeeded this will be 0x0000
print('C-STORE request status: 0x{0:04x}'.format(status.Status))
else:
print('Connection timed out, was aborted or received invalid response')
# Release the association
assoc.release()
else:
print('Association rejected, aborted or never connected')