python camp提取颜色(一定要用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的以下教程和文章进行系统学习:
?图解Python编程:从入门到精通系列教程
? 数据科学工具库速查表 | Matplotlib 速查表
? 颜色提取器实现
? 导入工具库
首先我们需要导入本次所需的工具库 ,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创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!