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

作者:韩信子@ShowMeAI Python3◉技能提高系列:www.showmeai.tech/tutorials/5… 计算机视觉实战系列:www.showmeai.tech/tutorials/4… 本文地址:www.showmeai.tech/article-det… 声明:版权所有,转载请联络平台与作者并注明出处 收藏ShowMeAI检查更多精彩内容

引言

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

咱们本次用到的数据集是 Kaggle 100 种鸟数据集,咱们能够经过 ShowMeAI 的百度网盘地址下载。

实战数据集下载(百度网盘):大众号『ShowMeAI研究中心』回复『实战』,或许点击 这儿 获取本文 [39]运用Python构建图片色彩提取器 『Bird 450 Species数据集

ShowMeAI官方GitHub:github.com/ShowMeAI-Hu…

咱们在做图画处理或许制造PPT时,一个非常常用的功用是色彩提取,咱们能够经过提取器从已有图画的某个位置提取色彩,而不必自己肉眼比对和挑选。今天ShowMeAI就带咱们用python来完结这个功用。

咱们会构建如下2个色彩提取器:

  • 简略提取器——从单个图画中挑选色彩
  • 杂乱提取器——从多个图画中挑选色彩列表并显现色彩
一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵

本文的完结触及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 通道会保存到咱们的剪贴板中,然后咱们能够将该值粘贴到笔记本中。

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

咱们先构建一个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函数中更新这些变量。

杂乱色彩提取器完结

下面咱们来构建一个杂乱色彩提取器,它完结的功用如下图所示:咱们多次点击不同图画的多个位置,咱们会依照次序编号和记载色彩(留意色彩框左上角的红色数字),并把色彩保存到列表中。

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

咱们还是需求构建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_imagechange_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值序列。

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

参考资料

  • Kaggle 100 种鸟数据集:www.kaggle.com/datasets/gp…
  • Python3◉技能提高系列:www.showmeai.tech/tutorials/5…
  • 数据科学东西库速查表 | Matplotlib 速查表:www.showmeai.tech/article-det…

引荐阅读

  • 数据剖析实战系列 :www.showmeai.tech/tutorials/4…
  • 机器学习数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • 深度学习数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • TensorFlow数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • PyTorch数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • NLP实战数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • CV实战数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • AI 面试题库系列:www.showmeai.tech/tutorials/4…

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

本文正在参与「金石计划 . 瓜分6万现金大奖」