今天为大家分享一个有趣的可视化技巧,如何从图片中提取颜色然后绘制成可视化图表,如下图所示
在示例照片当中有着各种各样的颜色,我们将通过Python
中的可视化模块以及opencv
模块来识别出图片当中所有的颜色要素,并且将其添加到可视化图表的配色当中
那么按照惯例,第一步一般都是导入模块,可视化用到的模块是matplotlib
模块,我们将图片中的颜色抽取出来之后会保存在颜色映射表中,所以要使用到colormap
模块,同样也需要导入进来
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.image as mpimg
from PIL import Image
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import cv2
import extcolors
from colormap import rgb2hex
然后我们先来加载一下图片,代码如下
input\_name = 'test\_1.png'
img = plt.imread(input\_name)
plt.imshow(img)
plt.axis('off')
plt.show()
output
我们调用的是extcolors
模块来从图片中提取颜色,输出的结果是RGB
形式呈现出来的颜色,代码如下
colors\_x = extcolors.extract\_from\_path(img\_url, tolerance=12, limit = 12)
colors\_x
output
([((3, 107, 144), 180316),
((17, 129, 140), 139930),
((89, 126, 118), 134080),
((125, 148, 154), 20636),
((63, 112, 126), 18728),
((207, 220, 226), 11037),
((255, 255, 255), 7496),
((28, 80, 117), 4972),
((166, 191, 198), 4327),
((60, 150, 140), 4197),
((90, 94, 59), 3313),
((56, 66, 39), 1669)],
538200)
我们将上述的结果整合成一个DataFrame
数据集,代码如下
def color\_to\_df(input\_color):
colors\_pre\_list = str(input\_color).replace('(\[(', '').split(', (')\[0:-1\]
df\_rgb = \[i.split('), ')\[0\] + ')' for i in colors\_pre\_list\]
df\_percent = \[i.split('), ')\[1\].replace(')', '') for i in colors\_pre\_list\]
# 将RGB转换成十六进制的颜色
df\_color\_up = \[rgb2hex(int(i.split(", ")\[0\].replace("(", "")),
int(i.split(", ")\[1\]),
int(i.split(", ")\[2\].replace(")", ""))) for i in df\_rgb\]
df = pd.DataFrame(zip(df\_color\_up, df\_percent), columns=\['c\_code', 'occurence'\])
return df
我们尝试调用上面我们自定义的函数,输出的结果至DataFrame
数据集当中
df\_color = color\_to\_df(colors\_x)
df\_color
output
接下来便是绘制图表的阶段了,用到的是matplotlib
模块,代码如下
fig, ax = plt.subplots(figsize=(90,90),dpi=10)
wedges, text = ax.pie(list\_precent,
labels= text\_c,
labeldistance= 1.05,
colors = list\_color,
textprops={'fontsize': 120, 'color':'black'}
)
plt.setp(wedges, width=0.3)
ax.set\_aspect("equal")
fig.set\_facecolor('white')
plt.show()
output
从出来的饼图中显示了每种不同颜色的占比,我们更进一步将原图放置在圆环当中,
imagebox = OffsetImage(img, zoom=2.3)
ab = AnnotationBbox(imagebox, (0, 0))
ax1.add\_artist(ab)
output
最后制作一张调色盘,将原图中的各种不同颜色都罗列开来,代码如下
## 调色盘
x\_posi, y\_posi, y\_posi2 = 160, -170, -170
for c in list\_color:
if list\_color.index(c) <= 5:
y\_posi += 180
rect = patches.Rectangle((x\_posi, y\_posi), 360, 160, facecolor = c)
ax2.add\_patch(rect)
ax2.text(x = x\_posi+400, y = y\_posi+100, s = c, fontdict={'fontsize': 190})
else:
y\_posi2 += 180
rect = patches.Rectangle((x\_posi + 1000, y\_posi2), 360, 160, facecolor = c)
ax2.add\_artist(rect)
ax2.text(x = x\_posi+1400, y = y\_posi2+100, s = c, fontdict={'fontsize': 190})
ax2.axis('off')
fig.set\_facecolor('white')
plt.imshow(bg)
plt.tight\_layout()
output
这一块儿是实战环节,我们将上述所有的代码封装成一个完整的函数
def exact\_color(input\_image, resize, tolerance, zoom):
output\_width = resize
img = Image.open(input\_image)
if img.size\[0\] >= resize:
wpercent = (output\_width/float(img.size\[0\]))
hsize = int((float(img.size\[1\])\*float(wpercent)))
img = img.resize((output\_width,hsize), Image.ANTIALIAS)
resize\_name = 'resize\_'+ input\_image
img.save(resize\_name)
else:
resize\_name = input\_image
fig.set\_facecolor('white')
ax2.axis('off')
bg = plt.imread('bg.png')
plt.imshow(bg)
plt.tight\_layout()
return plt.show()
exact\_color('test\_2.png', 900, 12, 2.5)
output
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】