Python提取图片主色并生成可视化图表的完整教程
本文详细介绍如何使用Python从图片中提取主要颜色并绘制可视化图表。通过结合[[wp:a1]]与[[wp:a2]]模块识别颜色要素,利用[[wp:a3]]和[[wp:a4]]模块进行数据处理与可视化展示。教程涵盖从模块导入、颜色提取、数据整合到最终生成饼图与调色盘的全过程,提供完整代码示例。
本文分享一种有趣的可视化技巧,展示如何从图片中提取颜色并绘制成可视化图表,效果如下图所示。

在示例照片中包含了多种颜色,我们将利用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()输出结果

提取颜色并整合成表格
我们调用extcolors模块从图片中提取颜色,输出结果以RGB形式呈现,具体代码如下:
colors_x = extcolors.extract_from_path(img_url, tolerance=12, limit = 12)
colors_x输出结果
([((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输出结果

绘制图表
接下来进入图表绘制阶段,这里使用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()输出结果

生成的饼图显示了每种不同颜色的占比情况。为了进一步美化,我们将原图放置在圆环中心。
imagebox = OffsetImage(img, zoom=2.3)
ab = AnnotationBbox(imagebox, (0, 0))
ax1.add_artist(ab)输出结果

最后,我们制作一个调色盘,将原图中的各种不同颜色罗列出来,代码如下:
## 调色盘
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()输出结果

实战环节
这一部分是实战环节,我们将上述所有代码封装成一个完整的函数。
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)输出结果

以上是Python实现提取图片颜色并绘制可视化图表的详细内容,更多关于Python提取图片颜色的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









