一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵

💡 作者:韩信子@ShowMeAI
📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56
📘 计算机视觉实战系列:https://www.showmeai.tech/tutorials/46
📘 本文地址:https://www.showmeai.tech/article-detail/404
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏ShowMeAI查看更多精彩内容
💡 引言

我们本次用到的数据集是 🏆Kaggle 100 种鸟数据集,大家可以通过 ShowMeAI 的百度网盘地址下载。
🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [39]使用Python构建图片颜色提取器 『Bird 450 Species数据集』
⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
大家在做图像处理或者制作PPT时,一个非常常用的功能是颜色提取,我们可以通过提取器从已有图像的某个位置提取颜色,而不用自己肉眼比对和选择。今天ShowMeAI就带大家用python来实现这个功能。
我们会构建如下2个颜色提取器:
- 简单提取器——从单个图像中选择颜色
- 复杂提取器——从多个图像中选择颜色列表并显示颜色

本文的实现涉及python编程知识与部分数据可视化知识,大家可以通过ShowMeAI的以下教程和文章进行系统学习:
💡 颜色提取器实现
💦 导入工具库
首先我们需要导入本次所需的工具库,matplotlib.image
用于显示图像,pyperclip
用于将字符串保存到剪贴板,glob
用于处理文件路径。
#Imports import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg import pyperclip import random import glob
我们将从不同的鸟类图像中提取颜色(即大家在第1节看到的图像)。我们读取路径下所有的jpg格式图像,代码如下:
#Dataset read_path = "../../data/birds/" img_path = glob.glob(read_path + "*.jpg")
💦 简单颜色提取器实现
我们先实现一个简单颜色提取器。它的功能是,每次我们单击图像中的某个位置,该像素的 RGB 通道会保存到我们的剪贴板中,然后我们可以将该值粘贴到笔记本中。
![]() |
我们先构建一个onclick
函数,每次单击图像时都会运行此程序。我们获取点击的 x 和 y 坐标,然后得到该坐标处像素的 RGB 通道值,并将其作为字符串保存到剪贴板。完整的代码如下:
def onclick(event): global img # get x,y of click x = round(event.xdata) y = round(event.ydata) # get RGB values rgb = img[y][x] # save to clip board pyperclip.copy(str(rgb))
我们要使用上面这个函数,我们首先使用 matplotlib 创建一个图形,然后设置该图的交互功能,将onclick
函数作为参数传入,这样我们每次点击就会调用上述函数进行颜色提取。
%matplotlib notebook global img fig = plt.figure(figsize=(5,5)) #Add an interactive widget to figure cid = fig.canvas.mpl_connect('button_press_event', onclick) #Load image and add count path = img_path[0] img = mpimg.imread(path) plt.imshow(img) plt.show()
注意:上述代码的第2行使用了全局变量,这样就可以在
onclick
函数中更新这些变量。
💦 复杂颜色提取器实现
下面我们来构建一个复杂颜色提取器,它实现的功能如下图所示:我们多次点击不同图像的多个位置,我们会按照顺序编号和记录颜色(注意颜色框左上角的红色数字),并把颜色保存到列表中。
![]() |
我们还是需要构建onclick
函数,和之前的简单颜色提取器有点类似,这里的主要区别在于我们不直接保存 RGB 通道值,而是调用change_choice
来调整右侧显示的提取颜色。
def onclick(event): global img global rgb # get x,y of click x = round(event.xdata) y = round(event.ydata) # get RGB values rgb = img[y][x] #Update second plot with colour change_choice()
我们再定义一个函数onpress
,它会在按下键盘时运行。这个函数在按下了不同键的情况下做不同的处理:(change_image
和change_choice
会分别用于更新图片和更新显示颜色框,在后续会定义)
n
:运行change_image
函数。c
:我们将 RGB 通道值保存到剪贴板和颜色列表中,接着运行change_choice
函数。
具体代码实现如下:
def onpress(event): global rgb global colours #Get key key = event.key if key == 'n': change_image() elif key == 'c': # save to clip board pyperclip.copy(str(rgb)) # add to list of colours colours.append(rgb) change_choice()
change_choice
函数用于更新右侧颜色框。右侧的颜色框有与图像框相同的尺寸,并且根据当前全局 rgb 值进行颜色显示。
def change_choice(): global img global ax global colours global rgb # remove previous count for txt in ax[1].texts: txt.set_visible(False) # create array of colour choice dims = np.shape(img) col = np.array([[rgb]*dims[0]]*dims[1]) ax[1].imshow(col) # update colour count ax[1].text(0, 15, len(colours),color='r',size=20) plt.show()
change_choice
函数在2处调用和执行:
- 点击图片时调用的onclick函数中,它完成 全局 rgb 更新并调整框中的颜色。
- 调用
onpress
函数并按下“c”时,这里颜色列表的长度+1,颜色计数也会改变。
接下来我们定义change_image
函数。我们在按下“n”时会调用它更新图像框。代码如下:
def change_image(): global img_path global img global ax global rgb # close all open plots plt.close('all') fig,ax = plt.subplots(1,2,figsize=(10,5)) # add an interactive widget to figure cid = fig.canvas.mpl_connect('button_press_event', onclick) cid2 = fig.canvas.mpl_connect('key_press_event', onpress) # load random image path = random.choice(img_path) img = mpimg.imread(path) ax[0].imshow(img) # reset the colour window rgb = [255,255,255] change_choice()
我们可以通过运行change_image
函数来启动颜色选择器,如下:
%matplotlib tk global img_path global colours colours = [] # load image paths read_path = "../../data/birds/" img_path = glob.glob(read_path + "*.jpg") # start widget change_image()
接下来当你就可以使用这个复杂颜色提取器啦,在您遍历图像并保存颜色时,颜色列表随之更更新,我们在下图的 colours 里可以看到提取的颜色构建的rgb值序列。

参考资料
- 📘 Kaggle 100 种鸟数据集:https://www.kaggle.com/datasets/gpiosenka/100-bird-species
- 📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56
- 📘 数据科学工具库速查表 | Matplotlib 速查表:https://www.showmeai.tech/article-detail/103
推荐阅读
- 🌍 数据分析实战系列 :https://www.showmeai.tech/tutorials/40
- 🌍 机器学习数据分析实战系列:https://www.showmeai.tech/tutorials/41
- 🌍 深度学习数据分析实战系列:https://www.showmeai.tech/tutorials/42
- 🌍 TensorFlow数据分析实战系列:https://www.showmeai.tech/tutorials/43
- 🌍 PyTorch数据分析实战系列:https://www.showmeai.tech/tutorials/44
- 🌍 NLP实战数据分析实战系列:https://www.showmeai.tech/tutorials/45
- 🌍 CV实战数据分析实战系列:https://www.showmeai.tech/tutorials/46
- 🌍 AI 面试题库系列:https://www.showmeai.tech/tutorials/48
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人