opencv图片颜色识别,颜色的替换

图片颜色识别

  • 1. RGB颜色空间
  • 2. 颜色加法
    • 2.1使用numpy对图像进行加法
    • 2.2使用opencv加法(cv2.add)
  • 3 颜色加权加法(cv2.addWeighted())
  • 4. HSV颜色空间
  • 5. 制作掩膜
  • 4. 与运算(cv2.bitwise_and)
  • 5.颜色的替换
  • 7 ROI切割

在本实验中,主要是通过掩膜对原图像进行与运算来找到我们要识别的颜色,因此我们需要了解如何在一张图片中寻找目标颜色、掩膜是什么以及与运算的概念,下面一一介绍。

1. RGB颜色空间

在图像处理中,最常见的就是RGB颜色空间。RGB颜色空间是我们接触最多的颜色空间,是一种用于表示和显示彩色图像的一种颜色模型。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种颜色通过不同强度的光的组合来创建其他颜色,广泛应用于我们的生活中,比如电视、电脑显示屏以及上面实验中所介绍的RGB彩色图。

RGB颜色模型基于笛卡尔坐标系,如下图所示,RGB原色值位于3个角上,二次色青色、红色和黄色位于另外三个角上,黑色位于原点处,白色位于离原点最远的角上。因为黑色在RGB三通道中表现为(0,0,0),所以映射到这里就是原点;而白色是(255,255,255),所以映射到这里就是三个坐标为最大值的点。

在这里插入图片描述
RGB颜色空间可以产生大约1600万种颜色,几乎包括了世界上的所有颜色,也就是说可以使用RGB颜色空间来生成任意一种颜色。

注意:

  • 在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB,这也是上面红色的像素值是(0,0,255)而不是(255,0,0)的原因。

2. 颜色加法

你可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。

OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算

2.1使用numpy对图像进行加法

图片加上数字代码如下:

'''颜色的加法运算——使用numpy进行'''img=cv2.imread(r'../15day4.10/src/flower.png')print(img[350,340:350,:])img2=img+100print(img2[350,340:350,:])'''[[245 240 236][245 240 237][245 240 237][245 241 236][246 243 235][242 241 235][235 235 236][198 199 210][155 154 181][107 101 146]][[ 89  84  80][ 89  84  81][ 89  84  81][ 89  85  80][ 90  87  79][ 86  85  79][ 79  79  80][ 42  43  54][255 254  25][207 201 246]]'''# 由数组可以看出,因为uint8类型的数据最大值为255所以直接进行numpy的加法运算,两个元素相加超过255就会自动用这个和%256cv2.imshow('img',img)cv2.imshow('img2',img2)cv2.waitKey(0)

在这里插入图片描述
图片加上图片的代码如下:

'''颜色的加法运算——使用numpy进行图片加图片'''img=cv2.imread(r'../15day4.10/src/cao.png')img2=cv2.imread(r'../15day4.10/src/pig.png')img3=img+img2# 由数组可以看出,因为uint8类型的数据最大值为255所以直接进行numpy的加法运算,两个元素相加超过255就会自动用这个和%256cv2.imshow('img',img)cv2.imshow('img2',img2)cv2.imshow('img3',img3)cv2.waitKey(0)

在这里插入图片描述

注意:

  • 由上面代码数组数组可以看出,因为uint8类型的数据最大值为255所以直接进行numpy的加法运算,两个元素相加超过255就会自动用这个和%256
  • 一张图片中的像素点加上一个值就表示改变这个像素点的颜色
  • 一张图片加上另外一张图片也可以

2.2使用opencv加法(cv2.add)

代码如下:

 '''颜色的加法运算——使用cv2.add进行图片加数字'''img=cv2.imread(r'../15day4.10/src/flower.png')print(img[350,340:350,:])img2=cv2.add(img,100)print(img2[350,340:350,:])'''
[[245 240 236][245 240 237][245 240 237][245 241 236][246 243 235][242 241 235][235 235 236][198 199 210][155 154 181][107 101 146]]
[[255 255 255][255 255 255][255 255 255][255 255 255][255 255 255][255 255 255][255 255 255][255 255 255][255 254 255][207 201 246]]'''cv2.imshow('img',img)cv2.imshow('img2',img2)cv2.waitKey(0)

在这里插入图片描述
图片加图片代码如下:

 '''颜色的加法运算——使用cv2.add进行图片加图片'''img=cv2.imread(r'../15day4.10/src/cao.png')img2=cv2.imread(r'../15day4.10/src/pig.png')img3=cv2.add(img,img2)cv2.imshow('img',img)cv2.imshow('img2',img2)cv2.imshow('img3',img3)cv2.waitKey(0)

在这里插入图片描述

注意:

  • 使用open的加法(cv2.add())函数时如果某个像素点数的BGR值与一个值相加超过255时,只会使这个BRG为255

3 颜色加权加法(cv2.addWeighted())

这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:

g(x) = (1−α)f0(x) + αf1(x)

通过修改 α 的值(0 → 1),可以实现非常炫酷的混合。

现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重是0.3。函数cv2.addWeighted()可以按下面的公式对图片进行混合操作。

dst = α⋅img1 + β⋅img2 + γ

这里γ取为零。
格式;

cv2.addWeighted(image1,a,image2,b,γ) #a是img1的权重,b是img2的权重
代码如下:

 '''颜色的加权加法'''img=cv2.imread(r'../15day4.10/src/cao.png')img2=cv2.imread(r'../15day4.10/src/pig.png')img3=cv2.addWeighted(img,0.3,img2,0.6,0)cv2.imshow('img',img)cv2.imshow('img2',img2)cv2.imshow('img3',img3)cv2.waitKey(0)

在这里插入图片描述
注意:

  • 两个图片的权重不必加起来等于1

4. HSV颜色空间

HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。RGB颜色模型使用红、绿、蓝三原色的强度来表示颜色,是一种加色法模型,即颜色的混合是添加三原色的强度。而HSV颜色空间使用 色调(Hue)、饱和度(Saturation)和亮度(Value) 三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。

HSV颜色模型是一种六角锥体模型,如下图所示:
在这里插入图片描述
HSV的具体描述
此处把部分红色归为紫色范围:
在这里插入图片描述

代码如下:

 '''HSV'''img=cv2.imread(r'../15day4.10/src/demo.png')img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)cv2.imshow('img',img)cv2.imshow('img_hsv',img_hsv)cv2.waitKey(0)

在这里插入图片描述
注意:

  • 在opencv中读取出来的图像的颜色都是BGR,要用cv2.cvtColor()进行转换

5. 制作掩膜

掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改,如下图就是制作红色掩膜的过程:
在这里插入图片描述
通过这个掩膜,我们就可以对掩膜中的白色区域所对应的原图中的区域进行处理与操作。
代码格式:

cv2.inRange(img_hsv,lower,upper)

参数说明:

  • img_hsv:就是bgr转为hsv的图
  • lower:H,S,V三种元素对应颜色的最小值
  • upper:H,S,V三种元素对应颜色的最大值
    代码如下:
img=cv2.imread(r'../15day4.10/src/demo.png')img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#红色的最小hsv的值lower=np.array([0,43,46])#红色的最大hsv的值upper=np.array([10,255,255])img_mask=cv2.inRange(img_hsv,lower,upper)cv2.imshow('img',img)cv2.imshow('img_mask',img_mask)cv2.waitKey(0)

在这里插入图片描述
掩膜是为了得到想要图像的部分

4. 与运算(cv2.bitwise_and)

我们在高中时学过逻辑运算中的“与”运算,其规则是当两个命题都是真时,其结果才为真。而在图像处理中,“与”运算被用来对图像的像素值进行操作。具体来说,**就是将两个图像中所有的对应像素值一一进行“与”运算,**从而得到新的图像。从上面的图片我们可以看出,掩膜中有很多地方是黑色的,其像素值为0,那么在与原图像进行“与”运算的时候,得到的新图像的对应位置也是黑色的,如下图所示:
在这里插入图片描述
代码格式:

color_image_np = cv2.bitwise_and(image_np, image_np, mask=mask_image_np)

参数说明:

  • image_np:原始BGR的图像
  • mask_image_np:进行掩膜运算后的图像

注意:

  • 参数一image_np和参数二image_np 的每一位像素进行按位与操作 由于是同一张图片 因此相同像素按位与后还是当前像素
  • 因为掩膜运算得到的是想要的图像为白色(255),其余为黑色(0),进行and时掩膜运算后的图像 在前面,后面原图像不想要操作部分不会进行按位与运算(0 and 表达式)=0,表达式不执行

具体代码如下:

'''按位与运算'''img=cv2.imread(r'../15day4.10/src/demo.png')img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#红色的最小hsv的值lower=np.array([0,43,46])#红色的最大hsv的值upper=np.array([10,255,255])#进行掩膜运算img_mask=cv2.inRange(img_hsv,lower,upper)#进行按位与运算img_bit=cv2.bitwise_and(img,img,mask=img_mask)cv2.imshow('img',img)cv2.imshow('img_bit',img_bit)cv2.waitKey(0)

在这里插入图片描述

5.颜色的替换

由于掩膜与原图的大小相同,并且像素位置一一对应,那么我们就可以得到掩膜中白色(也就是像素值为255)区域的坐标,并将其带入到原图像中,即可得到原图中的红色区域的坐标,然后就可以修改像素值了,这样就完成了颜色的替换,如下图所示:
在这里插入图片描述
将上图的红色圆替换成蓝色

 '''颜色替换'''# 现将原图变为hsv的图像img=cv2.imread(r'../15day4.10/src/demo.png')  img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 求红色的掩膜# 求红色的hsv的最小值lower=np.array([0,43,46])# 求红色的hsv的最大值upper=np.array([10,255,255])cv2.imshow('img',img)#进行掩膜运算img_mask=cv2.inRange(img_hsv,lower,upper)img[img_mask==255]=[255,0,0]cv2.imshow('img',img)cv2.waitKey(0)

在这里插入图片描述

步骤:

  • 1.先对原图变为hsv格式
  • 2.求想要替换图像的颜色hsv的最大值和最小值
  • 3.对其做掩膜运算
  • 4.对原图掩膜运算的结果等于255区域改变BGR

7 ROI切割

ROI:Region of Interest,翻译过来就是感兴趣的区域。什么意思呢?比如对于一个人的照片,假如我们要检测眼睛,因为眼睛肯定在脸上,所以我们感兴趣的只有脸这部分,其他都不care,所以可以单独把脸截取出来,这样就可以大大节省计算量,提高运行速度。

还记得Numpy这个库吗?我们在使用OpenCV进行读取图像时,图像数据会被存储为Numpy数组,这也意味着我们可以使用Numpy数组的一些操作来对图像数据进行处理,比如切片。而本实验的原理也**是基于Numpy数组的切片操作来完成的,**因此在对应的组件中就需要填我们要切割的ROI区域的坐标来完成ROI切割操作。
在这里插入图片描述
注意:在OpenCV中,坐标的x轴的正方向是水平向右,y轴的正方向是垂直向下,与数学上的二维坐标并不相同。

在计算机视觉中,当我们使用OpenCV读取RGB三通道图像时,它会被转换成一个三维的Numpy数组。这个数组里的每个元素值都表示图像的一个像素值。这个三维数组的第一个维度(即轴0)通常代表图像的高度,第二个维度(即轴1)代表图像的宽度,而第三个维度(即轴2)代表图像的三个颜色通道(B、G、R,OpenCV读取到的图像以BGR的方式存储)所对应的像素值。

因此,我们可以通过指定切片的范围来选择特定的高度和宽度区域。这样,我们就能够获取这个区域内的所有像素值,即得到了这个区域的图像块,通过Numpy的切片操作,**我们就完成了ROI切割的操作。这种提取ROI的方法允许我们仅获取感兴趣区域内的像素,**而忽略其他不相关的部分,从而大大减少数据处理和存储的负担。
代码如下:

 '''ROI切割'''img=cv2.imread(r'../15day4.10/src/1.jpg')  img2=img[100:500,200:700]cv2.imshow('img',img)cv2.imshow("img2",img2)cv2.waitKey(0)

在这里插入图片描述

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

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

相关文章

ADC数据不稳定的解决方案

问题如图: 解决方案:上图第一个通道后来接入GND,就稳定了 上图第一个通道后来接入VCC,就稳定了

Spark(18)Yarn-概述

Hadoop三大核心组件:HDFS、MapReduce和YARN 一)Yarn的概念 YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率,资源统一管…

Flowith AI,解锁下一代「知识交易市场」

前言 最近几周自媒体号都在疯狂推Manus,看了几篇测评后,突然在某个时间节点,在特工的文章下,发现了很小众的Flowith。 被这段评论给心动到,于是先去注册了下账号。一翻探索过后,发现比我想象中要有趣的多&…

Maxscript调用Newtonsoft.Json解析Json

Maxscript调用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客

搭建用友U9Cloud ERP及UAP IDE环境

应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…

github新建一个远程仓库并添加了README.md,本地git仓库无法push

1.本地git仓库与远程仓库绑定 2.push时报错,本地的 main 分支落后于远程仓库的 main 分支(即远程有更新,但你本地没有),需要拉取远程的仓库--->在merge合并(解决冲突)--->push 3.但是git …

我用deepseek做了一个提取压缩文件夹下pdf和word文件工具

由于最近需要把大量的压缩文件的pdf和word文件统一复制到一个文件夹中。 我们一般正常操作方式的是把一个压缩文件一个一个解压,然后在把一个的解压好的文件夹下文件复制到另外一个文件夹中。 这个也需太繁琐了,从以往统计的需要花费两个小时间&#x…

企业网络安全合规风险高、运营不稳定,要怎么解决?

在数字化浪潮中,数据已然成为企业的核心资产,其重要性不言而喻。然而,数据泄露风险也时刻威胁着企业的生存与发展。不少企业在历经数据泄露的惨痛教训后,纷纷选择部署数据防泄露系统。那么,企业部署数据防泄露系统前后…

C#—Lazy<T> 类型(延迟初始化/懒加载模式)

C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类&#xff0c;用于实现延迟初始化&#xff08;懒加载&#xff09;模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象&#xff0c;直到第一次实际需要时才进行初始化。 主要特点 延迟初始化&#xff1a…

C++之unordered封装

目录 一、哈希表的修改 1.1、哈希表节点结构 1.2、迭代器 1.3、哈希表结构 1.4、完整代码 二、unordered_map的实现 二、unordered_set的实现 一、哈希表的修改 注意&#xff1a;这里我们使用哈希桶来封装unordered_map和unordered_set。 1.1、哈希表节点结构 templa…

[渗透测试]渗透测试靶场docker搭建 — —全集

[渗透测试]渗透测试靶场docker搭建 — —全集 对于初学者来说&#xff0c;仅仅了解漏洞原理是不够的&#xff0c;还需要进行实操。对于公网上的服务我们肯定不能轻易验证某些漏洞&#xff0c;否则可能触犯法律。这是就需要用到靶场。 本文主要给大家介绍几种常见漏洞对应的靶场…

Docker如何更换镜像源提高拉取速度

在国内&#xff0c;由于网络政策和限制&#xff0c;直接访问DockerHub速度很慢&#xff0c;尤其是在拉取大型镜像时。为了解决这个问题&#xff0c;常用的方法就是更换镜像源。本文将详细介绍如何更换Docker镜像源&#xff0c;并提供当前可用的镜像源。 换源方法 方法1&#x…

第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维

引言&#xff1a;当革命哲学照亮现代商业 1937年&#xff0c;毛泽东在战火中写就的《实践论》《矛盾论》&#xff0c;为中国共产党提供了认识世界的方法论。今天&#xff0c;这两部著作正成为企业破解管理困局的“思维操作系统”&#xff1a; 战略模糊&#xff1a;据Gartner统…

云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)

1、云计算概念 云计算是一种通过互联网提供计算资源&#xff08;包括服务器、存储、数据库、网络、软件等&#xff09;和服务的技术模式。用户无需拥有和维护物理硬件&#xff0c;而是可以根据需要租用这些资源&#xff0c;并按使用量付费。 2、云计算特点 &#xff08;1&am…

一级滤波器设计:IL_cmdm > 80dB

目录 背景 目的 操作 仿真测试 搭建仿真模型 插入损耗测试 优化设计后重新测试 思考 背景 在选购共模电感时&#xff0c;规格书中通常会提供插损曲线或者阻抗-频率曲线&#xff0c;但这些数据都是在特定条件下测试获得的。如果将其集中在我们的样机中性能会如何&#…

qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded

项目场景&#xff1a; 环境版本&#xff1a; qt &#xff1a;5.14.2 mysql&#xff1a;8.0 windows&#xff1a;10 提示&#xff1a;qt 配置 mysql 驱动&#xff1a; 项目场景&#xff1a;qt 配置 mysql 驱动 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a;…

Kubernetes相关的名词解释Container(16)

什么是Container&#xff1f; 在 Kubernetes 中&#xff0c;Container&#xff08;容器&#xff09; 是一个核心概念&#xff0c;你可以将镜像&#xff08;Image&#xff09;类比为程序的“源代码”&#xff0c;而容器是这段“代码”运行时的进程。例如&#xff0c;一个 nginx…

学习设计模式《四》——单例模式

一、基础概念 单例模式的本质【控制实例数目】&#xff1b; 单例模式的定义&#xff1a;是用来保证这个类在运行期间只会被创建一个类实例&#xff1b;单例模式还提供了一个全局唯一访问这个类实例的访问点&#xff08;即GetInstance方法&#xff09;单例模式只关心类实例的创建…

零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!

写在前面 —— 超越默认样式,掌握 Matplotlib 精细控制,打造专业级可视化图表 上一篇博客,我们学习了 Matplotlib 的基础绘图功能,掌握了如何绘制常见的折线图、柱状图、散点图和饼图,并进行了基本的图表元素定制,例如添加标题、标签、图例等。 这些基础技能已经能让我…

信奥中的数学

信奥赛的数学大纲 ps:知识点是其他小伙伴分享的&#xff0c;我现在在做一下系列视频 会逐步更新&#xff0c;希望大家支持喜欢。 1.基础数学 数论 整数和自然数 素数、合数和因数分解 最大公约数(GCD)和最小公倍数(LCM) 同余和取模运算 欧几里得算法 扩展欧几里得算法 中国…