| 图源1、图源2

无论绘制什么图表,配色方案都是非常重要的,配的好,整幅图看起来会自然美观,反之就可能很别扭。所谓的配色,笔者觉得就是一幅图表的几种主要颜色,一般绘图的工具都会提供一些调色板,供我们配色。但是工具提供的颜色色终究是比较有限的,有时我们可能需要自己配色。如果没有美术基础,自己配起来会比较难,这时我们可能需要借鉴其他的好看的图表的配色。用取色器一个一个的取色显得有些繁琐,不过最近笔者发现了一个小工具haishoku,它借助pillow获取色彩列表,可自动获取一幅图的主色调和配色方案,最多可以提取8种配色。haishoku只有300多行代码,体量很小,也是一个学习CV的小案例。以下将用haishoku提取配色方案,并用seaborn绘图,一起来看看吧。

copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/120589389


Haishoku简介


  • haishoku源码简介

haishoku代码的核心是用pillow来获取一幅图像的颜色列表,使用Image模块的getcolors方法,该方法返回某RGB出现的频次和RGB值组成的元组,如下所示。注:maxcolors默认为256,即默认的最大颜色数只有256,如果输入图像中的颜色数大于256,需要修改默认值,否则getcolors返回会为空值。

from PIL import Imageimg = Image.open('palette.png').convert('RGB')# 缩小图片,以减少计算量和限制最大色彩数
img = img.resize((256, 256),Image.ANTIALIAS)
colors = img.getcolors(maxcolors=256*256)
colors_sorted_freq = sorted(colors, key=lambda x:x[0], reverse=True)
print(colors_sorted_freq)

颜色列表:下图左与下图右的颜色列表

[(21025, (255, 255, 255)),(5544, (64, 101, 156)),(4992, (162, 212, 37)),(4626, (141, 232, 235)),(4394, (207, 177, 45)),(4077, (147, 174, 243)),(3196, (206, 59, 103)),(3083, (98, 67, 82)),(2624, (115, 217, 143)),(365, (208, 178, 48)),...,][(101, (43, 46, 89)),(100, (42, 45, 88)),(91, (46, 49, 92)),(89, (41, 44, 87)),(85, (44, 47, 90)),(83, (66, 97, 117)),(83, (45, 48, 91)),(80, (81, 124, 133)),(79, (39, 42, 87)),(77, (82, 125, 134)),...,]

主色调与配色:注意到,上面的颜色列表是按照颜色出现频次降序排列的。如果把第一个作为主色调,然后把前若干个作为配色方案,这对于下图左图来说是一个比较不错的方法。因为它颜色分明,而且各颜色集中,截取的前若干个颜色恰好是图像的配色方案的子集。但对于下图右图来讲,就不理想了,因为它虽然颜色分明,但是颜色不集中,RGB值是渐变的,分散的,同样是取前若干个颜色,得到的却只是主色调的子集,而不是图像中我们肉眼可见的几种主要颜色。

代码:包括生成RGB列表、十六进制RGB编码和显示色带。生成编码的目的是方便在绘图工具中直接使用。

from PIL import Imageimg = Image.open('palette.png').convert('RGB')
# 缩小图片,以减少计算量和限制最大色彩数
img = img.resize((256, 256),Image.ANTIALIAS)
colors = img.getcolors(maxcolors=256*256)
colors_sorted_freq = sorted(colors, key=lambda x:x[0], reverse=True)# 提取颜色数
color_num = 9# 获取主要色彩RGB列表
main_RGB_list = [list(color[1]) for color in colors_sorted_freq[:color_num]]
print(main_RGB_list)# 获取主要色彩16进制编码列表,hex函数输出字符前两个是0x
main_hex_list = ['#' + hex(color[1][0])[2:4] + hex(color[1][1])[2:4] + hex(color[1][2])[2:4] for color in colors_sorted_freq[:color_num]]
print(main_hex_list)# 创建空图用于存放配色带
box_w, box_h = 1000,100
palette = Image.new('RGB', (box_w, box_h))# 用于下面计算每种颜色占比
color_count_sum = sum([color[0] for color in colors_sorted_freq[:color_num]])# 生成色带图
init_ul = 0
for color in colors_sorted_freq[:color_num]:img_w = math.ceil(box_w*color[0]/color_count_sum)new_image = Image.new('RGB', (img_w, box_h), color[1])palette.paste(new_image, (init_ul, 0))init_ul += img_wpalette.show()

RGB列表与十六进制RGB编码

[[255, 255, 255], [64, 101, 156], [162, 212, 37], [141, 232, 235], [207, 177, 45], [147, 174, 243], [206, 59, 103], [98, 67, 82], [115, 217, 143]]
['#ffffff', '#40659c', '#a2d425', '#8de8eb', '#cfb12d', '#93aef3', '#ce3b67', '#624352', '#73d98f']

现实中大多数图片中的RGB值都是渐变的,分散的,先把类似的颜色分组,再选主色调和配色方案才是合理的,这样保证了选出来的颜色是图像中的主要颜色。haishoku作者采用RGB值分别分为三组的形式,将一幅图片的RGB值拆分成了九个大组,再用每个大组里的RGB值的加权平均表示该组的颜色,其中权值是该RGB值在该组中出现的频次的占比,最后输出前8种颜色作为配色方案,详见源码。其实除了这种手动分组的形式,还可以通过聚类算法来自动分组,用聚类中心的RGB值作为该组的颜色代表。

copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/120589389

  • 安装与接口

安装:

pip install haishoku

接口:

showPalette   # 显示配色方案
showDominant  # 显示主色调
getDominant   # 获取主色调
getPalette    # 获取配色方案

Haishoku基本使用


Haishoku只为我们提供了最多8种颜色的配色方案,如果想要更多这需要修改其源码,这并不复杂。实际上,我们在绘图的时候,用到的颜色是不会太多的,所以8种应该也够。通过上述接口,我们可以很容易的获得配色方案并显示配色方案。

源码:


from haishoku.haishoku import Haishokupath = 'palette.png'
# 可以用网页链接
# path = "http://wx2.sinaimg.cn/large/89243dfbly1ffoekfainzj20dw05k0u7.jpg"# Haishoku是一个对象
h = Haishoku.loadHaishoku(path)
print(h.palette)
print(h.dominant)palette = Haishoku.getPalette(path)
dominant = Haishoku.getDominant(path)# 显示色带
Haishoku.showPalette(path)
# Haishoku.showDominant(path)

主色调与配色:输出了上图左图的主色调和配色,可以观察到主色调并不是(255,255,255),这也就间接说明了主色调与配色方案中的每一种颜色都是是求平均而来的。由于haishoku接口输出的依旧是元组,我们需要处理一下才方便使用,至于如何处理,请往下看。

[(0.4, (252, 253, 252)), (0.11, (63, 100, 155)), (0.1, (162, 212, 38)), (0.1, (142, 232, 235)), (0.09, (206, 176, 44)), (0.08, (146, 172, 239)), (0.06, (97, 66, 81)), (0.06, (206, 61, 104))]
(252, 253, 252)

配色方案应用——seaborn绘图


  • 第一幅图配色应用

第一幅图配色方案的应用,由于已经用RGB_encode函数把Haishoku输出转换成了十六进制编码,所以直接把编码中的若干个传递给绘图函数就可以了,关键词palette,意思就是配色。

import seaborn as sns
import matplotlib.pyplot as plt
from haishoku.haishoku import Haishokudef RGB_encode(color_list):# 获取主要色彩RGB列表main_RGB_list = [list(color[1]) for color in color_list]# 获取主要色彩16进制编码列表main_hex_list = ['#' + hex(color[1][0])[2:4] + hex(color[1][1])[2:4] + hex(color[1][2])[2:4] for color in color_list]return main_RGB_list, main_hex_list# 获取配色方案
path = 'palette.png'
palette = Haishoku.getPalette(path)
main_RGB_list, main_hex_list = RGB_encode(palette)print(main_RGB_list)
print(main_hex_list)# 绘图
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")plt.figure(figsize=(10, 8))
ax = sns.boxplot(x="day", y="total_bill",data=tips,whis=[0, 100], palette=main_hex_list[1:])
sns.stripplot(x="day", y="total_bill", data=tips,size=4, color=".3", linewidth=0)plt.show()

如果出现以下错误,表明本地没有seaborn的内置数据,在github上面下载下来,然后放在C:\Users\YourName\seaborn-data目录下面即可。

URLError: <urlopen error [Errno 11004] getaddrinfo failed>

  • 第二幅图配色应用

第二幅图也是类似的操作,代码修改很小。

import seaborn as sns
import matplotlib.pyplot as plt
from haishoku.haishoku import Haishokudef RGB_encode(color_list):# 获取主要色彩RGB列表main_RGB_list = [list(color[1]) for color in color_list]# 获取主要色彩16进制编码列表main_hex_list = ['#' + hex(color[1][0])[2:4] + hex(color[1][1])[2:4] + hex(color[1][2])[2:4] for color in color_list]return main_RGB_list, main_hex_list# 获取配色方案
path = 'rose.jpg'
palette = Haishoku.getPalette(path)
main_RGB_list, main_hex_list = RGB_encode(palette)print(main_RGB_list)
print(main_hex_list)# 绘图
sns.set_style("whitegrid")
titanic = sns.load_dataset("titanic")plt.figure(figsize=(10, 8))ax = sns.catplot(x="sex", y="survived", hue="class", kind="bar", data=titanic,palette=main_hex_list[3:])
plt.show()

注意到Haishoku这种手动分组的组数,即最大配色方案颜色数是不易更改的,牵一发而动全身。所以用聚类来进行颜色分组或许能取得更具有弹性的配色方案。后面笔者将尝试用聚类方法来获取一副图中的配色方案,欢迎关注。

copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/120589389


参考


https://github.com/buptlihang/haishoku/blob/master/docs/document_zh.md
https://github.com/buptlihang/haishoku/blob/master/demo/demo.py
http://seaborn.pydata.org/examples/horizontal_boxplot.html

图表可视化配色学习——自动提取图片主色调与配色方案(python、pillow、haishoku和seaborn),并生成十六进制颜色编码相关推荐

  1. python图表可视化工具_比Excel制图更强大,Python可视化工具Altair入门教程

    原作者 Parul Pandey 晓查 编译整理 量子位 出品 | 公众号 QbitAI 数据转化成更直观的图片,对于理解数据背后的真相很有帮助.如果你有这方面的需求,而且还在使用Python,那么强 ...

  2. 深度学习为图片人物换装【python代码教程】

    在观看本文之前,请答应我要善良.昨天预告了下,发现很多同学对这个模型都表示出兴趣,甚至有好多同学后台发来照片让我帮他们脱裤子.授人以鱼不如授人以渔,请这些同学好自为之~ 01效果演示 本文案例使用的是 ...

  3. 深度学习为图片人物换装【python代码教程】 1

    在观看本文之前,请答应我要善良.昨天预告了下,发现很多同学对这个模型都表示出兴趣,甚至有好多同学后台发来照片让我帮他们脱裤子.授人以鱼不如授人以渔,请这些同学好自为之~ 01效果演示 本文案例使用的是 ...

  4. Opencv 入门篇学习记录(图片)

    title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...

  5. Python语言学习之图表可视化:python语言中可视化工具包的简介、安装、使用方法、经典案例之详细攻略

    Python语言学习之图表可视化:python语言中可视化工具包的简介.安装.使用方法.经典案例之详细攻略 目录 python语言中可视化工具包的简介 python语言中可视化工具包的安装 pytho ...

  6. Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解、插件。

    Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解.插件. **应用场景:**在很多时候,前端开发过程中需要动态的获取图片的主要的颜色值,并根据主色调去调整主题样式的颜色或者模拟 ...

  7. Python数据可视化——pyecharts学习笔记

    导读:Python数据可视化的库有很多,常见的有matplotlib.pyplot.Seaborn.pyecharts等. pyecharts是一款将python与echarts相结合的数据可视化库, ...

  8. 之于图片主色调提取算法

    图片颜色量化算法, 又称之为图片主色调提取算法. 也可以称之为调色板提取算法. 比较常见的应用就是用于提取图片的主色调用于上色配色, 当然也可以用于图像分割. 算法的主要目的是从真彩色图像所能表现的大 ...

  9. ECharts可视化库 学习笔记

    数据可视化 Day01 1.什么是数据可视化 1.1 什么是数据可视化 1.2 可视化的实现方式 2.ECharts的基本使用 2.1 ECharts的介绍 丰富的可视化类型 多种数据格式支持 流数据 ...

  10. 斯坦福大学数据可视化课程学习笔记:第二节 从数据到图像

    <斯坦福大学数据可视化课程学习笔记>课程资源来自于斯坦福大学数据可视化课程,是我所在团队实习生提升计划的一部分.本系列是 "秉姝" 同学在学习过程中记录和整理的学习笔记 ...

最新文章

  1. sublime Text3安装和verilog安装
  2. WSUS 3.0 STEP BY STEP 配置手册
  3. click()和onclick()的区别
  4. 10月份中国发货!华为Mate X这次真的没跑了
  5. [Ext JS]Grid的列过滤
  6. eclipse安装WindowBuilder Pro组件
  7. tcl语言读取文件一行_TCL语言(九) 路径和文件
  8. lux视频下载工具的安装和使用
  9. 2021年9月份最新数据库排行榜出炉
  10. csp202112-1:序列查询 题解
  11. windows连接虚拟专用网络的方法教程
  12. 朱小丹调研广东工业机器人产业有何深意?
  13. Android 9.0 recovery 菜单页跳过弹窗自动 WIPE_DATA(恢复出厂设置)
  14. 如何入门python爬虫?
  15. 网络系统设计的基本原则(一)
  16. thinkphp6搭建后端api接口
  17. Mysql 数据库名 表名 字段名最长长度
  18. 开源的RSS订阅器FreshRSS
  19. 初次使用ISE和vivado软件的驱动digilent安装问题
  20. 19.2. /etc/shells

热门文章

  1. 计算机二级mysql上机考试操作步骤_计算机二级mysql上机操作题怎么做
  2. 渗透测试之通道构建Cheat Sheet
  3. Mac用自带软件QuickTime Player进行录屏
  4. 计算机组装有哪些,教你组装电脑主要配置有哪些
  5. Ubuntu、ROS、PX4常见问题及其解决办法
  6. Redis相关面试题
  7. 20172328《程序设计与数据结构》第六周学习总结
  8. 使用html5与js实现音乐播放器
  9. 传奇地图文件MapInfo参数大全
  10. 一、Filter的配置项dispatcher