DICOM是醫學圖像和相關資訊的國際标準。 它定義了放射。心髒。放療和其他醫療領域中媒體交換的格式和通訊協定。
pynetdicom是一個純 python 程式,它實作了DICOM網絡協定。 使用 該插件可以輕松建立DICOM客戶機和伺服器,插件擷取位址:http://www.github.com/pydicom/pynetdicom
主要使用者類是
AE
,它用于表示一個DICOM應用程式實體。 建立
AE
之後,通常你将:
- 使用
作為SCP啟動應用程式,并等待傳入的關聯請求AE.start()
- 通過
方法請求與對等SCP的關聯,将應用程式作為SCU使用。AE.associate(addr, port)
一旦應用程式與對等點關聯,就可以通過使用dimse服務(。請參閱DICOM标準 PS3.7, 節 7.5,9和 10 ) 在它們之間發送DICOM資料。
支援SCU服務
當AE充當 SCU,并且與對等SCP建立關聯時,下列 dimse c 服務可用:
- c echo:
用于驗證與對等方的end-to-end通信。Association.send_c_echo()
- c 存儲:
請求對複合SOP執行個體資料集的存儲。Association.send_c_store(dataset)
- 查找:
請求對等點搜尋它的托管SOP執行個體,以便比對與資料集中給定的屬性相比對的那些執行個體。Association.send_c_find(dataset)
- 擷取一個
執行個體執行個體集合,然後将這些比對的執行個體傳回到資料集,然後将這些比對執行個體傳回給 SCU。Association.send_c_get(dataset)
- c 移動:
requests對等 search move_aet SOP dataset dataset dataset managed search search search。Association.send_c_move(dataset, move_aet)
支援SCP服務
當作為SCP時,在建立關聯之後,下面的dimse c 服務對于對等方可以用。 除了
on_c_echo()
之外,使用者還需要通過實作以下
AE
回調來處理所需的操作:
- c echo:
AE.on_c_echo()
- c 存儲:
AE.on_c_store(dataset)
- c 查找:
和AE.on_c_find(dataset)
AE.on_c_find_cancel()
- c 擷取:
和AE.on_c_get(dataset)
AE.on_c_get_cancel()
- c 移動:
和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')