Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。
本系列将会陆续整理分享一些有趣、有用的第三方库。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_Ecosystem
Color Thief简介:
Color Thief
是一个用于从图像中抓取主色或有代表性调色板的Python包。pypi链接:
1https://pypi.org/project/colorthief/
GitHub链接:
1https://github.com/fengsp/color-thief-py
该包是基于JS版本开发的Python版本。
JS版本GitHub链接:
1https://github.com/lokesh/color-thief/
安装:
1pip install colorthief
Color Thief使用:
测试图片来源:https://lokeshdhakar.com/projects/color-thief/
以下图为例:
首先需导入包,并将图片实例化为一个ColorThief对象:
1# 导入包
2from colorthief import ColorThief
3
4# 实例化ColorThief对象
5img_path = "./data/photo1.jpg"
6color_thief = ColorThief(img_path)
-
提取主色调:
1# 提取主色
2dominant_color = color_thief.get_color()
3dominant_color
输出结果为代表提取颜色的RGB三通道数值组成的元祖:
1(57, 84, 39)
-
提取调色板:
1# 构建图片调色板
2palette = color_thief.get_palette()
3palette
输出结果为多个颜色数组组成的列表:
1[(94, 173, 234),
2 (207, 219, 226),
3 (57, 89, 33),
4 (128, 201, 243),
5 (116, 160, 67),
6 (80, 110, 113),
7 (127, 116, 100),
8 (22, 26, 16),
9 (188, 43, 74)]
API:
1class ColorThief(object):
2 def __init__(self, file):
3 """Create one color thief for one image.
4
5 :param file: A filename (string) or a file object. The file object
6 must implement `read()`, `seek()`, and `tell()` methods,
7 and be opened in binary mode.
8 """
9 pass
10
11 def get_color(self, quality=10):
12 """Get the dominant color.
13
14 :param quality: quality settings, 1 is the highest quality, the bigger
15 the number, the faster a color will be returned but
16 the greater the likelihood that it will not be the
17 visually most dominant color
18 :return tuple: (r, g, b)
19 """
20 pass
21
22 def get_palette(self, color_count=10, quality=10):
23 """Build a color palette. We are using the median cut algorithm to
24 cluster similar colors.
25
26 :param color_count: the size of the palette, max number of colors
27 :param quality: quality settings, 1 is the highest quality, the bigger
28 the number, the faster the palette generation, but the
29 greater the likelihood that colors will be missed.
30 :return list: a list of tuple in the form (r, g, b)
31 """
32 pass
33
-
get_color(self, quality=10)
:
quality
参数:可选参数,用于质量设定,必须是 1 或更大的整数,默认为 10。该数字决定了在对下一个像素进行采样之前跳过了多少像素。数字越大,提取速度越快,但也越有可能提取的颜色不是图片上看起来的主要颜色。以下图为例,分别查看不同quality
参数值对返回结果的影响:
1# 实例化ColorThief对象
2color_thief = ColorThief("./data/photo2.jpg")
3
4# quality参数值列表
5quality_list = [1 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 , 100]
6num = len(quality_list)
7
8result = []
9
10for i in range(num):
11 start = time.time()
12 dominant_color = color_thief.get_color(quality=quality_list[i])
13 end = time.time()
14 t = round(end-start , 3)
15 result.append((quality_list[i] , t , dominant_color))
16
17# print(result)
18
19fig , axs = plt.subplots(3 , 4 , figsize=(10,8))
20
21for i in range(num):
22 color = Image.new('RGB' , (1,1) , result[i][2])
23 ax=axs[int(i/4),i%4]
24
25 ax.set_title((str(result[i][0]) + " - " + str(result[i][1]) + " - " + str(result[i][2])) , fontsize=10)
26
27 ax.axis('off')# 去掉坐标刻度
28
29 ax.imshow(color)
30
31axs[2,3].axis('off')
结果如下所示:
-
get_palette(self, color_count=10, quality=10):
中位切分算法的原理是将图像颜色看做是颜色空间中的一个长方体,最开始图像是一个大的长方体,长方体中边长最长的一边一切为二,得到两个包含相同数量像素的长方体,再对每个长方体按相同的方法进行切割,重复切分步骤直到切分得到的长方体数量等于图像中主题颜色的数量。这个方法虽然简单,但同时也存在一些问题,其中最主要的问题是可能存在切分的正方体体积很大但其中只有少数的像素。
https://zhuanlan.zhihu.com/p/32454358
调色板中包含颜色将以列表形式返回,每种颜色本身是一个包含三个整数的元祖。
color_count
参数:可选参数,用于设置调色板的大小,也就是最多提取多少种颜色。需要注意的是,有一定可能性,实际提取颜色数量小于该设定值。quality
参数:可选参数,用于质量设定,必须是值 1 或更大的整数,默认为 10。。它该数字决定了在对下一个像素进行采样之前跳过了多少像素。数字越大,提取速度越快,但也越有可能丢失一些颜色。
以下图为例,分别查看不同
参数值对返回结果的影响:color_count
color_count=4:
1# 实例化ColorThief对象
2color_thief = ColorThief("./data/photo3.jpg")
3
4
5fig , axs = plt.subplots(2 , 2 , figsize=(5,5))
6
7palette = color_thief.get_palette(color_count=4,quality=10)
8print(palette)
9
10for i in range(len(palette)):
11
12 color = Image.new('RGB' , (1,1) , palette[i])
13
14 ax=axs[int(i/2),i%2]
15
16 ax.set_title(palette[i] , fontsize=10)
17
18 ax.axis('off')# 去掉坐标刻度
19
20 ax.imshow(color)
结果如下所示:
color_count=10:
此时返回结果只有9中颜色。
1# 实例化ColorThief对象
2color_thief = ColorThief("./data/photo3.jpg")
3
4
5fig , axs = plt.subplots(3 , 3 , figsize=(5,5))
6
7palette = color_thief.get_palette(color_count=10,quality=10)
8print(palette)
9
10for i in range(len(palette)):
11
12 color = Image.new('RGB' , (1,1) , palette[i])
13
14 ax=axs[int(i/3),i%3]
15
16 ax.set_title(palette[i] , fontsize=10)
17
18 ax.axis('off')# 去掉坐标刻度
19
20 ax.imshow(color)
结果如下所示:
本篇文章来源于微信公众号: 码农设计师