码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一定要用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

  • 相关阅读:
    Mac终端首行显示特定字符便于查看
    秋招基础整理
    我的创作纪念日
    系统架构设计师之RUP软件开发生命周期
    C语言(结构体)
    智能语音外呼系统 OKCC没有电脑的坐席能不能开展工作
    Adversarial Attacks on Neural Networks for Graph Data
    时间序列中的特征选择:在保持性能的同时加快预测速度
    【C语言】【动态内存管理】malloc,free,calloc,realloc
    【python-AI篇】人工智能技能树思维导图
  • 原文地址:https://www.cnblogs.com/showmeai/p/16954984.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号