首页Python【Python计算生态】C...

【Python计算生态】Color Thief——从图像提取主色或调色板


Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01

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


02

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[(94173234),
2 (207219226),
3 (578933),
4 (128201243),
5 (11616067),
6 (80110113),
7 (127116100),
8 (222616),
9 (1884374)]


03

API


 1class ColorThief(object):
2    def __init__(self, file):
3        """Create one color thief for one image.
4
5        :param file: A filename (stringor 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 settings1 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 settings1 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):
通过中位切分算法(median cut algorithm)聚类相似的颜色,进而从图像中获取调色板。

中位切分算法的原理是将图像颜色看做是颜色空间中的一个长方体,最开始图像是一个大的长方体,长方体中边长最长的一边一切为二,得到两个包含相同数量像素的长方体,再对每个长方体按相同的方法进行切割,重复切分步骤直到切分得到的长方体数量等于图像中主题颜色的数量。这个方法虽然简单,但同时也存在一些问题,其中最主要的问题是可能存在切分的正方体体积很大但其中只有少数的像素。

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)

结果如下所示:

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments