使用OpenCV和Python实现图像的颜色检测
1 背景
所以,我在这里。乘坐Amtrak 158火车,经过长途旅行后回家。
很热。AC几乎无法工作。婴儿在我旁边尖叫,而陪伴的母亲却孤注一掷地看着窗外,清楚地质疑生孩子是否是正确的人生决定。
最重要的是,Wi-Fi无法正常工作。
幸运的是,我带来了Game Boy和Pokemon游戏系列。
当我将可信赖的Blue版本滑入我的Game Boy时,我想:也许我可以做一点计算机视觉相关的工作,而不是与Gary Oak对抗第一千次。
老实说,仅使用颜色就能够分割每个游戏卡带真的不是很酷吗?
拿起一杯凉爽的水来对抗不能用的AC,并用一对耳塞挡住哭泣的孩子。因为在这篇文章中,我将向您展示如何使用OpenCV和Python进行颜色检测。
OpenCV和python版本:
- Python 2.7/Python
- OpenCV 2.4.X/OpenCV 3.0+
2 OpenCV和Python颜色检测
让我们开始吧。
打开您喜欢的编辑器并创建一个名为detect_color.py
的文件:
# import the necessary packages
import numpy as np
import argparse
import cv2# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image")
args = vars(ap.parse_args())# load the image
image = cv2.imread(args["image"])
我们将从第2-4行导入必要的程序包开始,使用NumPy
进行数值处理,使用argparse
解析命令行参数,并使用cv2
进行OpenCV绑定。
然后,第7-9行处理解析我们的命令行参数。我们只需要一个--image
即可,它是image
在磁盘上的存储路径。
然后,在第12行上,从磁盘加载image
。
现在,这是有趣的部分。
我们希望能够检测到图像中的每个Game Boy墨盒。这意味着我们必须识别图像中的红色,蓝色,黄色和灰色。
让我们继续定义以下颜色列表:
# define the list of boundaries
boundaries = [([17, 15, 100], [50, 56, 200]),([86, 31, 4], [220, 88, 50]),([25, 146, 190], [62, 174, 250]),([103, 86, 65], [145, 133, 128])
]
我们在这里要做的就是在RGB颜色空间中定义一个boundaries
列表(或者说BGR,因为OpenCV将图像表示为NumPy数组以相反的顺序),其中列表中的每个条目都是一个具有两个值的元组:下限和上限列表。
例如,让我们看一下元组([17, 15, 100], [50, 56, 200])
。
在这里,我们说图像中所有具有R>=100,B>=15和G>=17以及R<=200,B<=56和G<=50的像素将被视为红色。
现在我们有了boundaries
列表,我们可以使用cv2.inRange
函数执行实际的颜色检测了。
让我们来看看:
# loop over the boundaries
for (lower, upper) in boundaries:# create NumPy arrays from the boundarieslower = np.array(lower, dtype = "uint8")upper = np.array(upper, dtype = "uint8")# find the colors within the specified boundaries and apply# the maskmask = cv2.inRange(image, lower, upper)output = cv2.bitwise_and(image, image, mask = mask)# show the imagescv2.imshow("images", np.hstack([image, output]))cv2.waitKey(0)
我们开始在第2行上遍历boundaries
的上限和下限,然后在第4行和第5行上将上限和下限转换为NumPy数组。这两行似乎可以省略,当您使用OpenCV的Python绑定时,OpenCV期望这些限制为NumPy数组。此外,由于这些像素值在[0, 256]范围内,因此我们可以使用无符号8位整型数据类型。
要使用OpenCV执行实际的颜色检测,请看我们在第9行使用的cv2.inRange
函数。
cv2.inRange
函数需要三个参数:
- 第一个是要执行颜色检测的图像
- 第二个是要检测的颜色的下限
- 第三个是要检测的颜色的上限
调用cv2.inRange
之后,将返回一个二进制掩码,其中白色像素(255)表示落入上限和下限范围内的像素,而黑色像素(0)则不属于该范围。
注意:我们正在RGB颜色空间中执行颜色检测。但是您也可以在HSV或L*a*b*
颜色空间中轻松地执行此操作。您只需要调整各个颜色空间的上限和下限即可。
为了创建输出图像,我们在第10行上应用了mask
。该行仅调用cv2.bitwise_and
,仅显示图像中在mask
中具有相应白色(255)值的像素。
最后,我们在第13和14行上输出图像显示。
不错。只有14行代码,其中绝大多数是导入,参数解析和注释。
让我们继续运行脚本:
$ python detect_color.py --image pokemon_games.png
如果您的环境配置正确(意味着您已安装了带有Python绑定的OpenCV),则输出图像为:
3 总结
在这篇博客文章中,我向您展示了如何使用OpenCV和Python执行颜色检测。
要检测图像中的颜色,您需要做的第一件事就是为像素值定义上限和下限。
定义上限和下限后,然后调用cv2.inRange方法,该方法将返回一个mask,指定哪些像素落入指定的上限和下限范围内。
最后,现在有了mask,您可以使用cv2.bitwise_and
函数将其应用于图像。
我的火车离家只有几站路,所以我最好把这篇文章整理一下。希望你觉得它有用!
4 完整代码
# import the necessary packages
import numpy as np
import argparse
import cv2# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image")
args = vars(ap.parse_args())# load the image
image = cv2.imread(args["image"])# define the list of boundaries
boundaries = [([17, 15, 100], [50, 56, 200]),([86, 31, 4], [220, 88, 50]),([25, 146, 190], [62, 174, 250]),([103, 86, 65], [145, 133, 128])
]# loop over the boundaries
for (lower, upper) in boundaries:# create NumPy arrays from the boundarieslower = np.array(lower, dtype = "uint8")upper = np.array(upper, dtype = "uint8")# find the colors within the specified boundaries and apply# the maskmask = cv2.inRange(image, lower, upper)output = cv2.bitwise_and(image, image, mask = mask)# show the imagescv2.imshow("images", np.hstack([image, output]))cv2.waitKey(0)
使用OpenCV和Python实现图像的颜色检测相关推荐
- 使用OpenCV和Python计算图像的“彩色度”
使用OpenCV和Python计算图像"彩色度" 1. 效果图 2. 炫彩度量方法是什么? 3. 源代码 参考 你是否尝试过计算每个图像的炫彩值,并根据炫彩值对自己的图像数据集进行 ...
- 使用OpenCV和Python从图像中提取形状
Welcome to the first post in this series of blogs on extracting features from images using OpenCV an ...
- OpenCV for Python之图像RIO与泛洪填充
OpenCV for Python之图像RIO与泛洪填充 1 ROI与泛函填充 2 ROI 3 泛洪填充 Opencv4 官方文档 : https://docs.opencv.org/4.2.0/ O ...
- OpenCV for Python之改变图片颜色
OpenCV for Python之改变图片颜色 1.环境 2 直接修改通道值 3.与.或.非.异或操作 Opencv4 官方文档 : https://docs.opencv.org/4.2.0/ O ...
- opencv for python的图像梯度算子以及canny边缘检测
opencv for python的图像梯度算子以及canny边缘检测 一.图像梯度算子: 二.Canny边缘检测(一个多级边缘检测算法): 一.图像梯度算子: 1.概念简介(部分引自百度百科): 图 ...
- python图色检测_利用python打开摄像头及颜色检测方法
最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小 ...
- task2:opencv的python接口图像储存、色彩空间、
task2:图像储存.色彩空间.图像的算数运算. 笔记: 使用managers.WindowManager抽象窗口和键盘: main.py: import cv2 from manager impor ...
- 使用OpenCV,Python进行图像哈希(差分哈希 dHash)处理
使用OpenCV,Phthon进行图像哈希处理的一个重要应用是去除重复的图像: 当你有多个相册的图片,进行合并时,so boring,有一些图片是重复的,肉眼来看太难删除了. 图像哈希可以帮助你完美的 ...
- 使用opencv和python实现图像的智能处理_机器学习:使用opencv和python进行智能图像处理...
译者序 序 前言 审校者简介 章 品味机器学习 1 1.1 初步了解机器学习 1 1.2 机器学习可以解决的事情 3 1.3 初步了解 Python 4 1.4 初步了解 OpenCV 4 1.5 安 ...
- opencv实战3-处理图像的颜色
1 处理图像的颜色 1.1 提取指定的颜色区域 cv::floodFill() 函数 1.2 分割图像 cv::grabCut()函数,用于从静态图像中提取前景物体. 1.3 转换颜色的表示方法 HS ...
最新文章
- 使用WindowsLive Writer2012和officeWord2013发布到博客园全面总结
- Oracle数据删除后恢复
- initramfs 文件系统
- sctp和tcp的区别
- linux系统atom安装教程,Ubuntu/Linux Mint上安装Atom文本编辑器
- 关于java中next,nextInt,nextLine的区别
- redis3.0伪集群安装步骤
- 测试机器学习算法的好坏
- 为什么说《让子弹飞》是古今中外的神片
- DaisyDisk for Mac磁盘清理
- arcpy 实现列举目录下的要素类与描述矢量数据要素类
- 遇到ffmpeg错误:non monotonically increasing dts to muxer in stream
- JS 简易控制台插件 [供 博客, 论坛 运行js用]
- 压缩包上传 压缩并解压缩Rar/Zip
- 从零开始搭建自己的vue组件库——01创建
- 【Linux】Linux常识28问
- 【全开源+免费更新】doodoo.js快速入门教程
- Spring Security 实战:实现自定义退出登录
- 掌财社骑士:顾比均线怎么设置?顾比均线的投资技巧介绍
- OpenCV C++案例实战二十九《遥感图像分割》
热门文章
- php 均匀随机算法,PHP算法学习(4) 随机算法
- SAP系统常用配置参数设定
- 【网页前端】HTML基本语法之排版标签和表单标签
- Windows 下部署 Seafile 服务器
- 欧拉筛法筛素数(接近O(n),取模操作稍微慢一点) 4E7之内的素数 Apare_xzc
- artdialog ajax新增,artDialog 对话框组件使用简介
- JVM MAT分析器中的shallow heap 和 retained heap详解
- navigator、history对象
- 面板模型进行熵值法分析
- 绑定变量窥视 oracle,不均衡分区和绑定变量窥视导致的查询计划错误