使用OpenCV进行目标提取详细教程(附python代码演练)

news2024/11/24 7:26:54

61c672a71d77327921e9af05f8ad8b48.jpeg

今天的文章将讨论并指导你识别图像中的对象,使用 OpenCV 对这些对象进行遮罩处理。让我们开始吧!

HSV 色标

请花一点时间观察下面的图片。每个图块似乎是不同的颜色,对吧?但是有一个有趣的地方:如果我们仔细思考,实际上可以将它们都归为绿色。然而,如果我们仔细观察,我们会注意到它们是不同的绿色调。这是怎么回事呢?

1329b84f1d708d1ecfaa92ec1e732d7e.jpeg

绿色色调

尽管这些瓷砖具有相同的总体颜色,但它们有不同的组成部分,构成了它们各自的特定绿色调。正如我们之前讨论的那样,这些组成部分被称为红色、绿色和蓝色(RGB)。因此,虽然它们都属于绿色类别,但它们的RGB组合是不同的,从而形成我们观察到的不同绿色调。

但是,请等一下,这背后是否还有更多的东西?这个有趣的现象背后是否还有其他原因?确实如此!

你以前一定在画图软件中见过这个选项卡。

16450b14a1e3b29a587ac7ab2827f9f6.jpeg

定义绘画上的自定义颜色

你可以看到,除了 (R)ed、(G)reen、(B)lue 之外,还有 3 个参数,分别是 (H)ue、(S)at 和 (L)um(HSL 色调)。

由于 HSL 和 HSV,我们可以实现如此多种色调。HSV 代表色相、饱和度和值。让我们谈谈 HSV,这对我们在 OpenCV 中的工作很有用。

304cc062d60163fd09b59dc79ed0b955.jpeg

HSV 色锥

H = 色调:当我们谈论色调时,我们谈论的是最纯粹的颜色形式。想想你在彩虹中看到的颜色——红色、橙色、黄色、绿色、蓝色、靛蓝和紫色。每一种都是不同的色调,代表特定的光波长。

色调的范围是 0 到 360 度。

9945fc6258c35ff046fd0ce205eec2ba.jpeg

S = 饱和度:饱和度是指颜色的鲜艳程度和强度。高度饱和的颜色鲜艳而丰富,而不饱和的颜色则显得更加柔和或浅色。饱和度赋予颜色深度和影响力。

饱和度的范围为 0–1(或 0–255)

V = 值:颜色值与颜色的亮度或暗度有关。它由物体反射或吸收的光量决定。高值的颜色是亮的,而低值的颜色是暗的。值在创造对比和增加视觉构图的深度方面起着至关重要的作用。

值的范围为 0–1(或 0–255)

让我们了解为什么需要将 BGR 图像转换为 HSV 颜色。

  1. 改进的颜色处理

  2. 简化的基于颜色的分析

  3. 对光照变化的鲁棒性

  4. 与人类感知的兼容性

现在我们将了解如何在 Spyder OpenCV 中使用 HSV 图像。

对象遮罩

假设你有 3 张车牌照。

ba0fc9c60ad1fa55c4e860efd23f5c66.jpeg

我们正在尝试提取这些车辆的车牌号。我们可以用 BGR 图像来实现吗?

我们当然不能。这背后的原因是,我们在这里看到的橙色/黄色是由 (R)ed、(G)reen、(B)lue 的不同成分组成的,并且它们不是恒定的。此外,图像之间的亮度、饱和度和曝光度也完全不同。

1b7a783597dceea98c6bbde9fd6cca1e.jpeg

每幅图像中橙色的 RBG 成分

因此很明显,我们无法从 BGR 图像中提取某种颜色。我们需要将此 BGR 图像转换为 HSV 图像。让我们看看如何做到这一点。

#import necessary libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt

#using opencv to read an image
#BGR Image
plate_image_1 = cv2.imread("C:/users/public/pictures/numberp_1.png")

让我们想象一下这个plate_image_1

cv2.namedWindow("BGR Image", cv2.WINDOW_NORMAL);
cv2.imshow("BGR Image",plate_image_1);

cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()
a0d68778cc9911209ce07db11bede143.jpeg

现在让我们将此plate_image_1 转换为HSV 格式。为此,我们使用cv2.cvtColor() 。我们可以使用此函数将 BGR/RGB 转换为 HSV、RGB 转换为 BGR、在 RGB/BGR 和灰度之间转换以及更多选项。

f5956867dc9e98db69fc2af4551335ba.jpeg
HSV_im_1 = cv2.cvtColor(plate_image_1,cv2.COLOR_BGR2HSV)

让我们想象一下这个 HSV 图像。

a3d9d643cec07250e25f4030678549fe.jpeg

使用 OpenCV 将 BGR 图像转换为 HSV 色标

这对我们来说确实很奇怪,我们将看看如何从中提取橙色/黄色。

之前我们讨论过图像之间的亮度、饱和度和曝光完全不同。为了解决这个问题,我们为要提取的颜色定义了一个范围。准确地说,我们按照自己的意愿为某种颜色定义了上边界和下边界。

这是通过查看 HSV 色锥来完成的

首先,我们确定色相的范围。色调范围从 0 到 360。每 30 度我们就会得到一种不同的颜色。让我们看看它的橙色。

61f2f8c9052b32371026bf32348d199e.jpeg

通过粗略估计 15-20 度的下色相和 40-50 度的上色相,我们可以清楚地确定包含橙色每种色调的范围。

对于饱和度和明度,我们获得从 0 到 1 的整个范围,以适应图像中的全部亮度变化。这样可以准确表示色谱内较亮或较暗的色调。

3283e39f1f076b6627a6c352f976cbb7.jpeg

让我们在 Spyder 中定义它。

Orange_UB = np.array([40,255,255])
Orange_LB = np.array([20,0,0])

现在我们定义一个遮罩来跟踪图像中的橙色。这是通过使用 cv2.inRange() 来完成的。我们介绍了上界和下界以及执行遮罩所需的图像。

mask = cv2.inRange(HSV_im_1,Orange_LB,Orange_UB)

让我们想象一下这个遮罩。

cv2.namedWindow("HSV Orange masked", cv2.WINDOW_NORMAL);
cv2.imshow("HSV Orange masked",mask);

cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()
f95b31b463ba4ae866a7d5983acbbcce.jpeg

就快到了!!我们可以几乎清楚地看到车牌,但也有其他不必要的像素被掩盖。我们如何优化我们的遮罩?我们需要改变饱和度和值的范围,直到我们得到一个令人满意的遮罩。

2dbff935cae3c5274149a87565865ba0.jpeg

差不多了!让我们对其进行更多微调。

d28267d88b49c76a8eb16c2b234951c3.jpeg

看起来不错!!

这就是我们从图像中提取特定颜色(范围)的对象的方法。

完整代码

#import necessary libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt

#using opencv to read an image #BGR Image
plate_image_1 = cv2.imread("C:/users/public/pictures/numberp_1.png")

#converting BGR to HSV
HSV_im_1 = cv2.cvtColor(plate_image_1,cv2.COLOR_BGR2HSV)

#defining HSV range
Orange_UB = np.array([40,255,245])
Orange_LB = np.array([20,55,180])

#masking
mask = cv2.inRange(HSV_im_1,Orange_LB,Orange_UB)

#visualizing
cv2.namedWindow("HSV Orange masked", cv2.WINDOW_NORMAL);
cv2.imshow("HSV Orange masked",mask);

cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

591d662bc30ee51998bd894002d82389.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B2B2C跨境独立站后台管理--支付系统开源搭建

要搭建一个B2B2C跨境独立站后台管理的支付系统,您可以按照以下步骤进行开发: 1. 确定需求和功能:首先,您需要明确支付系统的功能和需求,包括接入第三方支付平台、实现支付功能、订单管理、退款管理、对账功能等。 2.…

无涯教程-Perl - eval函数

描述 该函数在执行时判断EXPR,就好像EXPR是一个单独的Perl脚本一样。这使您可以在程序中使用单独的,也许是用户提供的Perl脚本。每次调用函数时,都会分别判断eval EXPR语句。 当解析脚本的其余部分时(执行之前),第二种形式判断BLOCK。 语法 以下是此函数的简单语法- eval …

Redis探索之旅

目录 今日良言:有志者自有千计万计,无志者只感千难万难 一、简介 二、Redis的安装 三、Redis的简单使用 四、Redis相关知识点 1.缓存分类 2.五大基本数据类型使用 3.持久化 4.常见面试题 今日良言:有志者自有千计万计,无…

【怎么提高性能和解决高并发】

怎么解决高并发 解决高并发的整体流程大概是: 先进行性能评估、再进行性能测试、然后找到程序可以承受的临界点、最后针对出问题的地方,进行优化。当然硬件设置对高并发的影响也很重要,如果达到硬件天花板,那么再怎么优化程序都…

如何实现网络数据传输

目录 前言 1.理解源IP地址和目的IP地址 2.理解端口号 2.1端口号与进程pid的关系 2.2源端口号和目的端口号 3.协议 3.1TCP协议 3.2认识UDP协议 4.网络字节序 5.socket编程接口 总结 前言 在上一篇文章网络框架中给大家对网络的整体进行了一个宏观的介绍,这…

理解递归方法

递归相关问题 树和二叉树相关的大部分问题二分查找相关问题快速排序、归并排序相关问题所有回溯的问题所有动态规划的问题 本质与特征 本质 本质就是方法的调用,而且是方法自己调用自己。 特征 执行时范围不断缩小,这样才能触底反弹终止(结…

使用MIT Kerberos Ticket Manager在windows下浏览器访问hadoop页面

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置说明安装Firefox浏览器安装MIT Kerberos Ticket Manager客户端配置krb5.ini文件配置MIT Kerberos Ticket Manager客户端配置Firefox浏览器代理参数 访问WebUI 前言 kerberos是一种计算机…

亚马逊关键词下单的作用

在亚马逊上,关键词对于商品的搜索和发现起着非常重要的作用。当卖家在亚马逊上发布商品时,他们可以使用相关的关键词来描述该商品,这些关键词通常是与该商品相关的词汇或短语。 关键词下单的作用如下: 1、商品搜索: 买…

vue3+antd——实现个人中心页面+同步更改头部用户信息——基础积累

之前写过一篇文章关于vue3antd的框架模板,链接如下:http://t.csdn.cn/9dZMS 首先感谢大神提供的后台管理系统的模板,在此基础上改动要简单很多,主要是自己有很多内容不太敢随意改动。。。 直接看【个人中心】页面的效果图&#…

JavaScript事件委托与事件流+牛客例题

事件流: 概念:事件完整执行过程中的流动路径 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父 注意&…

TEMU美国儿童文具亚马逊CPC测试标准

美国站儿童文具类上架跨境电商平台美国站或者出口美国需要提交CPC认证,才能进入美国市场,由CPSC 认可的实验室出具的检测报告,确认每件商品均已过检测,符合上述适用要求。但许多亚马逊卖家反映:在亚马逊卖的文具类产品…

哪个思维导图软件好,知道这5个就够了!

思维导图作为一种有效的组织和展示思维的工具,广泛应用于学习、项目管理、创意发展等领域。然而,手工绘制思维导图费时费力,限制了其在快节奏的现代生活中的应用。本文将介绍5款可以一键生成思维导图的软件,它将通过智能化的方式&…

Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题

我们在使用浏览器访问各个网站时,经常会保存密码。在下一次访问时,直接使用保存的密码填充,简单方便。 但是突然有一天(怀疑是谷歌浏览器更新导致的),每次使用密码填充时,都有如下拦截 拦截提…

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…

PyTorch中ReduceLROnPlateau的学习率调整优化器

PyTorch中ReduceLROnPlateau的学习率调整优化器 作者:安静到无声 个人主页 简介: 在深度学习中,学习率是一个重要的超参数,影响模型的收敛速度和性能。为了自动调整学习率,PyTorch提供了ReduceLROnPlateau优化器&…

Linux IPIP隧道连通两个局域网

拓扑结构 现有两台主机,它们具有两个网口分别接入到不同网络中。 主机A: eth0:处于 10.0.1.2/24 网段eth1: 处于192.168.1.100/24 网段 主机B: eth0:处于10.0.2.3/24 网段eth1: 处于192.168.2…

持续同步的实时备份软件推荐!

什么是实时备份? 实时备份是一种持续数据保护方法,通过缩短自动保存文件的时间间隔,可以备份每个更改的副本,以捕获保存数据的每个版本。 传统备份方式只能将数据还原到备份完成时的状态,如果在故障发生时进行恢复…

收藏!!!一起来学习IGBT基础知识。

1 IGBT是什么? IGBT,绝缘栅双极型晶体管,是由(BJT)双极型三极管和绝缘栅型场效应管(MOS)组成的复合全控型电压驱动式功率半导体器件, 兼有(MOSFET)金氧半场效晶体管的高…

init_pg_dir 的大小及作用

init_pg_dir 的大小 vmlinux.lds.S 中 在vmlinux.lds.S 中,有 init_pg_dir .; . INIT_DIR_SIZE; init_pg_end .;/*include/asm/kernel-pgtable.h*/ #define EARLY_ENTRIES(vstart, vend, shift) \ ((((vend) - 1) >&g…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动该地区金融平等

流支付正在成为一种全新的支付形态,Zebec Protocol作为流支付的主要推崇者,正在积极的推动该支付方案向更广泛的应用场景拓展。目前,Zebec Protocol成功的将流支付应用在薪酬支付领域,并通过收购WageLink将其纳入旗下,…