返回 Skill 列表
extension
分类: 数据与分析无需 API Key

数数SSR,UR的图标数量

Count game inventory icons by rarity tier (SSR/UR/SR etc.) from screenshot images. This skill should be used when the user asks to count, tally, or summarize quantities of game item icons displayed in an inventory grid image — especially gacha-style inventory screens where each icon shows a rarity text label and a quantity number in the top-right corner.

person作者: user_6377ddb8hubcommunity

Icon Counter — 游戏图标数量统计

Overview

从游戏背包/仓库/图鉴截图(通常是网格排列的物品图标)中,按稀有度统计每种稀有度物品的总数量。

适用场景:

  • 用户发来一张游戏背包截图,要求"数一下有多少个 SSR / UR"
  • 截图中每个格子包含:物品图标 + 稀有度标签(文字或颜色)+ 右上角数量角标
  • 需要逐格识别稀有度、读取数量、汇总输出

依赖

本 skill 附带一个 Python 量化脚本 assets/count_icons.py,用于切网格、判激活、判稀有度候选、生成 preview 图。

运行脚本需要:

  • Python 3.x
  • Pillownumpy
  • (OCR 模式,推荐)rapidocr-onnxruntime —— 纯 pip、基于 ONNX、不依赖 torch,用于直接读稀有度文字标签与数量角标。

若当前环境没有这些包,先用 pip 安装:

pip install Pillow numpy rapidocr-onnxruntime

如果环境确实无法运行脚本(例如没有 Python),可退回到纯 LLM 视觉模式,但准确率会下降,且建议对结果进行抽样复核。

核心规则(务必遵守)

1. 默认不统计 SR(及更低稀有度)

  • 默认只统计 SSR 和 UR,明确排除 SR(以及 R / N 等更低档)。
  • 只有当用户明确强调"需要数 SR / 把 SR 也算上"时,才把 SR 纳入统计。
  • 脚本的 rarity 颜色候选若判定为 SR,默认在汇总时排除;用户强调后再计入。

2. 计数分两步:脚本量化 + LLM 读高清单格

这是本 skill 当前版本的首选计数逻辑:

  1. count_icons.py 把截图按规则网格切分成单格 tile;
    • 脚本会自动检测列数/行数(自相关周期检测 + 谷检测 + 内容段分析),不再默认死定 7 列;
    • 若自动检测明显错位,可手动传 --cols / --rows
  2. 脚本自动判暗淡(OFF),并用 RapidOCR 对整图做一次彩色 OCR,将检测到的稀有度文字(SSR / UR / SR / SSR+ 等)按坐标映射到对应格;
    • v1.2.0 核心改进:不再逐格做 OCR。实测 4~5 行布局(单格仅 ~50px 高)逐格 OCR 几乎全失败(0%~6%),且每图 200+ 次重复调用触发 onnxruntime 间歇性段错误导致进程崩溃。改用「整图放大后单次彩色 OCR」→ 文字尺寸充足、单次调用稳定、识别率大幅提升(61%~86%)。
    • 整图 OCR 未命中的 active 格回退用边框颜色候选(橙=SSR / 红=UR / 紫=SR)判定,并在输出标注。
    • 整体 OCR 识别率 < 50% 时(多见于重度压缩/模糊截图),脚本会警告:未读格依赖边框颜色,可能与真实文字标签不符,需人工或 LLM 核对 contact sheet。
  3. 脚本生成一张高分辨率 contact sheet--contact),每格放大 6 倍并带行列号;
  4. LLM 直接读 contact sheet,按文字标签读取稀有度、读取右上角数量角标;
  5. 按四规则(A/B/C/D)汇总输出。

为什么数量角标不用 OCR? 实测 RapidOCR 对这种小尺寸、孤立的游戏数字角标识别率几乎为 0;但放大后的单格对 LLM 视觉非常清晰。因此数量交给 LLM 读 contact sheet,比用户逐张复核更快,也比直接看整屏更准确。

回退:若 OCR 装不上,脚本仍可生成 preview.png / contact.png,LLM 读图完成统计。

禁止直接拿原图让 LLM "凭感觉数"——那是最旧流程,误差极大。

3. 稀有度判定:文字标签优先(OCR 读),脚本颜色候选仅作参考

  • UR / SSR 的区分以图标底部的文字标签为准(用户明确要求),OCR 直接读该文字(多区域投票增强,清晰图可 100% 命中)。
  • 脚本边框颜色候选(橙=SSR、红=UR、紫=SR)仅作OCR 失败时的兜底;当文字与颜色矛盾时,以文字为准
  • 边框颜色对相近色(橙 vs 红、SR vs SSR)容易误判,这正是不完全依赖边框的原因。
  • OCR 失败回退:当某格底部文字读不出时,用边框颜色候选判定,并在 JSON 的 rarity_border / rarity_ocr 字段区分(LLM 读 contact sheet 可进一步校正)。
  • 常见陷阱:SSR+、SP、限定等边框可能是紫色/金色,但文字仍属 SSR 档,按文字归入 SSR。

4. 计数核心四规则(优先级最高)

若本 skill 任何旧规则与上述四条冲突,一律以本版新规则为准

规则 A — 暗淡 = 不计入(最高优先级)

  • 脚本标记为 OFF 的灰暗/未点亮格,以及视觉上明显变暗/灰化的格子,直接跳过,不计入任何稀有度。
  • 暗淡判定由脚本量化(亮度/饱和度阈值)完成,LLM 不必逐格肉眼判断。

规则 B — 角标数量优先统计(有角标 = 一定激活)

  • 只要格子有右上角数量角标(显示数字),它一定是激活的
  • 按角标数值统计(例如角标 "3" → 记 3 个);角标数值优先于任何亮度/颜色/边框判断。
  • 若存在 "0" 角标(极少见),按 0 计入(不增加总数),仍属激活判定,无需跳过。

规则 C — 无角标但非暗淡 = 记 1 个

  • 物品格确实非暗淡(脚本判为 active、未标 OFF),但没有数量角标 → 记 1 个
  • 典型场景:该物品在背包中恰好只有 1 个,游戏不显示角标。

规则 D — SR 默认排除

  • 默认不统计 SR(及 R / N 更低档)。
  • 仅当用户明确强调"要数 SR / 把 SR 也算上"时才纳入。

5. 非物品格(按钮 / 装饰)排除

以下格子即使非暗淡也不计入,靠 tile 内文字识别排除:

  • 按钮、徽章、标题、成就等 UI 元素,常见关键词:玩家专属、CLAM、通行证、重置抽奖、活动、奖励 等;
  • 这类格子通常无真正数量角标,或右上角数字并非物品数量,需结合文字判断。

6. 批量多图:每图独立生成 preview,分别统计

  • 一次处理多张图片时,对每张图分别跑脚本、生成 preview、读取数字。
  • 最后再合并合计。

7. 用户复核改为兜底机制

不再"每张图都让用户复核"。仅在以下情况才需要用户确认:

  • preview 的网格切分明显错位(行列不对);
  • 某格角标数字实在模糊,无法判断;
  • 脚本与 LLM 对"是否激活 / 稀有度"判断冲突;
  • 遇到全新游戏布局,脚本参数(--cols / --rows)需要首次标定;
  • 脚本报告 OCR 稀有度识别率 < 50%(多见于重度压缩/模糊截图):此时未读格回退边框颜色,可能误判,需人工或 LLM 核对 contact sheet。

正常流程下,脚本 + LLM 读 preview 应直接给出结果。

详细工作流程

Step 0: 脚本自动检测网格参数

脚本默认自动检测列数/行数,不再死定 7 列。当前版本列数检测用自相关(autocorrelation)周期检测(对重复网格结构比原 FFT 主频更稳健,可正确处理 7/8/9 列),并叠加**谷检测(valley)**交叉验证;行数用水平内容段检测。该游戏背包常见布局为 7 / 8 / 9 列 × 3~5 行

若检测明显错位(如 9 列误判、或疑似非网格图),再手动指定:

python assets/count_icons.py screenshot.png --cols 8 --rows 4 --contact contact.png

Step 1: 运行 count_icons.py 生成 contact sheet(首选)

python assets/count_icons.py screenshot.png \
  --contact contact.png \
  --preview preview.png \
  --json result.json

脚本会输出:

  • 原图尺寸、自动检测到的网格参数;
  • 检测到的 active / OFF cell 数量;
  • 每格 OCR 读到的稀有度文字(rarity_ocr)与边框颜色候选(rarity_border);
  • contact.png:高分辨率单格拼接图,供 LLM 读数量角标;
  • preview.png:带标注的原图放大预览,便于全局核对。

--include-sr 可把 SR 纳入汇总(仅当用户明确要求)。

Step 2: LLM 读取 contact.png

按行/列逐格观察(严格遵循规则 A~D):

  • OFF 格跳过(规则 A,暗淡不计入)。
  • 按钮/装饰跳过(规则 5,靠文字识别)。
  • 文字标签是什么?(SSR / UR / SR 等)
  • 右上角数量角标是多少?→ 有数字就按数字记(规则 B);没有角标但格子非暗淡 → 记 1(规则 C)。

把结果填入下表:

| 行/列 | 稀有度 | 数量 | 备注 | |-------|--------|------|------| | 1,1 | SSR | 5 | | | 1,2 | SSR | 2 | | | 1,3 | UR | 1 | 无角标,规则C记1 | | ... | ... | ... | |

Step 3: 汇总

SSR: 各格数量之和 = XX(不含 SR,除非用户强调)
UR:  各格数量之和 = XX
SR:  各格数量之和 = XX(默认不输出,仅用户强调时)
合计: XX 个物品
跳过: XX 格(暗淡 OFF / 按钮装饰)

Step 4: 输出

单图输出:

📊 图标数量统计结果(SSR + UR,跳过未激活/非物品)

🔍 逐格明细:...(表格)

📋 汇总:
  • SSR:X 个
  • UR:X 个
  • 合计:XX 个物品
  • 跳过:XX 格

多图输出:

📊 批量统计结果(共 N 张图)

图1:SSR X / UR X
图2:SSR X / UR X
...

📋 全部合计:SSR XX / UR XX

典型陷阱(必读)

  1. 把按钮当物品

    • "玩家专属"、"CLAM"、"通行证"、"重置抽奖" 等按钮常有彩色边框,看起来像物品格,但没有真正的数量角标,应排除。
    • 判断方法:这类格子通常有横幅文字或特殊形状,右上角没有数字角标。
  2. 把 SSR+ / 限定当 SR

    • 有些 SSR+ 或限定物品边框是紫色/金色,但文字标签明确是 SSR,应归入 SSR。
    • 永远以文字为准。
  3. 灰暗格误算

    • 未点亮格虽然带稀有度标,但颜色暗淡、角标为 0。脚本已标 OFF,LLM 直接跳过。
  4. 角标数字看错

    • 数量角标很小,contact sheet 已放大 6 倍。若仍模糊,可打开对应 tile 图进一步放大确认;实在不行再询问用户。
  5. 列数检测错误

    • 不同截图可能是 7 列或 8 列。脚本已做自相关周期检测 + 谷检测,但若遇到特殊布局(如带侧边栏、大面积空白),可能仍需手动 --cols 校正。
  6. 矮格布局(4~5 行)逐格 OCR 失效 ⚠️ v1.2.0 已修复

    • 当背包页有 4~5 行时,单格高度仅 ~50px(3 行时 ~65-70px),底部稀有度文字被压缩到极小尺寸。
    • 旧版逐格 OCR 在此场景下识别率骤降至 0%~6%,回退边框颜色判定不可靠(橙/红相近色易混淆),导致 SSR/UR 分类错误。
    • v1.2.0 修复:改用整图单次彩色 OCR + 坐标映射,识别率恢复至 61%~86%,且消除了 onnxruntime 段错误风险。
    • 若新版仍出现低识别率(<50%),LLM 读 contact sheet 时应优先以视觉看到的文字标签为准,覆盖脚本的边框颜色判定。

环境变量 / 路径约定

  • skill 根目录:~/.workbuddy/skills/icon-counter/
  • 脚本路径:~/.workbuddy/skills/icon-counter/assets/count_icons.py
  • 工作方式:进入 skill 目录或直接用绝对路径调用脚本,输出 preview 到临时目录,然后用 Read 工具读取 preview。

回退策略

如果脚本无法运行(无 Python 或缺包):

  1. 向用户说明无法使用量化脚本;
  2. 改用纯 LLM 视觉逐格清点;
  3. 此时因准确率下降,建议对结果进行抽样复核。