Excel拼豆图 · 拼豆像素图纸 → Excel 施工图
把一张拼豆像素图纸翻译成「一张 Excel 表 = 一份可施工的底稿」:
- 一个单元格 = 一个像素 = 一颗豆子
- 单元格底色 = 该像素的颜色,格内文字 = 色号(或统一标记)
- 原图的相对位置与整体图案一比一保留,不做缩放、不做重排
最后逐格回读校验,确保每个坐标上的颜色与图纸完全一致。
第 0 步(必做):先确认像素密度档位
动手前先问用户要哪一档。 密度决定网格尺寸、纯色数上限和全部量化参数,
选错后面全是白工 —— 这是本技能最优先的交互环节。
| 档位 | 格数 | 纯色上限 | 每色均摊 | 拼豆板 | 定位 |
|---|---|---|---|---|---|
| 25×25 | 625 | ≤ 5 色 | 125 格 | 1 块 | 极简:剪影、图标、萌系小图,新手首选 |
| 52×52 | 2704 | ≤ 8 色 | 338 格 | 4 块 | 标准:多数插画、像素角色、Q 版人物(默认) |
| 78×78 | 6084 | ≤ 14 色 | 435 格 | 9 块 | 精细:带五官光影的角色 |
| 104×104 | 10816 | ≤ 24 色 | 451 格 | 16 块 | 高精:照片、复杂场景,成本最高 |
反问话术、按图特征给建议的对照表、成本提醒话术 —— 见
references/density-guide.md §5。核心一句:
> 格数按平方增长:104×104 是 52×52 的 4 倍格子、4 倍豆子、约 4 倍摆豆时间。
选好档位后,一条 --density 就把尺寸、色数上限、量化参数、单元格尺寸全部锁定:
python scripts/bead.py image --image 图纸.png --density 52 -o 拼豆图纸.xlsx
纯色上限是硬约束:给了 --density 25,输出就不会超过 5 色 —— 超出的颜色走
层次合并(每次并掉代价最小的一对)压到上限,不是简单丢弃。
技能速览
| 项 | 内容 |
|---|---|
| 技能名称 | Excel拼豆图(技术名 perler-bead-excel;拼豆像素图纸 → Excel 施工图) |
| 输入 | ① 图纸图片:PNG / JPG / 截图 / PDF 导出的位图<br>② 插画/照片/AI 生成图(无规则网格,走颜色量化路线)<br>③ 坐标数据:CSV、Excel、grid.json<br>④ 符号图解:聊天里贴的字符图文本<br>⑤ 色板(可选):palette.json —— 不给则自动归纳颜色 |
| 输出 | 一个 .xlsx 工作簿(4 张表,见下)+ 中间产物(grid.json / 网格 CSV / 还原预览图 / 网格标注图 / 校验报告 / 差异图)<br>插画路线还会产出:纯色量化图 PNG + 颜色清单报告 + 原图/量化并排对比图 |
| 触发方式 | 提到「拼豆 / 豆豆图 / 拼豆图纸 / 拼豆配色表 / 25×25 / 52×52 / 78×78 / 104×104 图纸 / 像素密度 / 还原度不够 / 像素图转 Excel / 插画转拼豆 / 色号图 / 备料清单 / perler bead pattern / Hama pattern」,或直接给出一张方格图纸要求还原成表格 |
| 一句话用法 | python scripts/bead.py image --image 图纸.png --density 52 -o 拼豆图纸.xlsx |
| 第一件事 | 反问用户选哪档密度(见「第 0 步」)。拿不准就给 52×52 |
环境准备
依赖这几个库。优先使用受管虚拟环境(该环境已内置下列版本,无需安装):
~/.workbuddy/binaries/python/envs/default/Scripts/python.exe # Windows
~/.workbuddy/binaries/python/envs/default/bin/python # macOS / Linux
→ pillow 12.3.0 / numpy 2.5.1 / openpyxl 3.1.5 / opencv-python 5.0.0
opencv-python 只在「插画颜色量化」的连通域过滤环节用到(清除碎块、水印)。
缺了不会报错,脚本会自动跳过那一步 —— 只是杂色会多留一些。
仅在受管环境缺库时才安装,且固定版本(避免拉到被投毒的最新版):
python -c "import PIL, numpy, openpyxl; print('ok')" \
|| python -m pip install "pillow==12.3.0" "numpy==2.5.1" "openpyxl==3.1.5"
脚本内部已处理 Windows 控制台的 UTF-8 输出问题,无需额外设置 PYTHONIOENCODING。
三个核心概念
| 概念 | 是什么 | 在哪 |
|---|---|---|
| 颜色定义(色板) | 色号 ↔ 颜色 ↔ 符号 的映射表,唯一权威来源 | palette.json |
| 网格(图纸数据) | 行优先二维数组,每格是 #RRGGBB 或 null(空位) |
grid.json / .csv |
| 坐标约定 | 原点左上角,行自上而下、列自左而右,均从 1 开始 | R{行}C{列},对应 Excel 的 B2 起点 |
色号的两种来源
- 用户提供(首选):图纸图例、用户手上的豆子色卡、用户明确给出的清单。
跨品牌色号不通用,不得凭记忆编造品牌色号。 - 自动归纳(图纸不带色号时):由
make_palette.py from-image按用量从多到少
编号P01、P02…… 这是「第 N 种颜色」的意思,不是任何品牌的真实色号,
换色时按 HEX 一比一对应即可。
先分清:图纸是「工程网格」还是「插画」
这一步决定了走哪条路,判断错了后面全错:
| 工程级拼豆图纸 | 拼豆风格插画 / 照片 | |
|---|---|---|
| 长什么样 | 平涂色块 + 清晰格线,格内可带色号 | 豆子是带高光的圆形颗粒,排列有抖动,无格线 |
| 典型来源 | 拼豆图纸站、Hama/Perler 官方图、手工绘制 | AI 生成图、手绘稿、实物照片 |
probe 结果 |
峰值命中率 ≥ 90%,纵横格宽一致 | 命中率 40–51%,格宽纵横不一致 ← 识别标志 |
| 怎么处理 | 直接走下面的标准流程 | 先做颜色量化,再像素化(见下节) |
不要对插画硬走网格还原:它没有规则网格,拟合出来的行列数是假的。
插画 / 照片:颜色量化 → 像素化
第一步:量化成 ≤K 种纯色
推荐:一条 --density 让所有量化参数随档位自动匹配(色数、滤波核、面积权重、碎块阈值):
python scripts/quantize_image.py --image 插画.jpg --density 52 \
-o 量化图.png --palette-out palette.json --report 颜色报告.md --side-by-side 对比.png
它等价于下面这组手调参数(这就是「52×52 / ≤8 色」的实际含义):
python scripts/quantize_image.py --image 插画.jpg -k 12 --max-colors 8 \
--median 9 --denoise-radius 2 --merge-de 5.0 --area-weight 0.25 \
--min-region-ratio 0.000185 \
-o 量化图.png --palette-out palette.json --report 颜色报告.md --side-by-side 对比.png
手调各参数的含义见下方参数表;密度档位下的推荐值随档位变化,
所以除非有明确理由,优先用 --density,别抄上面这组数字去做 104 档。
输出的 量化图.png 是纯色填充的(无渐变、无半透明),palette.json 里的
P01、P02… 可直接喂给 grid_to_excel.py。
| 参数 | 作用 | 典型值 |
|---|---|---|
-k |
K-means 初始簇数。建议略大于目标色数,先过分割再归并 | 目标 + 1~4 |
--max-colors |
最终纯色数硬上限,超出时反复合并代价最小的一对 | 需求值 |
--merge-de |
阈值式近色合并(CIEDE2000),调大 → 色数更少 | 3–6 |
--area-weight |
面积加权:越大越倾向于保住大面积色块、牺牲零星杂色 | 0.25 |
--median |
中值滤波核,去豆子高光/网点。豆子越大取值越大 | 7–13 |
--denoise-radius |
众数滤波窗口半径。出现芝麻点噪点时调到 2–3 | 1–3 |
--min-region-ratio |
连通域过滤阈值。⚠️ 必须小于要保留的最小细节 | 0.00005–0.00008 |
--mask x,y,w,h |
显式清除水印/角标区域,用周围颜色补齐 | 按图量 |
三个必须踩过的坑(都实测过):
-
色数不是越少越好,
-k也不是直接给目标值。 直接-k 8时,K-means 会把
「两个黑」各占一个簇,挤出米白上衣;而-k 9 --max-colors 8先过分割再按面积归并,
米白才能独立成色。过分割 + 面积加权归并 > 直接 K 色。 -
--min-region-ratio要跟目标密度挂钩,而不是取一个固定值。 眼高光只有约 78px²,
阈值给到 128px² 眼珠就变成纯黑。老版本固定用 0.00006(92 万像素图约 51px²),
但同一个数在 104 档太松(放过噪点)、在 25 档太严(留不住该留的色块)。
现在按0.5 / n²(半格面积)推导:小于半格的内容在输出网格里根本无法被表达,
压掉它属于降噪而非丢信息。--min-region-passes仍别调大,多轮会逐轮啃掉
夹在大色块间的小细节。 -
水印和眼睛高光面积相同,纯按面积分不开。 水印必须用
--mask显式圈定。
> 实现上还有一条:合并后的标签重映射必须在 Lab 空间做。用 RGB 欧氏距离会把
> 浅灰 (#E6E4E5) 错配到肤色 (#F8D3B9) 这类「色相不同、RGB 距离更近」的颜色上,
> 导致连帽衫被染成肉色。
第二步:像素化成 n×n 网格
量化图是纯色块、没有格线,probe 依然探测不到网格,所以要手工钉死均匀网格:
# --uniform = 强制均匀网格,跳过格线探测。量化图没有格线,必须加这个
python scripts/pattern_to_grid.py image --image 量化图.png --palette palette.json \
--density 52 --uniform -o grid.json --csv grid.csv --preview preview.png
⚠️ 这里的 --uniform 不是可选项。 量化图是平铺色块,没有格线,
探测器会把色块边界误判成网格线,然后用这些「假格线」的中位距推出完全错误的格子尺寸。
实测:25×25 的量化图被推成 11.22px 格宽,平均 ΔE 冲到 33.94、550/625 格被标为不确定。
加上 --uniform 后 ΔE = 0.0。
同一条判据也已内建为兜底:探测格数与指定值偏差超过 max(2, 指定的 25%) 时,
自动判定探测不可信并改用均匀网格(会打印警告说明)。但仍建议显式写 --uniform。
需要精确控制采样起点时(图纸有留白/边距),手工给定更稳:
# pitch = 图片宽(或高) ÷ n,起始固定在 0,0
python scripts/pattern_to_grid.py image --image 量化图.png --palette palette.json \
--rows 52 --cols 52 --x0 0 --y0 0 --pitch 17.73 --pitch-y 17.73 \
-o grid.json --csv grid.csv --preview preview.png
如果原图的豆子排列本身就是规则的,一格 = 原图一个豆子是最忠实的粒度
(用原图豆子间距反推 n)。此时采样 ΔE 会是 0.0。
第三步:照常出 Excel
python scripts/bead.py grid --grid grid.json --palette palette.json --density 52 \
-o 拼豆图纸.xlsx --pack-size 1000
固定品牌色板适配低密度档位(手上一盒 24 色,却要做 25×25 的 ≤5 色)——
在网格层按用量+色差归并,代表色取原色号,不凭空造色:
python scripts/pattern_to_grid.py resize --grid grid.json --size 25 \
--palette 色板.json --max-colors 5 -o grid25.json --report 重采样报告.md
密度档位:--density
| 参数 | 作用 |
|---|---|
--density 25 / 52x52 / 78 / 104x104 |
推荐。一次锁定网格尺寸 + 纯色上限 + 量化参数 + 单元格尺寸 |
--size N |
只锁尺寸,不锁色数(老用法,仍可用) |
--cell-size |
单元格像素,不给则随档位自动(25→30 / 52→24 / 78→18 / 104→14) |
--max-colors |
纯色数硬上限,不给则取档位值;走层次合并而非截断 |
--merge-de |
近色合并阈值 ΔE,不给则随档位(25→8.0 … 104→3.5) |
--density 会做三件事:识别阶段按 N×N 采样 → 渲染阶段校验确是 N×N(不符即报错退出)
→ 校验阶段再核对一次。完整联动表与设计依据见 references/density-guide.md。
工程网格图纸换密度:不要直接改 --density,而要告诉它原图本身是多少格:
# 原图 48×48,想输出 104×104
python scripts/bead.py image --image 图纸.png --native-size 48 --density 104 -o 拼豆图纸.xlsx
它先按 48×48 无损提取,再在网格层重采样到 104×104。直接按 104 去像素层硬采会整体错位,
而且 ΔE 仍是 0.0,从数值上根本看不出问题。
⚠️ 想提升还原度就重新走量化,别放大已有网格。 把 52×52 的网格 resize 到 104×104,
得到的是「格子数 ×4、信息量不变」——每格拆成 4 格、颜色原封不动,摆豆时间涨 4 倍而清晰度不变。
正确做法是回原图重跑:quantize_image.py --image 原图.jpg --density 104。
(升采样只用于适配更大规格的拼豆板,见 references/density-guide.md §4。)
拼豆板换算:按 29×29 方板算,需要 ceil(N/29)² 块 —— 25→1 块、52→4 块、78→9 块、104→16 块。
Excel 里每 29 格画一条粗分界线,就是「换板位置」的标记(--board 可改,--board 0 关闭)。
两类输入:带色号 / 不带色号
A. 图纸带色号 —— 提供色板(首选,结果最可信)
python scripts/bead.py image --image 图纸.png --palette 色板.json --density 52 -o 拼豆图纸.xlsx
⚠️ 带色板时颜色数由色板决定,档位管不住。色板色数超过档位上限时会主动提醒并给出精简命令;
跨品牌色号不通用,不会替你改写色号。
B. 图纸不带色号 —— 不提供 --palette,自动归纳颜色
python scripts/bead.py image --image 图纸.png --density 52 -o 拼豆图纸.xlsx
流程会自动多走一步:先按原色提取网格 → 按色差(CIEDE2000)把近似色聚成一类 →
按用量从多到少编号 P01、P02…… → 用这套自动色号重映射一遍。
调参:
| 参数 | 作用 |
|---|---|
--merge-de 2.0 |
近色合并阈值 ΔE。调大 = 合并更激进 = 色号更少;调小则保留更多近似色。给了 --density 时随档位取值(25→8.0 … 104→3.5),显式值优先 |
--max-colors 12 |
最多保留几种颜色。给了 --density 时自动取档位上限(25→5 … 104→24),显式值优先。超出上限时按层次合并压到上限,不是丢弃 |
--palette-prefix P |
自动色号前缀,默认 P |
两种填充方式的取舍(渲染层决定):
| 需求 | 用法 |
|---|---|
| 按颜色填充 + 格内写色号(默认,最常用) | --show-label code |
| 按颜色填充 + 格内显示 HEX(没有色板时) | 不提供 --palette,默认回退到 HEX |
| 按颜色填充 + 统一标记(不区分色号,只看哪儿要放豆) | --show-label mark --mark-char ● |
| 只要纯色块,格内不写字 | --show-label none |
输出:4 张工作表
| 工作表 | 定位 | 内容 |
|---|---|---|
| 图纸 | 施工底稿 | 一个格 = 一颗豆,底色 = 豆色,格内 = 色号;带行列坐标尺与拼豆板分界线 |
| 色号图 | 查号速查图 | 同构网格,格内只写色号;右侧附色号图例栏(序号/色号/色名/色块/数量/占比)。--codemap-bg white 切成白底黑字,黑白打印更省墨 |
| 材料清单 | 备料用 | 序号 / 色号 / 色名 / HEX / 色块 / 数量 / 占比 / 建议备豆量 / 备注,末行合计 |
| 制作指引 | 交付摘要 | 尺寸、总豆数、用板数、色板来源、识别置信度(平均/最大 ΔE、待确认格数) |
材料清单怎么算
- 数量:该色号在图纸中占多少格 = 要多少颗豆
- 占比:
数量 / 总豆数 - 建议备豆量:
ceil(数量 × (1 + 损耗率)),损耗率由--loss-rate控制,默认 0.05(+5%) - 给
--pack-size 500时,备注列会额外换算成「约 N 包(按 500 颗/包)」
坐标映射
数据区从 B2 起(--no-axis 时从 A1 起)。A 列为行号、第 1 行为列号,
与 R{n}C{m} 一一对应,方便按行摆豆。冻结窗格在 B2,滚动时坐标尺常驻。
一条命令跑完(推荐)
python scripts/bead.py image --image 图纸.png --palette 色板.json --density 52 \
-o 拼豆图纸.xlsx
它会依次执行「解析图纸 → 生成 Excel → 逐格校验」,校验不通过退出码为 1,
并在 bead_work/ 留下 grid.json、网格 CSV、还原预览图、网格标注图、校验报告与差异图。
(走 --native-size 时还会多一份重采样报告,含格一致率分布。)
其他入口:bead.py text(符号图纸文本)、bead.py grid(已有 grid.json 只做渲染)、
bead.py density(查档位表)。
分步执行(需要微调时)
# ① 建色板(四选一)
python scripts/make_palette.py starter -o palette.json # 通用示意色板快速起步
python scripts/make_palette.py add --palette palette.json \
--entries "H01|白色|#FFFFFF|O;H02|黑色|#1A1A1A|X" # 手工录入
python scripts/make_palette.py from-pixels --image 图纸.png \
--boxes "40,600,20,20;80,600,20,20" --codes "H01,H02" -o palette.json # 从图例色块采样
python scripts/make_palette.py from-image --grid grid.json --density 52 \
-o palette.json --report 色号归纳报告.md # 不带色号:自动归纳编号 + 档位色数上限
# ② 先探测几何,确认行列数对不对(强烈建议)
python scripts/pattern_to_grid.py probe --image 图纸.png --overlay probe.png
# ③ 提取网格(插画/量化图务必加 --uniform;工程图按原网格数提取)
python scripts/pattern_to_grid.py image --image 图纸.png --palette palette.json \
--density 52 --uniform -o grid.json --csv grid.csv --preview preview.png
# ③b 已有网格要换密度 → 网格层重采样(工程图切换档位走这条)
python scripts/pattern_to_grid.py resize --grid grid.json --size 78 \
--palette palette.json --max-colors 14 \
-o grid78.json --report 重采样报告.md --preview preview78.png
# ④ 渲染 Excel
python scripts/grid_to_excel.py --grid grid.json --palette palette.json \
-o 拼豆图纸.xlsx --cell-size 24 --show-label code --board 29 --size 52
# ⑤ 逐格校验(必做)
python scripts/verify_excel.py --excel 拼豆图纸.xlsx --grid grid.json \
--palette palette.json --report 校验报告.md --diff-image 差异图.png --size 52
脚本清单
| 脚本 | 职责 | 关键参数 |
|---|---|---|
scripts/density.py |
像素密度档位的单一权威定义:尺寸 ↔ 纯色上限 ↔ 量化参数 的联动表 | list show -d 78 resolve -d 52 |
scripts/bead.py |
全流程编排,跑完自动校验 | image / text / grid / density 四种入口;--density --native-size |
scripts/make_palette.py |
色板构建、采样、自动归纳编号、去重、体检 | starter add pick from-pixels from-image nearest dedupe report;--density --area-weight |
scripts/pattern_to_grid.py |
图纸 → 网格(图像 / 文本 / CSV),以及网格 → 另一种密度 | probe image text csv resize;--density --uniform --max-colors |
scripts/quantize_image.py |
任意插画/照片 → ≤K 种纯色(图纸不是工程网格时用) | --density -k --max-colors --merge-de --area-weight --median --denoise-radius --min-region-ratio --mask |
scripts/grid_to_excel.py |
网格 → Excel(四张表) | --cell-size --show-label --mark-char --board --size --codemap-bg --loss-rate --pack-size --no-axis |
scripts/verify_excel.py |
回读 Excel 逐格比对 | --report --diff-image --codemap-bg --size --show-all |
scripts/bead_common.py |
公共库:颜色空间、色板、网格、CIEDE2000、颜色聚类 | 不直接调用 |
识别几何参数(probe / image 通用):
--density、--uniform(无格线的插画/量化图必加)、
--crop x,y,w,h、--rotate 90/180/270、--flip h/v/both、--rows、--cols、
--x0、--y0、--pitch、--pitch-y、--square、
--method auto/lines/edges、--dark、--chroma、--min-pitch、--max-pitch、
--inset、--bin、--max-de、--metric、--drop-bg。
质量门禁(不可跳过)
门禁一:verify_excel.py 退出码必须为 0
它做五件事:
- 数据区行列数 = 网格行列数(给了
--size时同时核对尺寸) - 每个单元格的实际底色 = 该坐标应有的颜色(精确相等)
- 格内色号文字与底色一致
- 「材料清单」数量与网格统计一致(旧版「色号统计」同样识别)
- 「色号图」逐格核对:底色与格内色号都对得上
不通过时输出 差异图.png:全灰代表完全一致,品红框标出的就是出错的格子。
门禁二:识别准确度要看图,不能只看 ΔE
这是最容易踩的坑:verify_excel 只证明「Excel 忠实还原了网格」,不证明「网格识别对了」。
整体错位时,每个采样点仍然落在某个真实豆色上,ΔE 会低到 0.0、uncertain 也是 0,
但图案已经错了几十格。实测一张带图例的图纸:错位 230 格(8.5%),平均 ΔE 仍是 0.0。
所以开工前必须把这两个中间产物和原图并排比对:
| 产物 | 看什么 |
|---|---|
还原预览图.png |
从识别结果反向画出的图。和原图纸并排看,一眼能看出整体错位、颜色翻转 |
网格标注图.png |
蓝线应压在格线上、红十字应落在格心。偏离即几何没对齐 |
另外要如实汇报:平均/最大 ΔE、uncertain 格数、以及识别阶段的全部 warning
(bead.py 会在结尾把它们重新打出来,因为它们不会被一致性校验覆盖)。
门禁三:密度不足要被量化,而不是靠感觉
还原度不够时,用户最需要的是「换哪一档」而不是一句「效果就这样了」。三个可查的指标:
| 指标 | 来源 | 判据 |
|---|---|---|
| 严重混合格占比 | resize 的重采样报告 |
< 60% 一致率的格超过 12% → 主动建议换更密档位 |
| 颜色损失 | 同上,「颜色数 X → Y」 | 降采样后颜色数掉到 60% 以下 → 提示零星色块已被邻色吸收 |
| 量化图色数 vs 档位上限 | quantize_image.py 输出 |
应 ≤ 上限;若撞上限说明该档颜色的确不够用 |
这三项都只是「参考信号」,最终仍以还原预览图/网格标注图与原图并排比对为准(门禁二)。
常见问题速查
| 症状 | 处理 |
|---|---|
| 探测不出网格 | --crop 圈定图纸区域;仍不行用 --rows/--cols/--x0/--y0/--pitch 手工给定 |
| 多出/少掉一整行(图例、水印、外框被算进去) | 给 --size N 后会自动按探测峰值中位距重排,并在 warning 里说明;请用网格标注图确认首格位置。若整体偏移,用 --x0/--y0/--pitch 手工钉死 |
| 上下/左右颠倒 | --flip v / --flip h;图纸本身要转就 --rotate |
| 采样取到格内文字 | --inset 调到 0.35–0.40 |
| 大量格子 ΔE 偏高 | 多半是色板缺色,补齐重跑;不要先放宽 --max-de |
| 图纸是照片、颜色脏 | --bin 24~32,--max-de 8~10,并靠色板最近色兜底 |
| 图纸是黑白符号图 | 走 pattern_to_grid.py text,用符号查色板,不要走图像识别 |
| 自动归纳出来色号太多 | 调大 --merge-de(如 3–5);或 --max-colors 12 限制上限 |
| 自动归纳把该区分的色合并了 | 调小 --merge-de(如 1.0),并检查 色号归纳报告.md 里的合并明细 |
| 想省墨打印色号图 | --codemap-bg white |
| 不想买整包豆子 | --loss-rate 0(不要损耗余量);--pack-size 留 0 则不换算包数 |
| 图纸带水印(截图/小红书) | 见 references/image-detection.md §6:文字掩膜几何筛选 + 连通块过滤 + 图例数量容量约束,三步缺一不可 |
| 插画量化后满是芝麻点 | --denoise-radius 调到 2–3(3×3 窗口小于斑点直径,治不了) |
| 量化后眼睛没了高光 | --min-region-ratio 调小到 0.00006 以下;--min-region-passes 保持 1 |
| 量化后连帽衫被染成肉色 | 合并后重映射用了 RGB 距离的旧版行为,已在脚本内改为 Lab 空间;确认用的是最新脚本 |
| 量化后该区分的色被合并了 | 调小 --merge-de;或调大 -k 让它先独立成簇再交给面积加权归并 |
| 量化后色数压不到目标 | --area-weight 保持 0.25,--max-colors 设目标值(这是硬上限,会一直合到满足) |
| 用户说「还原度不够 / 太糊」 | 别急着调参数:先看「严重混合格占比」和「颜色损失」两个量化指标(门禁三),再按 references/density-guide.md §5 建议上浮一档密度。多数情况是密度不够,不是参数错 |
| 量化图网格整体错位,ΔE 却极低 | 漏了 --uniform:色块边界被当成格线。实测 ΔE 33.94 → 加 --uniform 后 0.0 |
| 工程图纸换档位后整体错位 | 用 --native-size 原格数(先无损提取、再网格层重采样),不要直接把 --density 改掉 |
| 色数没降到档位上限 | 走的是自带色板路线(色数由色板定);用 resize --grid g.json --size N --palette 色板.json --max-colors M 在网格层强制归并 |
| 档位上限砍掉了想要的颜色 | 这是硬约束,故意的:颜色挤在少量格子里只会变成花点。换更密档位解决 |
| 量化结果里出现「0 颗」的颜色 | 已修:合并后未被任何像素命中的代表色会自动剔除 |
交叉校验(强烈建议)
图纸图例通常会标注每个色号的数量,且合计等于「所需豆子数量」。
把这个数量当作容量约束做全局最小色差分配,可以自动修复水印/偏色造成的误判,
并让结果与图例完全自洽 —— 这是比 ΔE 阈值更硬的校验。
分配完成后,按 ΔE 从大到小排序人工复核前 30 格,再跑 verify_excel.py 收尾。
参考文件
| 文件 | 内容 |
|---|---|
references/density-guide.md |
像素密度档位:四档总表、色数上限的设计依据、参数联动规则、换档位的两条路径、对话反问话术、密度不足的量化判据 |
references/workflow.md |
完整流程、决策点、失败降级、交付话术 |
references/data-formats.md |
色板 / 网格 / CSV / 符号文本 / Excel 结构 / 自动色号规范 |
references/image-detection.md |
网格探测与颜色采样算法、调参速查、能力边界 |
references/bead-basics.md |
豆子规格、拼豆板换算、Excel 各元素的施工含义 |
assets/palette-template.json |
色板模板 |
assets/symbol-pattern-example.txt |
符号图纸示例 |