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

news2024/9/24 13:22:58

目录

一、色彩空间

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)
 

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

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

相关文章

windows DCMTK编译使用(qt) 医学图像

由于项目需要生成DICOM格式的图片,需要使用到第三方开源库DCMTK,于是研究了一番,该库是C编写的,DICOM主要用于医疗体系中,除了可以保存图片信息外,还可以储存患者信息,病例信息,医疗…

如何修复WordPress网站媒体库上传文件失败的问题

公司最近推出了一系列新产品,为了更新网站的视频和图片,我们需要将它们上传至网站媒体库。然而,在上传视频时,我们却遇到了一些问题。系统提示说,我们尝试上传的视频文件大小超出了站点的最大上传限制。尽管我们的视频…

vue3中使用cesium

vue3中使用cesium Cesium是一个开源的JavaScript库,专门用于创建3D地球和2D地图的Web应用程序。它提供了丰富的功能和工具,使得开发人员能够轻松地构建出高质量的地理空间可视化应用。 1. 安装cesium包 npm install cesium2. 复制node_modules中的Ces…

Java IO流(超详细!)上篇

目录 一、File类1、操作文件和目录 二、I/O流概述1、按流向划分:输入流和输出流2、按处理单元划分:字节流和字符流3、按流的角色划分:节点流和处理流 三、字节流1、字节输出流基类:OutputStream2、字节输出流FileOutputStream类3、…

通过fail2ban服务监控frps日志实现禁止非法IP

前言 服务器使用了frp作为了内网穿透软件,查看frps的日志,发现总有一些国外的ip在扫描这台服务器的端口信息,日志如下图,所以想通过fail2ban服务能够直接禁用这些ip扫描服务器。 1、安装fail2ban服务 yum install -y fail2ban2、…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

解决idea粘贴空格时显示NBSP的问题并且在Registry中找不到editor.show.special.chars

1、解决java 复制代码NBSP问题 参考文章 原因:2020.2版本以后无法找到以上的选项来解决问题;之后的版本这个选项换地方了 解决办法:在设置中找到Advanced Settings,把Render special characters前面的对勾取消掉就好了。

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

HarmonyOS ArkTS 开发基础/语言

目录 一、ArkUI (方舟开发框架) 概述 1.1 基本概念 1.2 两种开发范式 1.3 不同应用类型支持的开发范式 二、ArkTS 声明式开发范式 2.1 开发能力 2.2 整体架构 三、ArkTS 基础类型 3.1 Any 类型 3.2 数字类型 3.3 字符串类型 3.4 布尔类型 3.5 联合类型 3.6 数组类…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人&#xff0c;按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分&#xff0c;其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据&#xff1a;htt…

基于springboot的留守儿童爱心网站

技术&#xff1a;springbootmysqlvue 一、系统背景 现代社会&#xff0c;由于经济不断发展&#xff0c;旧物捐赠的数量也在不断的增加&#xff0c;人们对留守儿童爱心信息的需求也越来越高。 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&am…

堆(详解+例题)

一、定义 维护一个数据集合&#xff0c;堆是一个完全二叉树。 那么什么是二叉树呢&#xff1f; 如图&#xff1a; 二、关于小根堆实现 性质&#xff1a;每个根节点都小于等于左右两边&#xff0c;所以树根为最小值。 2.1、堆存储&#xff08;用一维数组来存&#xff09; 记住…

C# 设置AutoScroll为true没效果的原因分析和解决办法

C#中添加tabControl 分页&#xff0c;将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后&#xff0c;检索发现也有很多人询问了该问题&#xff0c;但是都没有给出解决方案。 原因是内部button的属性Anchor设置为top、left、right、bottom导致的缩小界面窗口也没…

浅谈C++20 协程那点事儿

协程概念 先介绍一点协程的概念&#xff0c;如果你已经理解和掌握了相关的背景知识就可以跳过这个章节&#xff08;或者快速浏览下&#xff0c;也许我们有些观念不一致可以讨论&#xff09;。这里我想稍微聊的深入一点&#xff0c;这涉及到入门后遇到复杂的协程问题时能不能正…

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数…

【计算机考研】杭电 vs 浙工大 怎么选?

想求稳上岸的话&#xff0c;其他几所学校也可以考虑&#xff0c;以留在本地工作的角度考虑&#xff0c;这几所学校都能满足你的需求。 如果之后想谋求一份好工作&#xff0c;肯定优先杭电是比较稳的&#xff0c;当然复习的时候也得加把劲。 这个也可以酌情考虑&#xff0c;报…

固定资产管理系统日常业务有哪些

固定资产管理是一个非常重要的阶段。它涉及公司的长期投资、资产保值和资产报表的准确性。许多企业选择固定资产管理系统来有效管理这些资产。那么&#xff0c;固定资产管理系统的日常业务有哪些呢&#xff1f;  我们必须明确什么是固定资产管理系统。简而言之&#xff0c;它…

MYSQL报 - Lock wait timeout exceeded; try restarting transaction

前言 今天在使用数据库编辑数据时&#xff0c;页面突然卡主&#xff0c;退出程序后重新编辑&#xff0c;发现报错&#xff0c;1205 - Lock wait timeout exceeded&#xff1b; try restarting transaction&#xff08;如下图&#xff09;&#xff0c;正巧在和同事开会&#xf…

基于Spring Boot+Vue的高校学科竞赛平台

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

其他api的使用

其他api的使用 Frame切换frame方法认识frame 切换多窗口多窗口方法认识多窗口 切换多窗口工具封装切换多窗口工具方法认识切换多窗口工具 面试题&#xff1a;执行UI自动化时如找不到元素截图应用截图方法认识截图 图片添加的问题时间戳方法时间戳认识 验证码处理验证码方法cook…