【问题标题】:pydicom Dataset: send_c_find return success but status.pixel_array has error text in itpydicom 数据集:send_c_find 返回成功,但 status.pixel_array 中有错误文本
【发布时间】:2023-03-08 05:11:01
【问题描述】:

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

有谁知道我为什么会收到此错误而不是图片?

【问题讨论】:

    标签: python dicom pydicom


    【解决方案1】:

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

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

    【讨论】:

    • 我的意思是一样的,C-STORE SCP 部分包含在我在答案中添加的链接中。不过,最好在这里明确一点。感谢您的关注。
    【解决方案2】:

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

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

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

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

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

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

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

    请参阅this 优秀文章,了解更多关于 Q/R 的工作原理。


    简单的现实生活示例:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      相关资源
      最近更新 更多