如何从一张图片中提取真正"像被人挑过"的配色

查看原文 HN 讨论

文章摘要

设计师 / 工程师 Amanda Hinton 用一篇长博客记录了她为自己的工具 Spectrimage 从零打磨”图片→五色配色”算法的全过程。这是一篇典型的”工程师写设计、设计师写工程”的复盘文:每一次迭代都同时回答了”为什么算法的输出看起来不对”和”应该如何修正”。最终目标是得到一个 同一张图片每次产出相同 5 种颜色,并且像人类挑选过 的配色。

色彩空间的选择:作者最初使用 RGB / HSL,很快发现这两个空间在感知上严重非线性——HSL 中等饱和度的红和等饱和度的蓝在人眼看来差距巨大;用 saturation 做阈值会得到”看起来很灰但被算法当成有色”的样本。她转而使用 Oklab/OKLCH——一个 2020 年由 Björn Ottosson 提出的近似感知均匀的色彩空间。OKLCH 中 C(chroma)真正等于”距离无彩色轴的距离”,可以可靠地区分”灰”和”色”,这是后续所有改进的基础。

第一版(弃用):基于 RGB 的 median-cut 量化(GIF 编码经典算法),叠加大量硬编码规则(”如果某色太接近灰则丢弃”“如果两色太近则合并”)。代码越写越复杂,维护性崩溃。

第二版:引入 K-means++ 聚类,K = 14(多次基准测试得出的最佳值),从最多 9 万个采样像素中初始化。聚类初始种子使用图像规范化哈希,保证同一张图永远输出相同结果(这一点对设计工具至关重要——你不能让用户每次刷新得到不同的”品牌色”)。聚类之后用 0.07 的合并阈值,把感知上几乎相同的两个簇合二为一。

第三版:解决”两种红色被算成两种颜色”的问题——在 Oklab 距离里把色相/彩度平面(chromatic plane)的权重设为亮度轴的 2 倍。这样亮度差不再被等同于色相差,使算法更接近人类”两种颜色”的判断。

第四版(最终):三项关键结构改进:

输出 5 个色块按色相排序、灰色置后,并允许用户在 Spectrimage 应用中手动微调——作者承认任何算法都无法替代人类最后的拣选。

文章的可贵之处在于,它把”调色板提取”这个看似简单的任务,变成了一节关于色彩科学、聚类算法、感知均匀性、再现性工程与人机协作的综合课程,对所有自己写过设计辅助工具的开发者都有直接启发。

HN 评论精华