添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
+关注继续查看
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 通道会保存到我们的剪贴板中,然后我们可以将该值粘贴到笔记本中。

afc2ef2380919702746a30faa2942572.gif

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

💦 复杂颜色提取器实现

下面我们来构建一个复杂颜色提取器,它实现的功能如下图所示:我们多次点击不同图像的多个位置,我们会按照顺序编号和记录颜色(注意颜色框左上角的红色数字),并把颜色保存到列表中。

b9e4214f45a85685eab4842667891b29.gif

我们还是需要构建 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值序列。

5bd4245b555bf0d4d64c497becfff9cf.png

参考资料

推荐阅读

e9190f41b8de4af38c8a1a0c96f0513b~tplv-k3u1fbpfcp-zoom-1.image

python 中如何取出colomap部分的颜色范围
平常我们在绘制填色图时,经常会使用到各种colormap,但是python提供的一些 colormap色标有时候不那么合适,需要我们裁剪一下进行使用。
海龟编程 python绘图工具turtle库的用法 turtle库使用方法大全,画笔设置 画布设置 绘图设置,画笔粗细,画笔颜色, 画笔速度。
海龟编程 Python绘图工具trutle库的使用方法 trutle库命令大全,总结了常用命令,学会这些命令,玩转turtle库
Python + Opencv2 实现轮廓提取,轮廓区域面积计算; 对图像处理时,会遇到这样一个场景:找到图像主体轮廓,这是其一,可能为了凸显轮廓,需要用指定的颜色进行标记;轮廓标记完可能任务还没有结束,还需对轮廓所勾勒的像素面积区域统计计算。
带你了解Python炫酷的颜色输出与进度条打印
大家平时在Linux/Windows下安装软件时,经常会出现进度条和百分比的提示,Python是否能实现这样的打印?安装过程中,经常会看到很多带颜色的安装说明,我们在python输出时,确是千篇一律的黑底白色,是否想过打印的炫酷一些呢? 以上操作其实很简单,今天就来教教大家,通过几分钟的学习让之后代码的输出变得与众不同!