一定要用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的以下教程和文章进行系统学习:
颜色提取器实现
导入工具库
首先我们需要导入本次所需的工具库,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
一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵的更多相关文章
- 用Python做一个知乎沙雕问题总结
用Python做一个知乎沙雕问题总结 松鼠爱吃饼干2020-04-01 13:40 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以 ...
- 使用python做一个IRC在线下载器
使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...
- 用python做youtube自动化下载器 代码
目录 项目地址 思路 流程 1. post i. 先把post中的headers格式化 ii.然后把参数也格式化 iii. 最后再执行requests库的post请求 iv. 封装成一个函数 2. 调 ...
- 在树莓派上用 python 做一个炫酷的天气预报
教大家如何在树莓派上自己动手做一个天气预报.此次教程需要大家有一定的python 基础,没有也没关系,文末我会放出我已写好的代码供大家下载. 首先在开始之前 需要申请高德地图API,去高德地图官网注册 ...
- 听歌识曲--用python实现一个音乐检索器
听歌识曲,顾名思义,用设备"听"歌曲,然后它要告诉你这是首什么歌.而且十之八九它还得把这首歌给你播放出来.这样的功能在QQ音乐等应用上早就出现了.我们今天来自己动手做一个自己的听歌 ...
- 用python做一个搜索引擎(Pylucene)
什么是搜索引擎? 搜索引擎是“对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分”.如图1是搜索引擎的一般结构,信息搜集模块从网络采集信息到网络信息库之中(一般 ...
- 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。
最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码 为了快速实现我们的目标,我们 ...
- 用Python做一个简单的翻译工具
编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过 ...
- [python]做一个简单爬虫
为什么选择python,它强大的库可以让你专注在爬虫这一件事上而不是更底层的更繁杂的事 爬虫说简单很简单,说麻烦也很麻烦,完全取决于你的需求是什么以及你爬的网站所决定的,遇到的第一个简单的例子是pas ...
- python做一个数独小游戏
最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...
随机推荐
- 部署一个生产级别的 Kubernetes 应用(以Wordpress为例)
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247487811&idx=1&sn=67b39b73 ...
- 第二章:视图层 - 6:QueryDict对象
类的原型:class QueryDict[source] 在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例.也就是说你可以按本文下面提供的方 ...
- frpc穿透报错 日志显示 http: proxy error: no such domain 解决办法
问题出在客户端的设置上,比如你的frps服务器IP为114.114.114.114,设置的vhost_http_port端口为 8080,在客户端设置的是域名fk.abc.com 指向frps所在服务 ...
- SecureCRT登录centos日常操作
ssh登录客户端很多,个人还是习惯使用SecureCRT,非常快捷.简单.针对日常小伙伴经常咨询的常用操作简单记录如下: 建立ssh2连接,比较简单,填写服务器ip及对应的登录用户即可. 登录界面中文 ...
- 将 N 叉树编码为二叉树
将 N 叉树编码为二叉树 作者:Grey 原文地址: 博客园:将 N 叉树编码为二叉树 CSDN:将 N 叉树编码为二叉树 题目描述 将一棵n叉树编码为一棵二叉树,并对二叉树进行解码,得到原始的n叉树 ...
- H3C交换机配置DHCP服务器
dhcp server ip-pool vlan4020 network 10.3.7.0 mask 255.255.255.0 gateway-list 10.3.7.254 dns-list 20 ...
- Spring 深入——IoC 容器 01
IoC容器的实现学习--01 目录 IoC容器的实现学习--01 简介 IoC 容器系列的设计与实现:BeanFactory 和 ApplicationContext BeanFactory load ...
- bootstrapValidator 参数校验框架
bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...
- el-cascader中最后一级显示为空在前端处理数据
el-cascader中最后一级显示为空是因为从后端接口获取的数据最后一个children为空 <el-cascader :options="treeDeptData" st ...
- CentOS 7 安全基线检查
注意:操作时建议做好记录或备份 1.设置密码失效时间 | 身份鉴别 描述: 设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项. 加固建议: 使用非 ...