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

目录

一、色彩空间

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.rhkb.cn/news/285175.html

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

相关文章

如何设计循环队列(两种方法)

文章目录 前言一、方法一:数组法二、方法二.链表法总结 前言 前面有提到过队列的知识,这次来说一下怎么设计一个循环队列 一.循环队列(力扣) . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资…

Java Synchronized

Synchronized Synchronized 原理偏向锁轻量级锁重量级锁 Synchronized特征jdk1.8Synchronized优化了什么?Synchronized修饰范围Synchronized lock 区别 Synchronized 原理 在Java对象内存布局中,每个对象都有一个对象头,其中包含锁状态信息。…

【stable diffusion扩散模型】一篇文章讲透

目录 一、引言 二、Stable Diffusion的基本原理 1 扩散模型 2 Stable Diffusion模型架构 3 训练过程与算法细节 三、Stable Diffusion的应用领域 1 图像生成与艺术创作 2 图像补全与修复 3 其他领域 四、Stable Diffusion的优势与挑战 👉优势 &#x1f…

SpringBoot3集成PostgreSQL

标签:PostgreSQL.Druid.Mybatis.Plus; 一、简介 PostgreSQL是一个功能强大的开源数据库系统,具有可靠性、稳定性、数据一致性等特点,且可以运行在所有主流操作系统上,包括Linux、Unix、Windows等。 通过官方文档可以…

抠门精出游记之吉隆坡篇

我在新加坡一直是个街溜子,每天就是到处溜达,当然,时髦的词叫做citywalk。anyway,叫啥不重要,新加坡走腻了,跟老婆申请,去吉隆坡溜达一下,为啥要来吉隆坡呢,说起来还是因…

day3-QT

1>使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函。将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…

【循环神经网络rnn】一篇文章讲透

目录 引言 二、RNN的基本原理 代码事例 三、RNN的优化方法 1 长短期记忆网络(LSTM) 2 门控循环单元(GRU) 四、更多优化方法 1 选择合适的RNN结构 2 使用并行化技术 3 优化超参数 4 使用梯度裁剪 5 使用混合精度训练 …

科技云报道:造完“大模型”,“具身智能”将引领AI下一个浪潮?

科技云报道原创。 资深机器人专家Eric Jang不久前曾预言:“ChatGPT 曾在一夜之间出现。我认为,有智慧的机器人技术也将如此。” 3月13日深夜,一段人形机器人的视频开始热传。 在视频中,Figure的人形机器人,可以完全…

研华工控机610L学习笔记2:visualstudio与第一个C#程序

今日继续学习工控机 C# 编程相关知识: 这篇结束后我将先进行一段时间的C#的学习研究,并写一些C#的笔记 后续再更新工控机编程设计相关 目录 1、安装visualstudio: 2、创建第一个C#程序: 3、寻找C#解决方案源文件: …

【Godot4.2】基础知识 - Godot中的2D向量

概述 在Godot中,乃至一切游戏编程中,你应该都躲不开向量。这是每一个初学者都应该知道和掌握的内容,否则你将很难理解和实现某些其实原理非常简单的东西。 估计很多刚入坑Godot的小伙伴和我一样,不一定是计算机专业或编程相关专…

pytorch 实现多层神经网络MLP(Pytorch 05)

一 多层感知机 最简单的深度网络称为多层感知机。多层感知机由 多层神经元 组成,每一层与它的上一层相连,从中接收输入;同时每一层也与它的下一层相连,影响当前层的神经元。 softmax 实现了 如何处理数据,如何将 输出…

SpringAOP+自定义注解实现限制接口访问频率,利用滑动窗口思想Redis的ZSet(附带整个Demo)

目录 1.创建切面 2.创建自定义注解 3.自定义异常类 4.全局异常捕获 5.Controller层 demo的地址,自行获取《《—————————————————————————— Spring Boot整合Aop面向切面编程实现权限校验,SpringAop自定义注解自定义异常全局…

【微服务】Gateway服务网关

📝个人主页:五敷有你 🔥系列专栏:微服务 ⛺️稳中求进,晒太阳 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响…

Windows 设置多显示器显示

Windows 设置多显示器显示 1. Windows 7 设置 HDMI 输出2. Windows 11 设置多显示器显示References 1. Windows 7 设置 HDMI 输出 2. Windows 11 设置多显示器显示 ​​​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Ubuntu Desktop 安装谷歌拼音输入法

Ubuntu Desktop 安装谷歌拼音输入法 1. Installation1.1. 汉语语言包​1.2. 谷歌拼音输入法1.3. 安装语言包1.4. 键盘输入方式系统1.5. 重启电脑1.6. 输入法配置 2. configuration2.1. Text Entry Settings… 3. ExecutionReferences 1. Installation 1.1. 汉语语言包 strong…

odoo扩展导出pdf功能

1. 说明: odoo原生导出功能扩展导出pdf文件功能, 如有额外需求请联系博主 2. 版本说明: odoo版本: odoo15 其他odoo版本未进行测试,如有需要自行测试 3. 地址: 该补丁代码放在github仓库, 地址: https://github.com/YSL-Alpaca/odoo_export_pdf 4. 改补丁依赖于第三方软件wkh…

网盘——数据库操作

关于网盘的数据库模块,主要有以下几个内容:定义数据库操作类、将数据库操作类定义成单例模式、数据库操作 数据库是在Qt里面,定义成操作类,专门用这个类产生对象,对数据库实现操作,那么我们在产生对象的时…

音视频领域首个,阿里云推出华为鸿蒙 HarmonyOS NEXT 版音视频 SDK

近日,阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK,官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外,阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线,面向所…

Linux系统——硬件命令

目录 一.网卡带宽 1.查看网卡速率——ethtool 网卡名 2.查看mac地址——ethtool -P 网卡名 二、内存相关 1.显示系统中内存使用情况——free -h 2.显示内存模块的详细信息——dmidecode -t memory 三、CPU相关 1.查看CPU架构信息——lscpu 2.性能模式 四、其他硬件命…

Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…