Python 批量识别图片主色调 提取颜色值教程
用 Pillow + 简单聚类批量提取每张图片的主色、平均色,输出十六进制色值到 CSV,适合做配色板、商品分类、素材库索引。
场景痛点
素材库几万张图,要按主色分类归档:红色系一组、蓝色系一组、绿色系一组,靠肉眼分要看到眼花。做电商详情页还要从商品图里取主色做配套按钮颜色。用 Python 把每张图缩到很小做颜色聚类,自动输出主色的十六进制色值到 CSV,后续按色值筛选。
用到的库
pip install Pillow
完整代码
# -*- coding: utf-8 -*-
# 批量提取每张图片的平均色和主色(十六进制)
import os
import csv
from collections import Counter
from PIL import Image
IMG_EXTS = {".jpg", ".jpeg", ".png", ".bmp", ".webp"}
def rgb_to_hex(rgb):
return "#{:02X}{:02X}{:02X}".format(*rgb)
def average_color(im):
"""平均色:整图 RGB 三通道均值,最稳定"""
small = im.convert("RGB").resize((1, 1), Image.LANCZOS)
return small.getpixel((0, 0))
def dominant_color(im, palette_size=8):
"""主色:把图缩到很小,量化到 palette_size 种颜色,取最多的那个"""
im = im.convert("RGB").resize((100, 100), Image.LANCZOS)
# 量化到 16 级,相近颜色合并
quant = im.quantize(colors=palette_size).convert("RGB")
cnt = Counter(quant.getdata())
top = cnt.most_common(1)[0][0]
return top
def scan_colors(input_dir, out_csv):
rows = []
for name in sorted(os.listdir(input_dir)):
ext = os.path.splitext(name)[1].lower()
if ext not in IMG_EXTS:
continue
try:
with Image.open(os.path.join(input_dir, name)) as im:
avg = average_color(im)
dom = dominant_color(im)
rows.append([name, rgb_to_hex(avg), rgb_to_hex(dom)])
print(f"{name} 平均色 {rgb_to_hex(avg)} 主色 {rgb_to_hex(dom)}")
except Exception as e:
print(f"跳过 {name}: {e}")
with open(out_csv, "w", newline="", encoding="utf-8-sig") as f:
w = csv.writer(f)
w.writerow(["文件名", "平均色", "主色"])
w.writerows(rows)
print(f"完成 {len(rows)} 张 -> {out_csv}")
if __name__ == "__main__":
scan_colors("./photos", "./color_report.csv")
代码讲解
average_color把图直接resize((1,1)),整张图被压成一个像素,它的颜色就是全图均值,又快又稳,适合做"整体偏什么色"。dominant_color先把图缩到 100x100,再用quantize(colors=8)量化成 8 种代表色,用Counter.most_common票数最多的就是主色。这种方法比 KMeans 快,对批量小图足够准。rgb_to_hex把 RGB 三元组转成#RRGGBB字符串,前端 CSS、设计稿直接能用。- 结果写进 CSV,Excel 打开后可以按主色排序,一眼看出哪些图是红色系、哪些是蓝色系。
运行结果
把待分析的图放进 ./photos,运行后终端逐张打印平均色和主色,同时生成 color_report.csv,里面是文件名和两列色值。配合 Excel 条件格式可以直接按色值给行染色。
注意事项
- 主色和平均色不一样:平均色是数学均值,红配绿出来会变灰;主色是出现最多的颜色,更接近"图里一眼看上去是什么色"。
- 量化的
palette_size越小越粗,8 适合分大类,24 适合精细配色。 - 大图先 resize 到 100px 再聚类,几万张图也能几分钟跑完。
- 带透明通道的 PNG 先
convert("RGB"),透明区域会被当成黑色,需要时可在合成前给白底。

更新时间:2026-09-14 20:22:40