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实现图像的颜色检测相关推荐

  1. 使用OpenCV和Python计算图像的“彩色度”

    使用OpenCV和Python计算图像"彩色度" 1. 效果图 2. 炫彩度量方法是什么? 3. 源代码 参考 你是否尝试过计算每个图像的炫彩值,并根据炫彩值对自己的图像数据集进行 ...

  2. 使用OpenCV和Python从图像中提取形状

    Welcome to the first post in this series of blogs on extracting features from images using OpenCV an ...

  3. OpenCV for Python之图像RIO与泛洪填充

    OpenCV for Python之图像RIO与泛洪填充 1 ROI与泛函填充 2 ROI 3 泛洪填充 Opencv4 官方文档 : https://docs.opencv.org/4.2.0/ O ...

  4. OpenCV for Python之改变图片颜色

    OpenCV for Python之改变图片颜色 1.环境 2 直接修改通道值 3.与.或.非.异或操作 Opencv4 官方文档 : https://docs.opencv.org/4.2.0/ O ...

  5. opencv for python的图像梯度算子以及canny边缘检测

    opencv for python的图像梯度算子以及canny边缘检测 一.图像梯度算子: 二.Canny边缘检测(一个多级边缘检测算法): 一.图像梯度算子: 1.概念简介(部分引自百度百科): 图 ...

  6. python图色检测_利用python打开摄像头及颜色检测方法

    最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小 ...

  7. task2:opencv的python接口图像储存、色彩空间、

    task2:图像储存.色彩空间.图像的算数运算. 笔记: 使用managers.WindowManager抽象窗口和键盘: main.py: import cv2 from manager impor ...

  8. 使用OpenCV,Python进行图像哈希(差分哈希 dHash)处理

    使用OpenCV,Phthon进行图像哈希处理的一个重要应用是去除重复的图像: 当你有多个相册的图片,进行合并时,so boring,有一些图片是重复的,肉眼来看太难删除了. 图像哈希可以帮助你完美的 ...

  9. 使用opencv和python实现图像的智能处理_机器学习:使用opencv和python进行智能图像处理...

    译者序 序 前言 审校者简介 章 品味机器学习 1 1.1 初步了解机器学习 1 1.2 机器学习可以解决的事情 3 1.3 初步了解 Python 4 1.4 初步了解 OpenCV 4 1.5 安 ...

  10. opencv实战3-处理图像的颜色

    1 处理图像的颜色 1.1 提取指定的颜色区域 cv::floodFill() 函数 1.2 分割图像 cv::grabCut()函数,用于从静态图像中提取前景物体. 1.3 转换颜色的表示方法 HS ...

最新文章

  1. 使用WindowsLive Writer2012和officeWord2013发布到博客园全面总结
  2. Oracle数据删除后恢复
  3. initramfs 文件系统
  4. sctp和tcp的区别
  5. linux系统atom安装教程,Ubuntu/Linux Mint上安装Atom文本编辑器
  6. 关于java中next,nextInt,nextLine的区别
  7. redis3.0伪集群安装步骤
  8. 测试机器学习算法的好坏
  9. 为什么说《让子弹飞》是古今中外的神片
  10. DaisyDisk for Mac磁盘清理
  11. arcpy 实现列举目录下的要素类与描述矢量数据要素类
  12. 遇到ffmpeg错误:non monotonically increasing dts to muxer in stream
  13. JS 简易控制台插件 [供 博客, 论坛 运行js用]
  14. 压缩包上传 压缩并解压缩Rar/Zip
  15. 从零开始搭建自己的vue组件库——01创建
  16. 【Linux】Linux常识28问
  17. 【全开源+免费更新】doodoo.js快速入门教程
  18. Spring Security 实战:实现自定义退出登录
  19. 掌财社骑士:顾比均线怎么设置?顾比均线的投资技巧介绍
  20. OpenCV C++案例实战二十九《遥感图像分割》

热门文章

  1. php 均匀随机算法,PHP算法学习(4) 随机算法
  2. SAP系统常用配置参数设定
  3. 【网页前端】HTML基本语法之排版标签和表单标签
  4. Windows 下部署 Seafile 服务器
  5. 欧拉筛法筛素数(接近O(n),取模操作稍微慢一点) 4E7之内的素数 Apare_xzc
  6. artdialog ajax新增,artDialog 对话框组件使用简介
  7. JVM MAT分析器中的shallow heap 和 retained heap详解
  8. navigator、history对象
  9. 面板模型进行熵值法分析
  10. 绑定变量窥视 oracle,不均衡分区和绑定变量窥视导致的查询计划错误