我将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'
有人知道我为什么会收到此错误而不是图像吗?
答案 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仅传输有关图像传输的状态信息,而不传输图像本身。