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

目录

一、色彩空间

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 np

img = np.zeros((480,480,3),np.uint8)               # 初始化一个 480*480的图像
def nothing():                                     # 创建一个函数
    pass

cv.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)
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TR1 - Transformer起源与发展

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 1. Transformer的起源与发展 2017年Google在《Attention Is All You Need》中提出了Transformer结构用于序列标注,在翻译任务…

simulink里枚举量的使用--在m文件中创建枚举量实践操作(推荐)

本文将介绍一种非常重要的概念,枚举量,以及它在simulink状态机中的使用,并且给出模型,方便大家学习。 枚举量:实际上是用一个名字表示了一个变量,能够比较方便的表示标志信息 A.简单举例: 1&a…

“低代码+平台”:驱动企业数字化转型与创新的新引擎

“低代码平台”作为一种新兴的软件开发范式,正逐渐成为企业快速响应市场变化、优化业务流程、提升数字化水平的重要手段。它的价值在于,将传统软件开发的复杂性大大降低,赋予了非技术人员或轻量级开发者快速构建应用的能力,并能灵…

docker 哲学 - 网络桥接器、容器网络接口 、容器间的通信方式

1、解释 docker0 veth eth 2、vethXX 和 ethXX 是肯定一一对应吗 比如 eth1 对应 veth1 3、如果 A容器使用 默认创建方式 。定义他内部网络为 eth0,容器B使用 --network 连上 已创建的网络 172.89.2.1 。此时假设 B的 ip是 172.89.2.2 ,容器网络接口是 e…

【蓝桥杯嵌入式】四、各种外设驱动(十一)ADC(1):软件触发与定时器触发

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录 【蓝桥杯嵌入式】附录 目录 重点提炼: 一、需求分析 1、需要的外设资源分析: 2、外设具体分析: 比赛时ADC可能需要配置的部分:…

视频批量爬虫下载工具|可导出视频分享链接|抖音视频提取软件

便捷的视频批量爬虫软件操作指南 抖音视频下载界面图解 主要功能: 关键词批量提取视频和单独视频提取,提取后下载功能。 功能解析: 1. 关键词批量采集视频的解析 对特定关键词进行搜索和视频提取,例如输入“汽车配件”&#x…

JVM面试篇

面试篇就是复习前面学的 什么是JVM 1.定义:JVM指的是Java虚拟机,本质是一个运行在计算机上的程序 2.作用:为了支持Java中Write Once ,Run Anywhere 编写一次 到处运行的跨平台特性 功能: 1.解释和运行 2.内存管理…

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日,主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业,星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时,星辰天合先…

Django日志(三)

内置TimedRotatingFileHandler 按时间自动切分的log文件,文件后缀 %Y-%m-%d_%H-%M-%S , 初始化参数: 注意 发送邮件的邮箱,开启SMTP服务 filename when=h 时间间隔类型,不区分大小写 S:秒 M:分钟 H:小时 D:天 W0-W6:星期几(0 = 星期一) midnight:如果atTime未指定,…

Swift知识点(二)

17. 字面量协议、模式匹配、条件编译 字面量(Literal) var age 10 var isRed false var name "Jack"上面代码中:10、false、"Jack"就是字面量 可以看到,初始化过程很简单,直接赋值即可 Swif…

Java微服务分布式事务框架seata的TCC模式

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

蓝桥杯 EDA 组 2023模拟+真题原理图解析

本文解析了标题内的原理图蓝桥杯EDA组真题,2021-2022 省赛真题/模拟题在上一篇文中。本文中重复或者是简单的电路节约篇幅不在赘述。 其中需要补充和计算原理图的题目解析都放在最下面 一、2023 年第十四届省赛模拟题1 1.1 Type-C 接口电路 通过 CH340N 将数据转化为…

List系列集合:ArrayList、LinkedList --java学习笔记

List系列集合 特点:有序、可重复、有索引 ArrayList:有序、可重复、有索引LinkedList:有序、可重复、有索引 List集合的特有方法 List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的…

Visual Studio 插件 AnAPI++ for VS 2022

Anmial API abbreviation AnAPIis an automatically generated WebAPI project that has encapsulated Jwt Oauth2 token authentication, SqlSugar, Swagger, Nlog, Cross domain technologies, and supports Net6 and above versions Anmial API缩写AnAPI是一个自动生成的Web…

pytest简介以及命令行执行

pytest简介以及安装 pytest简介导入第三方库修改工具类 pytest命令方式执行函数执行pytest中的参数详解 pytest简介 pytest有很多强大的插件 pytest-html (生成html格式的自动化测试报告) pytest-xdist (测试用例分布式执行,多cpu…

如何在 Odoo 17 中创建进度条

Odoo 提供各种字段小部件,例如单选按钮、浮点数、百分比、颜色选择器、复选框、状态栏和 URL。通过使用不同的渲染模板,我们可以使用小部件修改视图。它还帮助我们根据自己的需求进行设计,从而简化、加速、扩展和提高开发效率。在本博客中&am…

三分钟教会你水果音乐编曲软件 FL Studio v21.2.3 中文免费版安装方法

随着数字音乐制作的发展,音乐编曲软件已经成为音乐制作人和爱好者不可或缺的工具。FL Studio v21.2.3是一款功能强大的水果音乐编曲软件,它具有直观的界面,易于学习和使用。本文将介绍FL Studio v21.2.3的特点和优势,以及它在音乐…

cloudflare 应用例子几则

Cloudflare(以下简称 CF) 堪称互联网活菩萨,造就一大批高质量的互联网基础技术服务,更难得的是,几乎所有的服务都有对应的免费的套餐,而且出手大方,基本上有足够的容量或请求次数。 CDN CF 最…

Amazon Aurora Limitless Database :数据库管理的全新境界

在当今数亿用户、PB 级数据和数百万交易的业务环境中,数据库管理面临着巨大的挑战。传统数据库扩展的繁琐性和耗时性使得许多组织需要花费数月甚至数年的时间来构建自定义软件以满足其极端的工在当今数亿用户、PB 级数据和数百万交易的业务环境中,数据库…

美易官方:美股维持涨势,三大股指再创新高

在今日的早盘交易中,美股市场继续维持其涨势,三大股指再次刷新历史纪录。市场信心受到一系列积极经济数据的支撑,投资者对未来的经济增长和企业盈利保持乐观态度。 首先,让我们来看一下道琼斯工业平均指数的表现。该指数在早盘交易…