pydicom数据集:send_c_find返回成功,但是status.pixel_array中包含错误文本

时间:2019-03-09 09:40:34

标签: python dicom pydicom

我将dcm4chee用作PACS服务器,并试图根据患者姓名检索研究。

相关代码为:

ae = AE()
ae.add_requested_context(PatientRootQueryRetrieveInformationModelFind)
ae.add_requested_context(VerificationSOPClass)
assoc = ae.associate(config['pacs_remotehost']['ip'], config['pacs_remotehost']['ports']['DICOM'],ae_title='DCM4CHEE')

if assoc.is_established:
    ds = Dataset()
    ds.PatientName = '*************' #name erased 
    ds.QueryRetrieveLevel = 'PATIENT'
    ds.StudyInstanceUID = ''
    responses = assoc.send_c_find(ds, query_model='P')
    for (status, identifier) in responses:
        if status:
           print('C-FIND query status: 0x{0:04x}'.format(status.Status))

           # If the status is 'Pending' then `identifier` is the C-FIND response
           if status.Status in (0xFF00, 0xFF01):
               print(identifier)
        else:
           print('Connection timed out, was aborted or received invalid response')

# Release the association
    assoc.release()
else:
    print('Association rejected, aborted or never connected')

我收到了成功信号:

C-FIND查询状态:0x0000

但是当我想访问像素数据时,我输入status.pixel_array 但它不是Numpy数组,而是包含以下错误:

    File "<ipython-input-2-c65fb50a50a6>", line 1, in <module>
    status.pixel_array File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 552, in __getattr__
    return super(Dataset, self).__getattribute__(name)
  File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 949, in pixel_array
    self.convert_pixel_data()
  File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 816, in convert_pixel_data
    transfer_syntax = self.file_meta.TransferSyntaxUID
  File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 552, in __getattr__
    return super(Dataset, self).__getattribute__(name)
AttributeError: 'Dataset' object has no attribute 'file_meta'

有人知道我为什么会收到此错误而不是图像吗?

2 个答案:

答案 0 :(得分:1)

我不太了解您要做什么(也不知道所涉及的技术),但是我认为您的理解是错误的。

您正在做患者C级查找。您正在获得响应(匹配条目),然后最终获得成功响应。好。

然后,您正在尝试访问那些响应中的像素数据元素吗? -没有道理。

C-FIND,不提供实际的实例/图像。它只是为您提供SCP上符合您搜索条件的条目,最后是SUCCESS响应。如果找不到匹配的条目,则仅返回最终的SUCCESS响应。

因此,您希望针对这些条目的像素数据不存在于其中。您还必须根据在C-FIND响应中收到的标识符执行C-MOVE(或C-GET)。我已经详细说明了here

  

本段内容会有些复杂,并且在工作流程方面,采用不同的实现方式可能会有所不同。要进行CMove,必须存在一个CStoreSCP。您(CMoveSCU)将向您想要接收实例的CStoreSCP的AE标题发送CMove命令到PACS(CMoveSCP)。这意味着您还应该开发自己的CStoreSCP或参与其他项目。 CMoveSCP将读取您发送的AE标题,并将其与其配置进行匹配。这意味着您必须预先在PACS上配置CStoreSCP。通过配置,它将使用IP地址和端口来建立NEW关联。这称为角色切换。 CMoveSCP现在也可以用作CStoreSCU。充当CStoreSCU,PACS随后会将实例推送到您的CStoreSCP。这样,您实际上可以获得图像/实例。

这样,您实际上将获得实例。有了实例后,就可以访问这些实例中的像素数据。

请参阅this出色的文章,以了解有关Q / R如何工作的更多信息。


简单的现实示例:

您有一个数据库表,其中包含个人ID和其个人资料照片的URL。您想要将该个人资料照片加载到您的网页中。

因此,您首先触发SQL查询(DICOM中为C-FIND)并获取记录。然后,从记录中读取URL。使用此URL,您将开始从服务器下载照片的新操作(DICOM中的C-MOVE)。下载照片后,可以将其加载到网页中。

Yaaa ..这个例子很糟糕,并不完全匹配。但是,我希望您了解其中涉及两个不同的动作。

答案 1 :(得分:1)

我完全同意阿米特·乔希(Amit Joshi)所说的话,但是我想补充一点,即使您使用C-FIND中的标识符执行C-MOVE,也将无法从状态中获取像素数据。状态仅传达C-FIND / C-MOVE操作的状态,不传达正在传输的数据。

对于C-MOVE(比C-GET更受支持),Move-SCP将打开与移动目标AE的C-STORE连接,并通过该连接传输图像。也就是说,C-MOVE仅传输有关图像传输的状态信息,而不传输图像本身。