天天看點

DICOM學習(2)——python實作DICOM檔案歸檔PACS伺服器

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 服務可用:

  • c echo: 

    Association.send_c_echo()

     用于驗證與對等方的end-to-end通信。
  • c 存儲:

    Association.send_c_store(dataset)

     請求對複合SOP執行個體資料集的存儲。
  • 查找:

    Association.send_c_find(dataset)

     請求對等點搜尋它的托管SOP執行個體,以便比對與資料集中給定的屬性相比對的那些執行個體。
  • 擷取一個 

    Association.send_c_get(dataset)

     執行個體執行個體集合,然後将這些比對的執行個體傳回到資料集,然後将這些比對執行個體傳回給 SCU。
  • c 移動: 

    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

 回調來處理所需的操作:

  • 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')