Python 中非常规颜色指南

2023-10-19

如果您一直在使用 Python 进行编程,那么您很可能至少遇到过一个提供处理颜色表示和自定义功能的库。
From 图像处理从数据可视化到Web应用程序开发,你会发现颜色的使用无处不在。
事实上,大多数用于最先进计算机视觉任务的现代深度神经网络都是根据图像中像素颜色信息的空间分布进行训练的。

在本教程中,我们将了解其中一些库,并了解如何以编程方式描述和修改颜色。

 

计算机中的颜色表示

在查看特定的 Python 库之前,让我们首先了解颜色在计算机程序中通常是如何表示的。

有许多流行的颜色模型用于描述颜色,例如 RGB、CMYK、HSV、HSL 等。
RGB 颜色模型最常用于编程语言中。

RGB颜色模型

在RGB颜色模型中,任何颜色都可以通过混合3种原色(即红、绿、蓝)来生成。
在此模型中,可以通过指定一组 3 个数值(通常范围从 0 到 255)来描述颜色,
每个指定给定颜色中存在的红色、绿色和蓝色的强度。
这 3 种颜色有时也称为“通道”或“色带”。

在大多数编程语言(包括 Python)中,有关这 3 个频段的信息通常以以下 2 种方式之一指定:tupleRGB 值或十六进制代码。

在第一种表示法中,我们将颜色表示为 3 个值的元组,分别对应于红色、绿色和蓝色强度,按该顺序(除非另有说明)。此表示形式中的数字(范围从 0 到 255)以十进制(基数 10)编码表示。
在某些情况下,这些数字也会按比例缩小并指定在 0 到 1 的范围内。

另一方面,十六进制代码是一种以十六进制(基数 16)编码表示相同信息(RGB 值)的方式。

例如,红色元组的 RGB 表示为 (255, 0, 0),而其等效的十六进制代码为“#FF0000”(FF = 16*15 + 15 = 255)。

以下是一些常见颜色及其 RGB 值和相应的十六进制代码:

 

在终端中打印彩色文本

如果您使用命令行安装了软件包,您可能会遇到在终端上以不同颜色文本显示的特殊说明、警告或错误。
这只是终端上的彩色输出很有帮助的众多情况之一。

Python 的库允许我们以我们选择的颜色打印输出。我们可以使用这些库通过自定义文本的前景和背景来打印彩色文本和彩色块。
让我们看一个这样的库——termcolor.


from termcolor import colored
print("This is a normal text in terminal")
print(colored("This is a colored text in terminal","red"))
print(colored("This is a colored text with background","red","on_green"))
  

Output:

第一个参数为coloredmethod 是要打印的文本,后面跟的参数指定文本的前景色和背景色。

还有各种其他库,例如coloredColr等,允许我们类似地自定义和格式化终端输出。

 

在 Python 中自定义文本颜色的转义序列

在上一节中,我们使用库来指定文本的前景色和背景色。

我们还可以通过直接附加特殊内容来自定义终端中文本的外观转义序列字符在输出字符串中。

这些转义序列称为“ANSI 序列代码.”
它们用于向终端发出特殊命令,以更改打印在其上的文本的外观。

在本节中,我们将看一些示例,说明如何更改文本的前景色和背景色,以及其他文本格式选项,例如粗体和下划线。
我们使用的所有 ANSI 转义码都以该序列开头'\033['并结束于'm'.

让我们看一个例子。


print("\033[0;30;47mHello World")
  

Output:

请注意,我们不需要调用任何特殊的库来在终端中打印彩色文本。
它只是文本前面的一堆字符(要自定义)定义文本的样式。

上述ANSI代码的格式如下:
\033[:转义序列字符的开头
0;:文字样式(0表示无效果)
30;:文字颜色(30代表黑色)
47;:背景颜色(47代表白色背景)
m:表示代码结束,该字符前面定义的样式将应用于其后面的文本。

如果查看之前的输出,白色背景会超出文本末尾延伸到下一个提示。
我们可以通过在文本末尾应用空白样式来避免这种情况。


print("\033[0;30;47mHello World\033[0m")
  

Output:

我们还可以通过更改转义序列开头后的第一个数字字符来查看一些文本格式选项,例如粗体、斜体和下划线。
粗体文本的代码为1,下划线的代码为4。斜体的代码为3。


print("\033[4;33m This is an underlined yellow text.\033[0m")
print("\033[1;31;46m This is a bold, red text on a cyan background.\033[0m")    
  

Output:

我们还可以使用 RGB 值指定颜色。
为此,我们必须插入特殊代码,如下所示:
\033[38;2;(r);(g);(b)m– 用于文本颜色
\033[48;2;(r);(g);(b)m– 用于文本背景颜色

让我们结合这两种方法来显示“斜体”样式的文本,文本颜色为绿色(0,255,0),背景颜色为灰色(128,128,128);
我们将使用 RGB 值来描述颜色。


print("\033[3;38;2;0;255;0;48;2;128;128;128m This is an italic, green text on a gray background.\033[0m")
  

Output:

 

使用 Python 从图像中读取像素颜色

正如我们之前讨论的,每种颜色都可以使用 3 个值(即 R、G 和 B 值)的元组来描述。

图像由大量像素组成。像素就像一个生物细胞——它是图像中最小的不可分割的区域。
在彩色图像中,每个像素都是图像上的一个正方形区域,由我们用来定义颜色的三个 RGB 值定义。
这些值表示图像上像素位置的颜色。

由于数字图像是矩形的,因此它作为 3 个二维数组的组合存储在内存中。
每个数组的大小相同(等于图像的大小),它们被称为图像的 R、G 和 B“通道”。

我们可以使用 Python 来表示图像NumPy 数组.
因此,我们可以访问图像中的每个像素并获取它们的 RGB 值。

让我们考虑以下猫的图像。

我很好奇这只猫的眼睛的颜色,你也想知道它是什么颜色吗?
我们可以使用简单的数组索引找到图像中任何位置的颜色(RGB 值)。

首先,我们需要读取图像并将其转换为 NumPy 数组。


from PIL import Image
import numpy as np
img = Image.open("cat.jpg")
img_arr = np.array(img)
print("type =",type(img_arr))
print("shape =",img_arr.shape)
  

Output:

数组的形状表示图像的高度为 480 像素,宽度为 570 像素。
第三个维度 3 表示它是 RGB 图像。

现在我们想要计算出猫的左眼和右眼颜色的 RGB 值。
我们可以通过索引图像数组对象来做到这一点。我们可以索引两只眼睛区域中的任何位置。
对于左眼,我们将查看位置 [250,260],对于右眼,我们将查看位置 [244,357]。


left_eye_color = img_arr[250,260]
right_eye_color = img_arr[244,357]
print("left eye color = ", left_eye_color)
print("right eye color = ", right_eye_color)
  

Output:

左眼的 RGB 值确实对应于棕色的黄色阴影,右眼的 RGB 值对应于蓝色的阴影。

修改图像中的像素颜色

现在我们知道如何访问图像中任何位置的像素值,让我们看看如何修改它们以在这些位置绘制新颜色。

让我们尝试在我们用来访问左眼像素值的位置周围插入一个 5×5 的黑色斑点。

我们将使用 pyplot 来执行此操作:


for i in range(248,253):
    for j in range(258,263):
        img_arr[i, j ] = (0,0,0)
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)
ax.axis("off")
ax.imshow(img_arr)
plt.show()
  

Output:

请注意,由于 for 循环中的像素操作步骤,左眼中的小区域被涂成黑色。

 

使用 ColorThief 检测图像中的颜色

存在一个有趣的 Python 库,名为“colorthief'这有助于我们识别图像中最主要的颜色。

让我们找出这张早餐图片中的主色:


from colorthief import ColorThief
img = ColorThief("breakfast.jpg")
dominant_color = img.get_color()
print("Dominant color =",dominant_color)
  

Output:

The get_color()方法返回图像中最主要颜色的 RGB 值。
让我们绘制这个颜色。


#plotting the color
im = np.array(dominant_color).reshape(1,1,3)
fig = plt.figure(figsize=(3,3))
ax = fig.add_subplot(111)
ax.axis("off")
ax.imshow(im)
plt.show()
  

Output:

所以最主要的颜色是浅棕色,这可能来自于放早餐的桌子。

同样,ColorThief 库还可以帮助我们找到调色板或图像中的“前 n 种颜色”。


palette = img.get_palette(color_count=5)
palette = np.array(palette)
print(palette)
  

Output:

The get_palette方法接受参数color_count,它表示我们想要在图像中找到多少种顶级颜色。

让我们绘制这 5 张图像,并将其与上面的早餐图像联系起来。


from skimage import io
ind = np.linspace(0,4,5, dtype=int).reshape(1,5)
fig = plt.figure(figsize=(8,2))
ax = fig.add_subplot(111)
ax.imshow(palette[ind])
ax.set_yticks([])
plt.show()
  

Output:

现在我们的盘子、浆果和果汁也都出现在调色板中了。

 

Python颜色模块

蟒蛇的colourmodule 是一个简单但功能强大的库,用于存储、转换和操作颜色。

使用这个库,我们可以以多种格式之一存储颜色,即 RGB、十六进制代码、HSL 等。
我们还可以将颜色从一种格式转换为另一种格式。

让我们看一个例子。


from colour import Color
c1 = Color("red")
print("c1 represents",c1)
rgb = c1.rgb
rgb = [int(x*255) for  x in rgb]
print("rgb for c1 =",rgb)
print("hex for c1 =",c1.hex_l)
print("hsl for c1 =",c1.hsl)
  

Output:

属性.rgb返回 (0,1) 范围内的十进制值,因此我们通过将它们分别乘以 255 将它们转换为 (0,255) 范围。

现在让我们看看修改现有颜色的步骤。


c1.green = 1.0
print("c1 now represents the color",c1)
#Manipulating HSL channels
print("hsl for c1 currently is",c1.hsl)
c1.hue = 0.666666667
print("c1 is now", c1)
  

Output:

请注意,通过操纵绿色通道值,我们如何将现有的红色颜色变成黄色。
然后,通过修改其色调值,我们将黄色转换为蓝色。

使用颜色模块创建渐变颜色

渐变是连续的颜色图或两种或多种颜色之间的连续渐变。
我们可以使用以下方法生成两种颜色之间的渐变colour module.

让我们创建红色和绿色之间的渐变。


c1 = Color("red")
c2 = Color("green")
gradient = list(c1.range_to(c2, 10))
print(gradient)
  

Output:

这会生成红色和绿色之间的 10 种颜色。

让我们尝试将它们形象化。


grad_rgb = [x.rgb for x in gradient]
grad_rgb_255 = [list(map(lambda x: int(x*255), i)) for i in grad_rgb]
palette = np.array(grad_rgb_255)
import matplotlib.pyplot as plt
ind = np.linspace(0,9,10, dtype=int).reshape(1,10)
fig = plt.figure(figsize=(8,2))
ax = fig.add_subplot(111)
ax.imshow(palette[ind])
ax.axis("off")
plt.show()
  

Output:

这显示了红色和绿色之间的渐变,由 10 种连续颜色定义。
我们可以通过在两者之间生成越来越多的颜色来使渐变更加平滑。

 

结论

在本教程中,我们学习了如何表示、操作颜色,以及如何使用 Python 中的各种库将它们应用于文本和其他对象。
我们首先了解计算机程序中表示颜色的一些方法。

然后我们研究了如何修改终端中文本的外观。
首先,我们通过使用 Python 库,然后将转义序列字符附加到输出字符串来完成此操作。

我们探索了读取和更新图像中任何位置的像素颜色的方法。
我们还查看了一个库来查找图像中最主要的颜色。

接下来,我们研究了用于表示颜色并更新现有颜色的“颜色”模块。
我们最终通过使用颜色模块生成颜色渐变,然后在 matplotlib 库的帮助下绘制相同的颜色来结束它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中非常规颜色指南 的相关文章

  • python中unicode字符串到ascii字符串的近似转换

    不知道这是否微不足道 但我需要将 unicode 字符串转换为 ascii 字符串 并且我不希望周围有所有这些转义字符 我的意思是 是否有可能 近似 转换为一些非常相似的 ascii 字符 例如 Gavin O Connor 转换为 Gav
  • 我正在用 python 编写一个电报机器人

    我想通过Python编写一个电报机器人 但它不起作用 import telebot bot telebot TeleBot my token bot message handler content types text def sendin
  • 存储为 np.arrays 的不同数据集的分组堆积条形图

    我正在研究一个平衡问题 我想比较一些数据 我想通过创建不同年份的堆叠条形图来做到这一点 每年 我想要两个不同数据集的堆叠条形图 我正在尝试创建一种 分组堆积条形图 我设法创建了我想要比较的 2 个堆叠条形图 但它们仍然位于两个不同的图中 我
  • 为什么 Dash 在上传文件时会出现解析错误?

    上传 Excel 或 CSV 会导致错误 我遵循了 Dash 演示 但是当我尝试扩展它来执行绘图之类的操作时 它就不起作用了 我不想只显示一张桌子 Dash Table 函数已更新 因此之前使用 Dash Table Experiments
  • python 正则表达式中括号的奇怪行为

    我正在编写一个 python 正则表达式 它可以在文本文档中查找引用的字符串 从黑匣子中记录的航空公司飞行员的引用 我首先尝试编写具有以下规则的正则表达式 返回引号之间的内容 如果以 single 打开 则仅在以 single 关闭时返回
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • 为什么通过selenium切换到alert不稳定?

    为什么通过selenium切换到alert不稳定 例如 1 运行代码 一切顺利 一切都很顺利 但如果这段代码在几分钟内运行 那么可能会出现错误 例如 没有可以单击的元素 等等 2 在一个站点上有一个警报窗口 alert driver swi
  • Matplotlib 动画未显示

    当我在家里的电脑上尝试这个时 它可以工作 但在工作的电脑上却不行 这是代码 import numpy as np import matplotlib pyplot as plt import matplotlib animation as
  • Unpickle 二进制文件为文本[重复]

    这个问题在这里已经有答案了 我需要对基本上如下所示的系统进行一些维护 复杂的遗留Python程序 gt 二进制pickle文件 gt 另一个复杂的遗留Python程序 这需要准确弄清楚中间 pickle 文件中的内容 我怀疑文件格式比生成和
  • 混淆矩阵错误“分类指标无法处理多标签指标和多类目标的混合”

    我得到了 Classification metrics can t handle a mix of multilabel indicator and multiclass targets 当我尝试使用混淆矩阵时出错 我正在做我的第一个深度学
  • Python lmfit:拟合 2D 模型

    我正在尝试将二维高斯拟合到一些灰度图像数据 该数据由一个二维数组给出 lmfit 库实现了一个易于使用的模型类 它应该能够做到这一点 不幸的是文档 http lmfit github io lmfit py model html http
  • 使用底图和Python在地图中绘制海洋

    我正在绘制此处提供的 netCDF 文件 https goo gl QyUI4J https goo gl QyUI4J Using the code below the map looks like this 然而 我希望海洋是白色的 更
  • 在用户提交的正则表达式中查找捕获组

    我有一个 python 应用程序 需要处理用户提交的正则表达式 出于性能考虑 我想禁止捕获组和反向引用 我的想法是使用另一个正则表达式来验证用户提交的正则表达式不包含任何命名或未命名的组捕获 如下所示 def validate user r
  • 如何使用增量值向 Pyspark 中的 DataFrame 添加列?

    我有一个名为 df 的 DataFrame 如下所示 Atr1 Atr2 Atr3 A A A B A A C A A 我想向其中添加一个具有增量值的新列并获取以下更新的 DataFrame Atr1 Atr2 Atr3
  • Python Peeweeexecute_sql() 示例

    我使用 Peewee 模块作为我的项目的 ORM 我看了整个文档 没有明确的 有关如何处理 db execute sql 结果的示例 我跟踪代码 只能发现db execute sql 返回游标 有谁知道如何处理光标 例如迭代它并获取 返回复
  • 插入失败“OperationalError:没有这样的列”

    我尝试使用我尝试修复的姓名和电话创建一个数据库 但它会随时向我重播 File exm0 py line 14 in
  • NumPy 中 exp(-x^2) 的快速傅立叶变换

    I have to calculate numerically the 2nd derivative of a Gaussian function I ve read every question on this topic here bu
  • 如何通过pygit2获取当前签出的Git分支名称?

    这个问题应该与 如何获取Git中当前的分支名称 https stackoverflow com questions 6245570 how to get current branch name in git 获取 git 当前分支 标签名称
  • python字符串包含双引号字符

    我的输入字符串由字符组成 包括双引号和单引号 和 B SS JU PQ AD DDSFD ABD E J 但是 当我从文本文件打开上述输入并打印它时 第三行中的双引号 被打印为 xe2 x80 x9d 我的目标是进行简单的字符计数 B 2
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标

随机推荐

  • Linux 中的 du 命令及有用示例

    du 是缺少磁盘使用 这意味着 du 命令计算文件在磁盘上使用的大小 它是Linux系统用户经常使用的基本Linux命令 Syntax du OPTION FILE 在本教程中 您将通过有用的示例了解 du 命令在 Linux 中的用法 d
  • 如何在 PHP 中向数组追加项目

    问题 如何在 PHP 中向数组追加项目 如何在 PHP 中将任何元素追加到现有数组的末尾 如何在 PHP 中将元素推送到数组 本教程使用数组推 函数将新元素插入或追加到数组末尾 PHP 将元素追加到数组 以下示例创建一个包含两个元素 如 b
  • 如何在 Ubuntu 18.04 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 可帮助您自动执行安装 更新 配置和删除 npm 包的过程 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中
  • 如何在 CentOS 7 上安装 Python 3

    本教程将指导您使用 Software Collections SCL 以及发行版默认 Python 版本 2 7 在 CentOS 7 系统上安装 Python 3 我们还将向您展示如何创建 Python 虚拟环境 Python 是世界上最
  • 如何在 Debian 10 Linux 上安装 Vagrant

    Vagrant是一个用于构建和管理虚拟机环境的开源命令行工具 默认情况下 Vagrant 可以在 VirtualBox Hyper V 之上配置计算机 和码头工人 其他提供商如 Libvirt KVM VMware 和 AWS 可以通过 V
  • Linux 中的 Wget 命令及示例

    GNU Wget 是一个用于从网络下载文件的命令行实用程序 使用 Wget 您可以使用 HTTP HTTPS 和 FTP 协议下载文件 Wget 提供了许多选项 允许您下载多个文件 恢复下载 限制带宽 递归下载 后台下载 镜像网站等等 本文
  • 如何在 Ubuntu 20.04 上安装 Odoo 15

    Odoo 是一款流行的开源商业应用程序套件 可帮助公司管理和运营其业务 它包括广泛的应用程序 例如 CRM 电子商务 网站构建器 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 Odoo根据使用案例和可用技术 可以以不同的方
  • 如何在 Debian 10 Linux 上安装 Node.js 和 npm

    Node js 是一个基于 Chrome JavaScript 构建的跨平台 JavaScript 运行时环境 旨在在服务器端执行 JavaScript 代码 使用 Node js 您可以构建可扩展的网络应用程序 npm 是 Node js
  • 如何在 Debian 9 上安装 Java

    在本教程中 我们将逐步介绍在 Debian 9 上安装 Java Java 是用于构建不同类型的应用程序和系统的最流行的编程语言之一 用 Java 开发的应用程序具有可扩展性 灵活性和可维护性 有两种不同的 Java 包 Java 运行时环
  • 如何在 Debian 9 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 本教程提供了在 Debian 9 系统上安装 Compos
  • 如何列出 CentOS 上已安装的软件包

    在本教程中 我们将向您展示如何列出和过滤 CentOS 上已安装的软件包 当您需要在另一台计算机上安装相同的软件包或想要重新安装系统时 了解如何列出 CentOS 系统上已安装的软件包会很有帮助 我们还将向您展示如何检查是否安装了特定的软件
  • 如何检查您的 CentOS 版本

    当您第一次登录 CentOS 计算机时 在进行任何工作之前 您可能需要检查系统上运行的 CentOS 版本 在本教程中 我们将展示几个不同的命令 了解如何检查系统上安装的 CentOS 版本 截至撰写本文时 CentOS Linux 拥有三
  • 如何在 CentOS 8 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 在虚拟机上运行 CentOS 时 不存在交换分区 因此唯
  • 配置 Magento 2 在 CentOS 7 上使用 Varnish

    页面速度或加载时间对于在线商店的成功至关重要 加载时间是加载特定页面上的内容所需的总时间 加载时间越长 转化率越低 这也是谷歌考虑确定搜索引擎排名的最重要因素之一 在第一篇文章中 我们在 CentOS 7 机器上安装了 Magento 2
  • 自动启动 wampserver 在 Windows 10 上自动启动

    在向您展示如何自动启动 wampserver 之前 我先简单介绍一下 Wampserver 是 Windows 平台上最好的 Web 开发堆栈之一 与 xampp 相比 我更喜欢它 因为它有方便的托盘菜单 可以让我访问任何配置 您可以从此网
  • 使用 Sed 命令删除行:Linux 文本删除教程

    Using sed命令从文件或流中删除行是常见操作 使用删除行的基本语法sed如下 sed pattern to match d filename Here pattern to match是您要在文件的每一行中匹配的模式 如果一行包含指定
  • 使用 to_sql 将 Python Pandas DataFrame 导出到 SQL

    The to sql函数允许您将存储在 DataFrame 中的记录写入 SQL 数据库 通过使用 SQLAlchemy 可以使用该库支持的任何数据库 在接下来的部分中 我们将更深入地研究此功能并探索更多功能 目录 hide 1 基本语法和
  • Python NumPy arange() 教程

    NumPyarange 函数用于生成给定区间内的值序列 您可以将其视为数字范围生成器 它允许您创建一个 NumPy 数组 其值在指定范围内均匀分布 它提供了更多功能 例如使用浮点数的能力以及显式定义数组中包含的值的间隔的灵活性 在本教程中
  • Python 切片初学者指南

    在本教程中 您将了解切片在 Python 中的工作原理以及如何使用它来操作字符串 列表和元组等序列 我们还将演示 Python 切片对象如何创建可用于对序列进行切片的切片 这些知识将为您提供一个强大的工具来访问序列中的多个项目 以删除多个项
  • Python 中非常规颜色指南

    如果您一直在使用 Python 进行编程 那么您很可能至少遇到过一个提供处理颜色表示和自定义功能的库 From 图像处理从数据可视化到Web应用程序开发 你会发现颜色的使用无处不在 事实上 大多数用于最先进计算机视觉任务的现代深度神经网络都