机器视觉学习(六)—— 图像的颜色识别

目录

一、色彩空间

1.1 RGB色彩空间

1.2 HSV色彩空间

1.3 灰度

1.4 CMYK色彩空间

1.5 Lab色彩空间

二、色彩空间转换

三、识别颜色

3.1 识别一种特定的颜色

3.2 识别多种颜色


一、色彩空间

计算机视觉中常用的色彩空间有RGB色彩空间、HSV色彩空间、CMYK色彩空间、Lab色彩空间等。

1.1 RGB色彩空间

RGB色彩空间是一种常用的计算机视觉颜色表示方法,它使用红(R)绿(G)蓝(B)三个颜色通道来表示所有可见光的颜色。每个通道的取值范围是0到255,代表了相应颜色的强度。通过组合不同强度的三个通道,可以表示出各种各样的颜色。

在RGB色彩空间中,每个像素的颜色可以表示为一个三维向量 (R, G, B),其中R、G、B分别代表红、绿、蓝的强度。通过调整这三个通道的强度,可以产生大量的颜色。

1.2 HSV色彩空间

HSV色彩空间是一种常用于计算机视觉领域的色彩表示方式。HSV代表色相(Hue)、饱和度(Saturation)和明度(Value)

色相(Hue)表示颜色的种类或者类型。如红色、绿色、蓝色等。色相的取值范围是0到360度,对应了色环上不同的位置。

饱和度(Saturation)表示颜色的纯度或者鲜艳程度。饱和度的取值范围是0到1,0表示灰度(无色彩),1表示最高饱和度(最鲜艳的颜色)。

明度(Value)表示颜色的明亮程度。明度的取值范围也是0到1,0表示最暗的颜色,1表示最亮的颜色。

计算机视觉中常用HSV色彩空间来对图像进行颜色识别、色彩分割等任务。由于HSV色彩空间能够更好地模拟人类感知颜色的方式,因此在一些特定的应用场景中使用HSV色彩空间能够获得更好的效果。

1.3 灰度

灰度空间是指图像的亮度分量,即图像中每个像素的亮度值。灰度空间用于表示图像的黑白信息,常用的灰度空间有灰度图像和灰度直方图。

灰度图像是指每个像素的颜色只有灰度值,没有颜色信息。在计算机中,灰度图像通常使用8位表示,灰度值的范围为0-255,其中0表示黑色,255表示白色。

1.4 CMYK色彩空间

CMYK色彩空间是一种用于打印颜色的色彩空间,由青色(Cyan)、洋红色(Magenta)、黄色(Yellow)和黑色(Key)四个颜色通道组成。每个颜色通道的取值范围是0到100表示颜色的浓度

1.5 Lab色彩空间

Lab色彩空间是一种基于人眼感知的色彩空间,由亮度(L)、红绿色度(a)、黄蓝色度(b)三个参数组成亮度取值范围是0到100红绿色度和黄蓝色度取值范围是-128到127。Lab色彩空间可以很好地描述人眼对颜色的感知。

二、色彩空间转换

下面我直接代码显示:(有注释)

import cv2
import numpy as np# 将RGB图像转换为灰度图像
def rgb2gray(image):gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)return gray_image# 将RGB图像转换为HSV图像
def rgb2hsv(image):hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)return hsv_image# 将RGB图像转换为LAB图像
def rgb2lab(image):lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)return lab_image# 将RGB图像转换为YCrCb图像
def rgb2ycrcb(image):ycrcb_image = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)return ycrcb_image# 将RGB图像转换为L*a*b*图像
def rgb2labstar(image):labstar_image = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)return labstar_image# 加载RGB图像
image = cv2.imread('image.jpg')       //注意换成自己的路径# 将RGB图像转换为灰度图像
gray_image = rgb2gray(image)# 将RGB图像转换为HSV图像
hsv_image = rgb2hsv(image)# 将RGB图像转换为LAB图像
lab_image = rgb2lab(image)# 将RGB图像转换为YCrCb图像
ycrcb_image = rgb2ycrcb(image)# 将RGB图像转换为L*a*b*图像
labstar_image = rgb2labstar(image)# 显示转换后的图像
cv2.imshow('RGB Image', image)
cv2.imshow('Gray Image', gray_image)
cv2.imshow('HSV Image', hsv_image)
cv2.imshow('LAB Image', lab_image)
cv2.imshow('YCrCb Image', ycrcb_image)
cv2.imshow('L*a*b* Image', labstar_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、识别颜色

3.1 识别一种特定的颜色

首先,我们可以通过颜色画板来查看对应颜色的BGR值。

知识拓展:

"""滑条控制BGR
""""""
创建窗口:           cv2.namedWindow("windowname")
创建滑条:           cv2.createTrackbar("teackbarname","windowname",min,max,onchange)
获取滑条数据:       cv2.getTrackbarPos("teackbarname","windowname")windowname:             窗口名trackbarname:           滑条名min:                    滑条最小值max:                    滑条最大值onchange:               每次滑块更改调用的函数初始化图像:np.zeros((length, width, number), np.uint8)默认初始化后的类型为 float64,后面虽然将其赋值为整数,但其存储类型还是浮点数,因其类型不对从而导致图像不能正常显示length:                     图像的长度width:                      图像的宽度number:                     颜色通道数np.uint8:                   使插值算法的结果显示正常np.zeros(shape, dtype = float, order="C")shape:                      创建的新数组的形状 (维度)dtype:                      创建新数组的数据类型    (默认 float64)order:                      可选参数    (C: 代表与C语言类似,行优先;     F: 代表列优先)返回值:                      给定维度的全零数组"""

创建滑条控制颜色画板:

import cv2 as cv
import numpy as npimg = np.zeros((480,480,3),np.uint8)               # 初始化一个 480*480的图像
def nothing():                                     # 创建一个函数passcv.namedWindow("BGR")                             # 创建窗口
cv.createTrackbar("R","BGR",0,255,nothing)        # 创建滑条
cv.createTrackbar("G","BGR",0,255,nothing)
cv.createTrackbar("B","BGR",0,255,nothing)while(1):r = cv.getTrackbarPos("R","BGR")               # 获取滑条数据g = cv.getTrackbarPos("G","BGR")b = cv.getTrackbarPos("B","BGR")print(r,g,b)img[:] = [b,g,r]cv.imshow("BGR",img)cv.waitKey(1)

运行结果:

由图可知:     R:39                G:212                B:231

要使用OpenCV识别特定的RGB颜色,完整的示例代码如下:

import cv2
import numpy as np# 定义要识别的颜色范围
lower_red = np.array([35, 212, 230])
upper_red = np.array([45, 212, 232])# 读取图像
img = cv2.imread("D:\Open_CV\OpenCV_demo\Pictures\lanse.png")# 图像缩放 (长,宽)
image = cv2.resize(img,(320,320),interpolation=cv2.INTER_AREA)      # 图像缩放 (长,宽)# 将图像从BGR转换为RGB颜色空间
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 创建掩膜
mask = cv2.inRange(image_rgb, lower_red, upper_red)# 显示结果
result = cv2.bitwise_and(image_rgb, image_rgb, mask=mask)# 将图像从RGB转换为BGR颜色空间
result = cv2.cvtColor(result, cv2.COLOR_RGB2BGR)cv2.imshow("Result", result)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

3.2 识别多种颜色

跟上述中识别一种颜色的方法一样,只不过需要加上被识别的颜色范围,多创建几个掩膜和显示窗口。

例如:

  • 定义要识别的颜色范围:
# 定义要识别的颜色范围
red_lower = np.array([0, 0, 100], np.uint8)
red_upper = np.array([20, 255, 255], np.uint8)blue_lower = np.array([100, 100, 100], np.uint8)
blue_upper = np.array([140, 255, 255], np.uint8)
  • 根据定义的颜色范围,创建掩膜,将图像中的颜色区域标记为白色,其余区域标记为黑色:
red_mask = cv2.inRange(hsv_image, red_lower, red_upper)
blue_mask = cv2.inRange(hsv_image, blue_lower, blue_upper)
  • 在原始图像上使用掩膜,只保留颜色区域:
red_result = cv2.bitwise_and(image, image, mask=red_mask)
blue_result = cv2.bitwise_and(image, image, mask=blue_mask)
  • 显示结果:
cv2.imshow('Red Result', red_result)
cv2.imshow('Blue Result', blue_result)
cv2.waitKey(0)

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

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

相关文章

34-Java传输对象模式 ( Transfer Object Pattern )

Java传输对象模式 实现范例 传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据传输对象也被称为数值对象,没有任何行为传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列…

解锁AI之门:协助探索Amazon Bedrock服务

AI愈加强大的功能和广泛的应用场景,正逐渐改变着我们的工作和生活方式。 Amazon Bedrock在AI的时代潮流中,也以其强大而灵活的功能特性,正在成为越来越多企业和个人的智能助手。 亚马逊云科技通过VERYCLOUD睿鸿股份的服务能力,使…

揭秘!自定义三维模型如何在RflySim中实现仿真(一)

一.技术背景 在无人系统研发过程中,需要进行大量的运动控制系统半物理实时仿真实验,传统仿真界面的运动轨迹显示多采用的是二维曲线形式,运动过程和状态是通过文本数据显示。随着数据量的增加,该方式缺乏直观性,不易观…

python四川火锅文化网站的设计与实现flask-django-php-nodejs

四川火锅文化网站的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来,…

蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

一、题目要求 在CT107D单片机综合训练平台上,通过I/O模式编写代码,实现以下功能: 系统上电后,关闭蜂鸣器、继电器和全部指示灯,数码管显示初始值为28,仅显示数码管最右边两位。利用定时器0实现10ms间隔定…

预测一下,GPT-5 会在什么时候发布,又会有哪些更新?

发布预期:GPT-5预计将于11月发布,可能与ChatGPT发布两周年同期。竞争态势:谷歌的Gemini与GPT-4 turbo已展开竞争。逐步发布:GPT-5可能通过模型训练过程中的中间检查点逐步发布。训练与安全测试:实际训练可能需3个月&am…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

文章目录 该系列目录:设计环境设计目标设计思路RTL及Testbench代码RTL代码Testbenchxdc约束 仿真结果 声明:案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。 该系列目录: Verilog线性…

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

长安链开源社区发布2023年度长安链优秀应用案例

1月27日结束的“长安链发布三周年庆暨生态年会”上,在国家区块链技术创新中心的指导下,长安链开源社区联合长安链生态联盟正式发布2023年度长安链行业示范案例、领域精品案例及特色创新案例。 本次评选面向2023年度应用长安链上线并取得应用成效的案例&…

Matlab在高光谱遥感中的作用:从数据处理到决策支持

光谱和图像是人们观察世界的两种方式,高光谱遥感通过“图谱合一”的技术创新将两者结合起来,大大提高了人们对客观世界的认知能力,本来在宽波段遥感中不可探测的物质,在高光谱遥感中能被探测。以高光谱遥感为核心,构建…

vue中如何实现子组件相互切换,而且数据不会丢失

项目场景: 今天的项目场景: 项目为数据报表,但是一个父页面中有很多的子页面,而且子页面中不是相互关联,但是数据又有联系. 问题描述 子页面相互切换的时候之前填写好的数据会丢失,无法保存.这样想提交所有的子页面的数据就出现问题. 原因分析: 分析原因…

外包干了20天,技术退步明显.......

先说一下自己的情况,大专生,21年通过校招进入杭州某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

SpringCloud详解,图文码笔记

注意: SpringCloud并 不等于 微服务 1.微服务技术线 2.认识微服务 分布式架构 分布式架构: 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。 优点: 降低服务耦合有利于服务升级拓展 服务治理 分布式…

基于Java的绩效考核系统的设计与实现

今天要和大家聊的是一款基于Java的绩效考核系统的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕💕个人简介…

AcWing 3224. 画图 (BFS,Flood Fill,坐标变换)

用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。 例如,下图是用 ASCII 字符画出来的 CSPRO 字样。 ..____.____..____..____...___.../.___/.___||.._.\|.._.\./._.\.|.|...\___.\|.|_).|.|_).|.|.|.||.|___.___).|..__/|.…

从先序与中序遍历序列构造二叉树

从先序与中序遍历序列构造二叉树 描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 递归法 解题思路: 通过先序遍历我…

手势识别模块PAJ7620的简单应用

文章目录 一、PAJ76201.介绍2.模块特性3.模块原理4.原理图5.内部框图 二、软件1.手势识别1.1 初始化ATK-MS7620模块1.2 配置ATK-MS7620模块为手势检测模式1.3 获取手势 2.接近检测1.1 初始化ATK-MS7620模块1.2 配置ATK-MS7620模块为接近检测模式1.3 获取物体亮度和大小 三、总结…

HQYJ 2024-3-19 作业

TCP通信三次握手和四次挥手: 并行和并发的区别:并发是单核处理器处理多个线程任务,并行是多核处理器同时处理多个线程任务。并发过程中会抢占CPU资源,轮流使用;并行过程不会抢占CPU资源。 阻塞IO和非阻塞IO&#xff…

迈入C++编程之路(一)

目录 一、什么是C 二、关键字: 三、命名空间 : 1. C语言存在的问题: 2. namespace关键字: 3. 注意点: 4.使用命名空间分为三种: 四、输入输出: 五、缺省函数: 1. 什么是缺省…