从图片里提取出来的主色,为什么和肉眼感觉不一样?

4 个讲解板块 · 关联 3 款站内工具 · 内容最后核对 2026-10-09

同一张图不同工具给出不同主色,差别不在图,而在算法、色彩空间和后处理这三处。

直接答案

先说清楚一件事:同一张图给出不同的主色,两个工具都没有算错。它们回答的其实是不同的问题——有的在回答「哪种颜色占的像素最多」,有的在回答「哪种颜色最显眼」,有的在回答「这张图的整体色调是什么」。这三个答案本来就不一样,而界面上往往都写着「主色」两个字。

决定答案的变量有三个。第一是算法:流行的是 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。若发现错误,欢迎通过页脚反馈入口告知。