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

news2025/5/13 23:34:36

图片颜色识别

  • 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+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]]
 
[[ 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就会自动用这个和%256
    cv2.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就会自动用这个和%256
    cv2.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.coloradmin.cn/o/2340203.html

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

相关文章

B实验-12

需要注意版本、页面源代码 两个文件一个目录:phpinfo robots phpmyadmin 实验12 靶机1 一个key在phpmyadmin,一个key在回收站 用两个扫描目录的工具扫,nmap给python版 情况1:弱口令 root root root 123456 …

【网工第6版】第5章 网络互联②

目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头(RFC2460) ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度:☆☆☆☆☆ ■ IPV6 与IPv4…

单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用

文章目录 一.什么是单页面应用?二.什么是路由?生活中的路由和Vue中的路由 三.VueRouter(重点)0.引出1.介绍2.下载与使用(5个基本步骤2个核心步骤)2.1 五个基本步骤2.2 两个核心步骤 四.路由的封装抽离五.声明式导航1.导航链接特点一:能跳转特点二:能高亮 2.两个高亮类名2.1.区…

STM32---外部中断EXTI

目录 一、中断向量表 二、EXTI工作原理图 三、NVIC模块 四、GPIO设置为EXTI的结构 五、C语言示例代码 在STM32中,中断是一个非常重要的结构,他能让我们在执行主函数的时候,由硬件检测一些外部或内部产生的中断信号,跳转到中断…

Itext进行PDF的编辑开发

这周写了一周的需求,是制作一个PDF生成功能,其中用到了Itext来制作PDF的视觉效果。其中一些功能不是很懂,仅作记录,若要学习请仔细甄别正确与否。 开始之前,我还是想说,这傻福需求怎么想出来的&#xff0c…

Hibernate的组件映射

在实际的开发中,使用的是非常多的,还有几种比较特殊的关系映射: 组件映射继承映射 先看一下组件映射: 组件映射中, 组件也是一个类, 但是这个类它不独立称为一个实体, 也就是说, 数据库中没有一个表格单独的和它对应, 具体情况呢, 看演示:

C++ 操作符重载Operator

C可以重载大多数操作符&#xff0c;如算术运算符号&#xff0c;-号。 位操作符<<,>> 下标符号[]等都可以重载。 重载的意思&#xff0c;是让这些符号&#xff0c;按你定义的行为来执行代码&#xff0c;但是这种自定义&#xff0c;是有限制的&#xff0c;必须有一…

Docker 镜像、容器和 Docker Compose的区别

前言&#xff1a;Docker 的镜像、容器和 Docker Compose 是容器化技术的核心组件&#xff0c;以下是对它们的详细解析及使用场景说明。 ​​1、Docker 镜像&#xff08;Image&#xff09;​​ ​​定义​​&#xff1a; 镜像是只读模板&#xff0c;包含运行应用程序所需的代码、…

Linux深度探索:进程管理与系统架构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由⼀个个的硬件组件组成。 输入设备&#xff1a;键盘&#xff0c;鼠标…

一段式端到端自动驾驶:VAD:Vectorized Scene Representation for Efficient Autonomous Driving

论文地址&#xff1a;https://github.com/hustvl/VAD 代码地址&#xff1a;https://arxiv.org/pdf/2303.12077 1. 摘要 自动驾驶需要对周围环境进行全面理解&#xff0c;以实现可靠的轨迹规划。以往的方法依赖于密集的栅格化场景表示&#xff08;如&#xff1a;占据图、语义…

4月21日星期一今日早报简报微语报早读

4月21日星期一&#xff0c;农历三月廿四&#xff0c;早报#微语早读。 1、女子伸腿阻止列车关门等待同行人员&#xff0c;被深圳铁路警方行政拘留&#xff1b; 2、北理工再通报&#xff1a;开除宫某党籍&#xff0c;免去行政职务&#xff0c;解除聘用关系&#xff1b; 3、澳门…

Kubeflow 快速入门实战(二) - Pipelines / Katib / KServer

承接前文博客 Kubeflow 快速入门实战(一) Kubeflow 快速入门实战(一) - 简介 / Notebooks-CSDN博客文章浏览阅读441次&#xff0c;点赞19次&#xff0c;收藏6次。本文主要介绍了 Kubeflow 的主要功能和能力&#xff0c;适用场景&#xff0c;基本用法。以及Notebook&#xff0c…

【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)

本篇博客给大家带来的是多线程中常见的所策略和CAS知识点. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快…

SAP系统生产跟踪报表入库数异常

生产跟踪报表入库数异常 交库21820,入库43588是不可能的 原因排查: 报表的入库数取值,是取移动类型321 (即系检验合格后过账到非限制使用)的数. 查凭证,101过账2次21807,321过账了2次21794,然后用102退1次21794.就是说这批物料重复交库了. 解决&#xff1a; 方案一:开发增强设…

Kubernetes控制平面组件:调度器Scheduler(一)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

08-DevOps-向Harbor上传自定义镜像

harbor创建完成&#xff0c;往harbor镜像仓库中上传自定义的镜像&#xff0c;包括新建项目、docker配置镜像地址、镜像重命名、登录harbor、推送镜像这几个步骤&#xff0c;具体操作如下&#xff1a; harbor中新建项目 访问级别公开&#xff0c;代表任何人都可以拉取仓库中的镜…

极验4滑块笔记:整理思路--填坑各种问题

最近在研究某验4逆向分析&#xff0c;以前没弄过这种&#xff0c;所以爬了很多坑&#xff0c;就是把分享给大家~ 1.这个gcaptcha4.js需要逆向&#xff0c;我的方法很笨就是将_ᕶᕴᕹᕶ()这个蝌蚪文打印处来&#xff0c;全局替换一下&#xff0c;然后Unicode这种代码&#xff0…

LX3-初识是单片机

初识单片机 一 什么是单片机 单片机:单片微型计算机单片机的组成:CPU,RAM(内存),flash(硬盘),总线,时钟,外设…… 二 Coretex-M系列介绍 了解ARM公司与ST公司ARM内核系列: A 高性能应用,如手机,电脑…R 实时性强,如汽车电子,军工…M 超低功耗,如消费电子,家电,医疗器械 三…

2025年渗透测试面试题总结-拷打题库10(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库10 1. CSRF成因及防御措施 | 非Token防御 2. XSS Worm原理 3. Co…

Linux系统下docker 安装 MySQL

踩坑解决&#xff1a; 1、docker安装mysql&#xff0c;不需要执行search 2、pull时&#xff0c;需要指定版本号 3、连接Navicat需要看阿里云端口号是否开启 在拉取镜像的时候&#xff0c;如果不使用代理服务器&#xff0c;docker search mysql不需要执行 本人在未使用代理服…