dcm4chee PACS执行C-FIND成功后,访问pixel_array报属性错误求助
我来帮你拆解这个问题——你遇到的错误其实源于两个核心问题:对DICOM C-FIND操作的功能误解,以及对返回对象的误用。
1. C-FIND根本不返回像素数据
你当前的代码在执行C-FIND查询,这个操作的核心作用是检索DICOM元数据(比如患者姓名、检查UID、序列信息等),而不是获取图像的像素内容。
当你设置QueryRetrieveLevel = 'PATIENT'时,返回的identifier数据集只包含患者级别的元数据(比如PatientName、StudyInstanceUID),完全没有PixelData(像素数据元素),更不会包含file_meta(DICOM文件头元信息)——因为C-FIND返回的是查询结果的精简数据集,不是完整的DICOM图像文件。
另外你犯了一个对象误用的错误:你尝试访问status.pixel_array,但status是C-FIND的状态响应对象,它本身不是图像数据集,自然没有pixel_array属性。就算你去访问identifier.pixel_array,也会失败,因为这个数据集里根本没有像素数据。
2. 正确获取像素数据的流程
要拿到图像的像素数组,你需要在C-FIND查询到目标实例的UID后,执行C-MOVE或C-GET操作,向PACS服务器请求对应的图像实例数据。
基于你的代码,修改后的流程大概是这样:
ae = AE() ae.add_requested_context(PatientRootQueryRetrieveInformationModelFind) ae.add_requested_context(PatientRootQueryRetrieveInformationModelMove) # 添加C-MOVE的上下文 ae.add_requested_context(VerificationSOPClass) assoc = ae.associate(config['pacs_remotehost']['ip'], config['pacs_remotehost']['ports']['DICOM'], ae_title='DCM4CHEE') if assoc.is_established: # 第一步:C-FIND查询获取目标实例的UID ds = Dataset() ds.PatientName = '*************' # 你的患者姓名 ds.QueryRetrieveLevel = 'IMAGE' # 改成IMAGE级别,直接拿到图像实例的UID responses = assoc.send_c_find(ds, query_model='P') # 收集需要的图像实例UID target_instance_uids = [] for (status, identifier) in responses: if status: print('C-FIND query status: 0x{0:04x}'.format(status.Status)) if status.Status in (0xFF00, 0xFF01): print(f"找到图像实例UID: {identifier.SOPInstanceUID}") target_instance_uids.append(identifier.SOPInstanceUID) # 第二步:用C-MOVE请求获取图像数据 if target_instance_uids: move_ds = Dataset() move_ds.QueryRetrieveLevel = 'IMAGE' move_ds.SOPInstanceUID = target_instance_uids[0] # 取第一个图像实例 # 注意:这里的destination_ae_title要填你本地AE的标题,PACS会把图像发送到这个AE move_responses = assoc.send_c_move(move_ds, destination_ae_title='YOUR_LOCAL_AE_TITLE', query_model='P') for (status, image_ds) in move_responses: if status.Status == 0x0000 and hasattr(image_ds, 'PixelData'): # 现在这个image_ds是完整的DICOM图像数据集,可以访问pixel_array了 pixel_array = image_ds.pixel_array print(f"像素数组形状: {pixel_array.shape}") # 释放关联 assoc.release() else: print('Association rejected, aborted or never connected')
3. 关于file_meta错误的补充
file_meta是DICOM文件的文件元信息段,只有当你读取完整的DICOM文件,或者通过C-MOVE/C-GET接收到完整的图像实例时,这个属性才会存在。C-FIND返回的精简数据集没有这部分信息,所以就算你拿到了带像素数据的数据集(这里不存在),也需要手动设置TransferSyntaxUID才能完成像素数据的转换。
内容的提问来源于stack exchange,提问作者sha1111

