从图片里提取出来的主色,为什么和肉眼感觉不一样?
同一张图不同工具给出不同主色,差别不在图,而在算法、色彩空间和后处理这三处。
先说清楚一件事:同一张图给出不同的主色,两个工具都没有算错。它们回答的其实是不同的问题——有的在回答「哪种颜色占的像素最多」,有的在回答「哪种颜色最显眼」,有的在回答「这张图的整体色调是什么」。这三个答案本来就不一样,而界面上往往都写着「主色」两个字。
决定答案的变量有三个。第一是算法:流行的是 k-means 聚类和中位切分两种,前者追求误差最小、后者追求覆盖均匀,同一张图它们会给出不同结果。第二是色彩空间:在 RGB 里算距离和在 Lab 里算距离,得到的簇不一样,因为 RGB 的数值距离不代表人眼的感知距离。第三是后处理:要不要合并相近的颜色、要不要把接近灰和接近黑白的那几簇滤掉。
把一张照片的所有像素按颜色数一遍,往往会得到几万种颜色,而设计上能用的通常只有五六个。提取主色的过程,本质就是把这几万种颜色压缩成几簇,这个动作叫色彩量化。压缩规则由算法决定,而算法不同,压出来的「代表色」自然不同。
更隐蔽的一层是色彩空间。我们存图片用 sRGB,但人眼看颜色并不按 sRGB 的数值刻度来——对绿色的分辨力高得多,对深蓝几乎不敏感。所以同一个算法放到 RGB 里跑和放到 Lab 里跑,会得出「数值上等距、看起来不等距」和「看起来等距」两种结果。
1同一张图为什么能给出不同答案
把三个变量拆开看,就能对上工具之间的差异。
| 变量 | 可选做法 | 对结果的影响 |
|---|---|---|
| 算法 | k-means 聚类 / 中位切分 / 八叉树量化 | 决定是「误差最小」还是「分布最均匀」 |
| 色彩空间 | 在 sRGB 里算 / 在 CIELAB、OKLab 里算 | 决定簇的边界是否符合人眼感知 |
| 后处理 | 合并近似色 / 过滤近灰与近黑白 | 决定会不会返回一堆用不上的背景色 |
大面积的纯色背景是最大的干扰源。白棚拍摄或灰色幕布的照片,工具几乎一定会把背景当成第一主色——先裁掉,或者事后手工剔掉那一格。
2两大算法各管什么
三族主流算法在速度、保真度和确定性上各有取舍。
| 算法 | 怎么做的 | 特点 |
|---|---|---|
| 中位切分 | 把颜色装进一个盒子,沿最长的轴在中位数处切开,反复切到目标簇数 | 确定性、速度快,是初代 GIF 编码器用的算法;小面积但很扎眼的颜色可能被压掉 |
| k-means 聚类 | 把像素分配到最近的簇心,重算簇心,反复迭代 | 保真度最高,但依赖初始值、结果不确定,通常要配合更聪明的初始化 |
| 八叉树量化 | 把颜色插进八叉树,超量时合并最稀疏的节点 | 单遍完成、内存占用可控,适合大图与实时场景,质量略低于聚类 |
想要「最能代表这张照片」的色板用 k-means,想要「快速预览一下大概有什么颜色」用中位切分。两者都用降采样后的缩略图跑,结果和全图几乎一样,成本却低两个数量级。
3关键在色彩空间:RGB 不是感知均匀的
这是工具之间差异最大、也最容易被忽略的一环。
- RGB 里的等距不是看起来的等距
- 同样相距 40 个数值,亮绿和暗绿的差异看起来天差地别,而两种深蓝的差异几乎看不出来。所以按 RGB 距离合并颜色,会出现「该合并的没合并、不该合并的合了」。
- Lab 系是为了「距离等于感知差异」而设计的
- CIELAB 的欧氏距离近似等于人眼感知差异;更新的 OKLab 修正了 CIELAB 在饱和色上的色相偏移,也是现代 CSS 色彩函数的基础。把聚类放进这两个空间,簇的边界会干净很多。
- 判断两个颜色能不能合并,看色差
- 色差小于 1 基本无法分辨,可以放心合并;1 到 2 要凑近看才看得出;2 到 3.5 属于多数场景可以接受的品牌容差;超过 3.5 就应该保持区分。现行标准的色差公式会分别加权明度、彩度和色相,比简单的数值相减准得多。
一句话记法:存颜色用 sRGB,算颜色差异用 Lab。工具如果不做这步转换,它的主色在深色和低饱和区域上会明显偏。
4平均色为什么看着比预想的暗
纯频率和纯算术平均都有各自的偏差,这解释了很多「不对」的直觉。
- 算术平均不等于视觉中间
- 一半纯黑加一半纯白,算术平均是 128 号灰,但它在感知上只相当于两成出头的亮度——所以取平均色得到的色板总是偏暗、发灰。
- 纯频率会输给背景
- 直接数像素取最多的几色,结果通常是一片米色和灰色,也就是「这张照片的平均值」,而不是设计师会选的颜色。
- 引入「醒目度」能救回来
- 按彩度和亮度给簇打分,剔除极亮、极暗和低彩度的簇,就能从任意一张封面里取出可用的强调色——这也是很多系统自动取色的通用做法。
- 渐变图要多留意
- 平滑渐变里并不存在真正的色簇,算法只能被迫在任意位置切分,此时主色的稳定性最差。
顺着这个问题往下用
全部工具总览 →相关疑问
为什么工具给出的主色里有好几个我根本看不到的颜色?
因为那些颜色在数值上确实占了相当大的像素比例,只是它们互相接近、人眼把它们归成了一类。也可能是平均导致的:一块区域里深浅不同的蓝被合并成了一个中间色,而这个中间色在原图里并不存在。把色彩空间换成感知均匀的空间,或者减少目标颜色数,这种情况会明显减少。
从 logo 里提取主色,为什么和品牌手册上的色值差一截?
两个原因。一是图片有压缩和抗锯齿,边缘会混入背景色,纯色区域被稀释;二是工具做了量化,把接近的色合并后取均值。要拿准确的品牌色,应该放大后取大面积纯色区域的中心像素,而不是让工具跑聚类。
提取出来的色板可以直接拿来做设计吗?
可以直接用作起点,但不要直接用。提取结果只有「这张图里有什么」,没有「这些颜色放在一起好不好用」。实际做设计时要补两件事:核对文字与背景的对比度是否达标,以及把单一颜色扩展成一整条从浅到深的色阶,否则按钮、边框、正文会没有合适的深浅可用。
要提取几个颜色比较合适?
五到八是多数场景的甜点区。太少会把不同区域的颜色糊成一个,太多则开始互相重复、听起来很吵。做数据可视化时还要额外确认:分类色之间的色差要足够大,否则相邻的类别在图上会分不清。
继续看:相关问题与资料
全部问题解答 →内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-09。若发现错误,欢迎通过页脚反馈入口告知。
速查在线工具箱