我使用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'有人知道为什么我得到这个错误而不是图像吗?
发布于 2019-03-09 18:12:29
我不太明白您想要做什么(也不了解相关技术),但我认为您的理解是不正确的。
你正在做病人级别的C-FIND。您将获得响应(匹配条目),然后最终获得成功响应。好的。
然后,您试图访问这些响应中的像素数据元素?-这没有意义。
C-FIND,不会给你实际的实例/镜像。它只为您提供SCP上存在的条目,这些条目与您的搜索条件相匹配,最后给出一个成功响应。如果找不到匹配的条目,则仅返回最终成功响应。
所以,你想要这些条目的像素数据,它不会出现在那里。您还必须根据在C-FIND响应中收到的标识符执行C-MOVE (或C-GET)。我已经在details here中对此进行了解释。
这一段会有点复杂,可能会在不同的实现的工作流程中有一些变化。要执行CMove,必须存在CStoreSCP。您(CMoveSCU)将向您要接收实例的AE标题为CStoreSCP的PACS (CMoveSCP)发送CMove命令。这意味着要么你也应该开发你自己的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)。一旦你下载了照片,你就可以将它加载到你的网页中。
呀..。这个例子很糟糕,而且不完全匹配。但是,我希望您能理解,这涉及到两个不同的操作。
发布于 2019-03-11 17:31:08
我完全同意Amit Joshi所说的,但我想补充的是,即使您使用在C-FIND中找到的标识符执行C-MOVE,您也无法从状态中获取像素数据。状态仅传达C-FIND/C-MOVE操作的状态,而不是正在传输的数据。
对于C-MOVE (通常比C-GET更受支持),Move-SCP将打开到move目的地AE的C-STORE连接,并通过该连接传输图像。也就是说,C-MOVE仅传输有关图像传输的状态信息,而不是图像本身。
https://stackoverflow.com/questions/55075964
复制相似问题