作者:韩信子@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官方GitHubhttps://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_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做一个颜色提取器! ⛵的更多相关文章

  1. 用Python做一个知乎沙雕问题总结

    用Python做一个知乎沙雕问题总结 松鼠爱吃饼干2020-04-01 13:40 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以 ...

  2. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  3. 用python做youtube自动化下载器 代码

    目录 项目地址 思路 流程 1. post i. 先把post中的headers格式化 ii.然后把参数也格式化 iii. 最后再执行requests库的post请求 iv. 封装成一个函数 2. 调 ...

  4. 在树莓派上用 python 做一个炫酷的天气预报

    教大家如何在树莓派上自己动手做一个天气预报.此次教程需要大家有一定的python 基础,没有也没关系,文末我会放出我已写好的代码供大家下载. 首先在开始之前 需要申请高德地图API,去高德地图官网注册 ...

  5. 听歌识曲--用python实现一个音乐检索器

    听歌识曲,顾名思义,用设备"听"歌曲,然后它要告诉你这是首什么歌.而且十之八九它还得把这首歌给你播放出来.这样的功能在QQ音乐等应用上早就出现了.我们今天来自己动手做一个自己的听歌 ...

  6. 用python做一个搜索引擎(Pylucene)

    什么是搜索引擎? 搜索引擎是“对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分”.如图1是搜索引擎的一般结构,信息搜集模块从网络采集信息到网络信息库之中(一般 ...

  7. 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。

    ​    最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码    为了快速实现我们的目标,我们 ...

  8. 用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过 ...

  9. [python]做一个简单爬虫

    为什么选择python,它强大的库可以让你专注在爬虫这一件事上而不是更底层的更繁杂的事 爬虫说简单很简单,说麻烦也很麻烦,完全取决于你的需求是什么以及你爬的网站所决定的,遇到的第一个简单的例子是pas ...

  10. python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

随机推荐

  1. SpringBoot+MyBatis Plus对Map中Date格式转换的处理

    在 SpringBoot 项目中, 如何统一 JSON 格式化中的日期格式 问题 现在的关系型数据库例如PostgreSQL/MySQL, 都已经对 JSON 类型提供相当丰富的功能, 项目中对于不需 ...

  2. Mapper 实体转换Entiy to Dto

    实际使用中发现很多问题 如果用EFcore 框架,这个表达式树生成一个新的实体导致EFcore 跟踪失败!/// <summary> /// 生成表达式目录树 泛型缓存 /// </ ...

  3. .NET MAUI 社区工具包 1.3版本发布

    2022 年 10 月 4 日,微软发布了 .NET MAUI 社区工具包的 1.3 版,具体参见微软官方博客:https://devblogs.microsoft.com/dotnet/announ ...

  4. Java学习之路:运算符

    2022-10-10 10:34:08 1 运算符 算术运算符:+, -, *, /, %, ++, -- 赋值运算符:= 关系运算符:>, <, >=, <=, ==, != ...

  5. SpringBoot后端接口项目

    创建SpringBoot项目 项目目录 实体类 点击查看代码 package com.bai.entity; import com.baomidou.mybatisplus.annotation.Id ...

  6. CURL提交--POST/GET-带header信息

    function https_request($url, $param, $data = '', $method = 'GET', $headers = '') { $opts = array( CU ...

  7. Linux学习记录---(1、基本命令)

    文章目录 1 .基本命令 1.1.查看当前文件夹下的文件 1.2.进入某一个文件夹 1.3.一次进入多个文件夹 1.4.返回上一级 1.5.直接进入根目录 1.6.创建一个目录 2.Redis中的相关 ...

  8. 表单快速启用城市地区功能 齐博x1齐博x2齐博x3齐博x4齐博x5齐博x6齐博x7齐博x8齐博x9齐博x10

    比如分类系统\application\fenlei\config.php 修改这个文件,里边加入参数 'use_area'=>true, 那么会员中心与后台的,修改发布页面,都会自动加上城市地区 ...

  9. 【JavaWeb】学习笔记——JSP

    概念 全称:Java Server Pages, Java服务端页面 描述:一种动态的网页技术,可以在其中定义HTML.JS.CSS等静态内容,以及Java代码的动态内容 说明:JSP = HTML ...

  10. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(31)-Fiddler如何抓取Android系统中Flutter应用程序的包

    1.简介 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.Flutter应用程序是用Dart编写的,这是一种由Google在7年多前创建的语言.Flut ...