当前位置: 首页 > news >正文

OpenCV颜色检测

OpenCV颜色检测

    • 前言
    • 策略分析
    • 根据颜色检测目标对象
    • 相关链接

前言

绿幕技术是一种经典的视频编辑技术,可以用于将人物置于不同的背景中。例如在电影制作中,技术的关键在于演员不能身着特定颜色的衣服(比如绿色),站在只有绿色的背景前。然后,通过识别绿色像素,确定背景并替换这些像素上的内容。

策略分析

在本节中,我们将了解如何利用 cv2.inRangecv2.bitwise_and 方法检测给定图像中的绿色像素,模型策略如下:

  1. 将图像从 RGB 转换为 HSV 空间
  2. 指定 HSV 空间中对应绿色的上下限
  3. 识别绿色像素,生成掩码 mask
  4. 在原始图像和掩码图像之间执行按位与 (bitwise_and`)运算

根据颜色检测目标对象

(1) 导入所需库并加载图像:

import cv2, numpy as np
import matplotlib.pyplot as pltimg = cv2.imread('5.jpeg', 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

示例图像
(2) 将图像转换到 HSV (Hue-Saturation-Value) 空间,从 RGB 转换为 HSV 空间将亮度与颜色分离,以便可以轻松提取每个像素的颜色信息:

hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

(3) 定义 HSV 空间中绿色的上下阈值:

lower_green = np.array([45,100,100])
upper_green = np.array([80,255,255])

(4) 生成掩码,仅激活落在定义的上下阈值内的像素。cv2.inRange 是一种比较操作,用于检查像素值是否在最小值和最大值之间:

mask = cv2.inRange(hsv, lower_green, upper_green)

(5) 在原始图像和掩码之间执行 cv2.bitwise_and 操作以获取结果图像:

res = cv2.bitwise_and(img, img, mask=mask)plt.subplot(131)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original image')
plt.subplot(132)
plt.imshow(mask, cmap='gray')
plt.title('Mask on image')
plt.subplot(133)
plt.imshow(cv2.cvtColor(res, cv2.COLOR_BGR2RGB))
plt.title('Resulting image')
plt.show()

处理结果
从上图中可以看出,算法忽略了图像中的其余内容,只关注特定的颜色,使用此算法,可以使用 cv2.bitwise_not 操作生成一个非绿色的前景蒙版,并执行绿幕技术。
本节介绍了如何识别图像中的颜色空间,如果想将另一张图像叠加到识别的绿幕上,我们会选择另一幅图像中选择与原始图像中的绿色像素相对应的像素。

相关链接

OpenCV简介与图像处理基础
OpenCV中的色彩空间和色彩映射
语义分割详解
图像分割详解

相关文章:

  • 网络编程(六)TCP并发服务器
  • B3996 [洛谷 202406GESP 模拟 三级] 小洛的数字游戏
  • SpringMVC:拦截Mybatis的mapper
  • 如何设计高可用的淘客返利系统
  • Synchronized、volatile与ReentrantLock:比较这些同步机制在Java并发编程中的应用和区别
  • Spring响应式编程之Reactor操作符
  • Kubernetes 托管与非托管有哪些区别?应该怎么选型?
  • LeetCode:503. 下一个更大元素 II(Java 单调栈)
  • 如何在Web开发中创建、删除和修改按钮:实用指南
  • 华为仓颉语言:编程语言的新篇章
  • 说说MQ在你项目中的应用(一)
  • IOS开发学习日记(十六)
  • TXL编程语言环境安装
  • Redis 高可用 sentinel
  • 使用 JavaScript 获取电池状态
  • php的引用
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 2019年如何成为全栈工程师?
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTTP--网络协议分层,http历史(二)
  • JavaScript类型识别
  • Making An Indicator With Pure CSS
  • Promise面试题,控制异步流程
  • React-Native - 收藏集 - 掘金
  • Vue小说阅读器(仿追书神器)
  • web标准化(下)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 排序(1):冒泡排序
  • 配置 PM2 实现代码自动发布
  • 如何胜任知名企业的商业数据分析师?
  • 数据结构java版之冒泡排序及优化
  • 阿里云服务器购买完整流程
  • 积累各种好的链接
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #define,static,const,三种常量的区别
  • #单片机(TB6600驱动42步进电机)
  • (0)Nginx 功能特性
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (层次遍历)104. 二叉树的最大深度
  • (十六)Flask之蓝图
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • ***详解账号泄露:全球约1亿用户已泄露
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .gitignore文件—git忽略文件
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net Web窗口页属性
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开发人员必知的八个网站
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET应用架构设计:原则、模式与实践 目录预览
  • [ C++ ] STL---仿函数与priority_queue
  • [2010-8-30]
  • [Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解