OKLab 色彩空间:291 色拼豆的数学解法
问题
把图片转成拼豆图纸,核心是找最接近的豆色。直觉做法是 RGB 空间里算欧氏距离——但效果很烂。
为什么 RGB 不行
RGB 不是感知均匀空间:相邻数值的颜色差异,人眼感知不均匀。绿色系微小的 RGB 差人眼很敏感,而红色系差 10 个数值都看不出区别。
解法:OKLab
OKLab 是感知均匀的色彩空间:数值距离 ≈ 人眼感知差异。
流程:
- 图片像素 sRGB → OKLab
- 用 KD-Tree(k 维树)加速最近邻搜索,291 色查找从 O(n) 变 O(log n)
- 5 种抖动策略(Floyd-Steinberg 误差扩散等)处理色阶断层,还原渐变层次
效果
- 双引擎:bead-grid-studio(221 色)+ pixel-to-beads(MARD 291 色)合并
- 渐变、肤色、天空等区域层次感大幅提升
启示
“简单可行”的算法方案,在真实产品里往往不够——感知质量比数值正确更重要。