2

我正在使用 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'

有谁知道为什么我得到这个错误而不是图像?

4

2 回答 2

1

我不太了解您要做什么(并且不了解相关技术),但我认为您的理解不正确。

您正在执行患者级别的 C-FIND。您正在收到响应(匹配条目),然后是最终成功响应。好的。

那么,您是否正在尝试访问这些响应中的像素数据元素?- 没有意义。

C-FIND,不要给你实际的实例/图像。它只会为您提供 SCP 上存在的与您的搜索条件相匹配的条目,最后是一个 SUCCESS 响应。如果没有找到匹配的条目,则只返回最终的 SUCCESS 响应。

因此,您需要针对这些条目的像素数据,它不存在于那里。您还必须根据您在 C-FIND 响应中收到的标识符执行 C-MOVE(或 C-GET)。我已经在这里详细解释了这一点。

这一段会有点复杂,并且在不同实现的工作流中可能会有一些变化。要进行 CMove,必须存在 CStoreSCP。您 (CMoveSCU) 将向 PACS (CMoveSCP) 发送 CMove 命令,AE 标题为 CStoreSCP,您希望在其中接收实例。这意味着要么你也应该开发你自己的 CStoreSCP,要么你应该参与其他一些。CMoveSCP 将读取您发送的 AE 标题并将其与其配置相匹配。这意味着您的 CStoreSCP 必须提前在 PACS 上进行配置。从配置中,它将获取将建立新关联的 IP 地址和端口。这称为角色切换。CMoveSCP 现在也可用作 CStoreSCU。作为 CStoreSCU,PACS 会将实例推送到您的 CStoreSCP。这样,您实际上可以获得图像/实例。

这样,您将真正获得实例。拥有实例后,您可以访问这些实例中的像素数据。

请参阅这篇出色的文章,了解有关 Q/R 工作原理的更多信息。


简单的现实生活示例:

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

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

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

于 2019-03-09T10:12:28.837 回答
1

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

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

于 2019-03-11T09:31:08.047 回答