我的知识记录

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"),透明区域会被当成黑色,需要时可在合成前给白底。

Python 批量识别图片主色调 提取颜色值教程

标签:

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

上一篇:Python 批量生成电子签名图片 手写字体透明底教程

下一篇:Python 批量裁剪图片 指定区域/固定尺寸教程