You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pynetdicom展示DICOM C-FIND返回结果中的Series数据

基于pynetdicom实现STUDY-SERIES层级联动查询方案

DICOM Study Root查询模型原生支持层级匹配,不需要通过正则拆分字段关联,直接用标准的唯一标识符作为匹配条件即可实现层级联动。你遇到的问题核心是没有提取并保存Study Instance UID这个STUDY层级的唯一主键,用这个字段作为SERIES层级查询的过滤条件,就能精准拿到对应STUDY下的所有序列。

第一步:执行STUDY层级查询,存储关联主键

查询STUDY层级时,必须在返回字段中包含Study Instance UID,将该值与展示字段绑定存储在GUI控件的隐藏属性中(如Qt的QListWidgetItem.setData()、Tkinter的列表项绑定额外属性),不要只存展示用的文本信息。
STUDY层级查询示例代码:

from pynetdicom import AE
from pynetdicom.sop_class import StudyRootQueryRetrieveInformationModelFind
from pydicom.dataset import Dataset

ae = AE()
ae.add_requested_context(StudyRootQueryRetrieveInformationModelFind)
# 替换为你对接的PACS参数
assoc = ae.associate("PACS_IP", PACS_PORT, ae_title="PACS_AE_TITLE")

if assoc.is_established:
    ds = Dataset()
    ds.QueryRetrieveLevel = "STUDY"
    # 声明需要返回的字段
    ds.PatientName = ""
    ds.StudyDate = ""
    ds.StudyInstanceUID = "" # 必须保留的关联主键
    ds.StudyDescription = ""
    
    responses = assoc.send_c_find(ds, StudyRootQueryRetrieveInformationModelFind)
    study_result = []
    for status, identifier in responses:
        if status and status.Status == 0xFF00:
            study_result.append({
                "show_text": f"{identifier.PatientName} | {identifier.StudyDate} | {identifier.StudyDescription}",
                "study_uid": identifier.StudyInstanceUID # 存储主键用于后续关联
            })
    assoc.release()
# 将study_result渲染到GUI的STUDY列表中,每个项绑定对应的study_uid

第二步:触发展开时执行SERIES层级查询

当用户点击某条STUDY的下拉/展开按钮时,取出该STUDY绑定的Study Instance UID,作为SERIES层级查询的过滤条件,发起SERIES级C-FIND请求,返回的结果就是该STUDY下的所有序列,直接渲染到下拉区域即可。
SERIES层级查询示例代码:

# target_study_uid 为选中STUDY对应的关联主键
def query_series(target_study_uid):
    assoc = ae.associate("PACS_IP", PACS_PORT, ae_title="PACS_AE_TITLE")
    if not assoc.is_established:
        return []
    
    ds = Dataset()
    ds.QueryRetrieveLevel = "SERIES"
    # 过滤条件:仅返回对应STUDY下的序列
    ds.StudyInstanceUID = target_study_uid
    # 声明SERIES层级需要返回的字段
    ds.SeriesDescription = ""
    ds.Modality = ""
    ds.SeriesNumber = ""
    ds.SeriesInstanceUID = ""
    
    responses = assoc.send_c_find(ds, StudyRootQueryRetrieveInformationModelFind)
    series_result = []
    for status, identifier in responses:
        if status and status.Status == 0xFF00:
            series_result.append({
                "series_desc": identifier.SeriesDescription,
                "modality": identifier.Modality,
                "series_num": identifier.SeriesNumber
            })
    assoc.release()
    return series_result

优化方案(可选)

如果需要提升交互响应速度,可以在首次查询完所有STUDY后,后台异步预查询所有STUDY对应的SERIES列表,存储在本地字典中(key为Study Instance UID,value为对应SERIES列表),用户展开时直接读取本地缓存即可,无需重复发起C-FIND请求。

注意事项

  • 需确认对接的PACS支持Study Root模式的层级查询,绝大多数标准PACS均支持该特性
  • 不要用正则提取字段做关联,DICOM标准的UID字段是全局唯一的,稳定性远高于自定义正则匹配
  • 每次查询时需明确声明需要返回的UID字段,否则PACS不会返回对应值,无法完成层级关联

你当前的返回结果参考:
当前返回结果截图

内容的提问来源于stack exchange,提问作者Sun B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:36:02