Icon Counter — 游戏图标数量统计
Overview
从游戏背包/仓库/图鉴截图(通常是网格排列的物品图标)中,按稀有度统计每种稀有度物品的总数量。
适用场景:
- 用户发来一张游戏背包截图,要求"数一下有多少个 SSR / UR"
- 截图中每个格子包含:物品图标 + 稀有度标签(文字或颜色)+ 右上角数量角标
- 需要逐格识别稀有度、读取数量、汇总输出
依赖
本 skill 附带一个 Python 量化脚本 assets/count_icons.py,用于切网格、判激活、判稀有度候选、生成 preview 图。
运行脚本需要:
- Python 3.x
Pillow和numpy- (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 当前版本的首选计数逻辑:
- 用
count_icons.py把截图按规则网格切分成单格 tile;- 脚本会自动检测列数/行数(自相关周期检测 + 谷检测 + 内容段分析),不再默认死定 7 列;
- 若自动检测明显错位,可手动传
--cols/--rows。
- 脚本自动判暗淡(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。
- 脚本生成一张高分辨率 contact sheet(
--contact),每格放大 6 倍并带行列号; - LLM 直接读 contact sheet,按文字标签读取稀有度、读取右上角数量角标;
- 按四规则(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
典型陷阱(必读)
-
把按钮当物品
- "玩家专属"、"CLAM"、"通行证"、"重置抽奖" 等按钮常有彩色边框,看起来像物品格,但没有真正的数量角标,应排除。
- 判断方法:这类格子通常有横幅文字或特殊形状,右上角没有数字角标。
-
把 SSR+ / 限定当 SR
- 有些 SSR+ 或限定物品边框是紫色/金色,但文字标签明确是 SSR,应归入 SSR。
- 永远以文字为准。
-
灰暗格误算
- 未点亮格虽然带稀有度标,但颜色暗淡、角标为 0。脚本已标 OFF,LLM 直接跳过。
-
角标数字看错
- 数量角标很小,contact sheet 已放大 6 倍。若仍模糊,可打开对应 tile 图进一步放大确认;实在不行再询问用户。
-
列数检测错误
- 不同截图可能是 7 列或 8 列。脚本已做自相关周期检测 + 谷检测,但若遇到特殊布局(如带侧边栏、大面积空白),可能仍需手动
--cols校正。
- 不同截图可能是 7 列或 8 列。脚本已做自相关周期检测 + 谷检测,但若遇到特殊布局(如带侧边栏、大面积空白),可能仍需手动
-
矮格布局(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 或缺包):
- 向用户说明无法使用量化脚本;
- 改用纯 LLM 视觉逐格清点;
- 此时因准确率下降,建议对结果进行抽样复核。
微信扫一扫