# 质控结果聚合策略文档 ## 一、背景 在医学影像质控系统中,一次检查(Study)通常包含多张 DICOM 图像。对每张图像分别进行质控分析后,需要将多张图像的结果聚合为该检查的**整体质控结果**。 本文档定义了五项质控维度的聚合策略,确保结果计算逻辑统一、可追溯。 --- ## 二、质控维度定义 | 维度编码 | 维度名称 | 可选值 | 说明 | |---------|---------|--------|------| | CHECK_RANGE | 检查范围 | large(过大) / normal(正常) / small(过小) | 评估图像覆盖范围是否合适 | | BODY_POSITION | 体位 | standard(标准) / non_standard(不标准) | 评估患者体位是否符合规范 | | IMAGE_ARTIFACT | 图像伪影 | none(无) / motion_artifact(运动) / device(设备) / foreign_body(异物) | 评估图像是否存在伪影 | | CENTER_LINE | 中心线 | normal(正常) / up(偏上) / down(偏下) / left(偏左) / right(偏右) | 评估中心线位置是否正确 | | IMAGE_QUALITY_LEVEL | 质控等级 | X线: 1(甲)/2(乙)/3(丙)/4(丁);CT/MR: 0/1/2/3级 | 综合图像质量评级 | --- ## 三、聚合策略 ### 3.1 策略类型说明 | 策略类型 | 说明 | 算法 | |---------|------|------| | **众数策略** | 取出现次数最多的值 | 统计各值出现次数,取最大次数对应的值;若次数相同,优先取"正常"值 | | **最严格策略** | 只要有一个异常,整体即为异常 | 按严重程度排序,取最严重的值 | | **最差值策略** | 取最差的等级 | 数值比较,取最差(最大或最小)的值 | ### 3.2 各维度聚合策略 | 维度 | 聚合策略 | 策略理由 | |-----|---------|---------| | **检查范围** | 众数策略 | 个别图片范围异常可能是序列边缘图像,应以多数图片为准 | | **体位** | 众数策略 | 大部分图片体位标准即可认定检查体位合格 | | **图像伪影** | 最严格策略 | 只要有一张图片存在伪影,就应记录并提示,取最严重的伪影类型 | | **中心线** | 众数策略 | 少数图片偏移可接受,以多数图片的判定为准 | | **质控等级** | 最差值策略 | 整体质量由最差的图片决定,木桶效应 | --- ## 四、详细算法 ### 4.1 众数策略算法 ``` 输入: 值列表 [v1, v2, v3, ...] 输出: 出现次数最多的值 算法: 1. 统计每个值的出现次数 2. 找出最大次数 3. 如果有多个值次数相同: - 检查范围: 优先返回 "normal" - 体位: 优先返回 "standard" - 中心线: 优先返回 "normal" 4. 返回众数值 ``` **示例:** - 输入: [normal, normal, large, normal, small] - 统计: normal=3, large=1, small=1 - 输出: normal ### 4.2 最严格策略算法(伪影) ``` 伪影严重程度排序(从轻到重): none(0) < motion_artifact(1) < device(2) < foreign_body(3) 输入: 伪影值列表 [v1, v2, v3, ...] 输出: 最严重的伪影类型 算法: 1. 将每个值映射为严重程度数值 2. 取最大数值对应的伪影类型 3. 返回该类型 ``` **示例:** - 输入: [none, none, foreign_body, none, device] - 映射: [0, 0, 3, 0, 2] - 最大值: 3 - 输出: foreign_body ### 4.3 最差值策略算法(质控等级) ``` 质控等级数值定义: - X线: 甲级=1, 乙级=2, 丙级=3, 丁级=4 (数值越大越差) - CT/MR: 0级=0, 1级=1, 2级=2, 3级=3 (数值越大越差) 输入: 等级值列表 [v1, v2, v3, ...] 输出: 最差的等级 算法: 1. 将每个等级转为数值 2. 取最大数值 3. 转回等级表示 4. 返回该等级 ``` **示例(CT检查):** - 输入: [1, 2, 1, 3, 2] - 最大值: 3 - 输出: 3级 **示例(X线检查):** - 输入: [甲级, 乙级, 甲级, 丙级, 乙级] - 映射: [1, 2, 1, 3, 2] - 最大值: 3 - 输出: 丙级 --- ## 五、完整示例 ### 输入数据 某CT检查包含5张图像,分析结果如下: | 图片序号 | 检查范围 | 体位 | 伪影 | 中心线 | 质控等级 | |---------|---------|------|------|--------|---------| | 0 | normal | standard | none | normal | 1 | | 1 | normal | standard | foreign_body | left | 2 | | 2 | large | standard | none | normal | 1 | | 3 | normal | non_standard | none | normal | 2 | | 4 | normal | standard | device | normal | 3 | ### 聚合计算 | 维度 | 策略 | 计算过程 | 结果 | |-----|------|---------|------| | 检查范围 | 众数 | normal=4, large=1 → 众数为normal | **normal** | | 体位 | 众数 | standard=4, non_standard=1 → 众数为standard | **standard** | | 伪影 | 最严格 | none=3, foreign_body=1, device=1 → 最严重为foreign_body | **foreign_body** | | 中心线 | 众数 | normal=4, left=1 → 众数为normal | **normal** | | 质控等级 | 最差值 | [1,2,1,2,3] → 最大值3 | **3级** | ### 最终整体结果 ```json { "checkRangeResult": "normal", "checkRangeLabel": "正常", "bodyPositionResult": "standard", "bodyPositionLabel": "标准", "imageArtifactResult": "foreign_body", "imageArtifactLabel": "体外异物伪影", "centerLineResult": "normal", "centerLineLabel": "正常", "qualityLevel": "3", "qualityLevelLabel": "3级", "imageCount": 5, "passCount": 2, "failCount": 3 } ``` --- ## 六、特殊情况处理 | 情况 | 处理方式 | |-----|---------| | 无法读取任何图片 | 五项结果均返回默认值(normal/standard/none/normal/2级),并标记分析状态为"失败" | | 只有1张图片 | 直接使用该图片的分析结果,无需聚合 | | 部分图片分析失败 | 只使用成功分析的图片进行聚合,记录失败图片数量 | | 所有图片分析失败 | 同"无法读取任何图片" | --- ## 七、数据存储 ### 7.1 qc_result 表(明细) 存储每张图片的每个维度分析结果: | 字段 | 说明 | |-----|------| | exam_id | 检查ID | | image_index | 图片序号(0,1,2...) | | factor_id | 因子ID(对应五个维度) | | factor_value | 该图片该维度的分析结果 | | analysis_log | 详细分析日志 | ### 7.2 qc_result_summary 表(汇总) 存储整体聚合结果(需新增字段): | 字段 | 说明 | |-----|------| | check_range_result | 检查范围聚合结果 | | body_position_result | 体位聚合结果 | | image_artifact_result | 伪影聚合结果 | | center_line_result | 中心线聚合结果 | | quality_level | 质控等级聚合结果 | | image_count | 分析的图片总数 | | success_image_count | 成功分析的图片数 | --- ## 八、版本记录 | 版本 | 日期 | 修改内容 | 作者 | |-----|------|---------|------| | 1.0 | 2025-12-28 | 初始版本 | Claude |