05 OpenCV色彩空间处理

news2024/11/26 7:34:07

色彩空间(Color Space)是一种用于描述颜色的数学模型,它将颜色表示为多维向量或坐标,通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异,不同的色彩空间有不同的作用,主要包括以下几点:

  1. 色彩空间可以提高图像处理的准确性。例如,由于人类的视觉对亮度(L)和颜色(a、b)的感知不同,Lab色彩空间可以提高图像处理算法在颜色边缘的准确性。

  2. 色彩空间可以扩展可表示的颜色范围。例如,RGB色彩空间只能表示一部分可见光谱范围内的颜色,而HSV色彩空间可以表示更广泛的颜色范围,使得在计算机视觉和图像处理中更加灵活。

  3. 色彩空间可以降低计算复杂度。例如,在颜色量化和压缩中使用YUV色彩空间可以减少计算量,提高图像处理的速度。

  4. 色彩空间可以满足不同的应用需求。例如,RGB色彩空间广泛用于计算机显示器和数字相机中,HSV色彩空间用于图像分割和特征提取,YUV色彩空间用于视频编码和传输等。

常见的色彩空间包括RGB、HSV、HSL、Lab、YUV等,每种色彩空间都有其独特的特点和应用场景。选择合适的色彩空间可以更好地解决图像处理和计算机视觉中的问题,提高图像处理的效率和准确性。

1 色彩空间基础知识

1.1 GRAY色彩空间

GRAY是一种单通道的灰度色彩空间,其代表了图像中每个像素的亮度值(Luminance),而不考虑颜色的饱和度和色调。GRAY色彩空间的亮度值通常使用 8 位无符号整数来表示,取值范围为 0~255,其中 0 表示黑色,255 表示白色。

GRAY色彩空间广泛应用于图像处理、计算机视觉和机器学习等领域中。相比于其他色彩空间,GRAY色彩空间有以下几个优点:

  1. GRAY色彩空间计算简单,只需考虑像素的亮度值,因此处理速度较快。

  2. GRAY色彩空间对图像的光照变化、色彩变化等因素具有较好的鲁棒性。

  3. GRAY色彩空间可以提取图像的纹理信息,对于纹理分析、边缘检测和形状识别等方面具有优势。

  4. GRAY色彩空间可以被看作是其他色彩空间(如RGB、HSV等)的一种简化形式,可以方便地进行色彩空间的转换。

在使用GRAY色彩空间进行图像处理时,常用的操作包括图像增强、图像滤波、图像分割、形态学处理和特征提取等。例如,通过对GRAY色彩空间的图像应用滤波算法,可以去除图像中的噪声和干扰,提高图像质量和辨识度;通过对GRAY色彩空间的图像进行形态学处理,可以提取图像的轮廓和纹理信息,实现图像分割和形状识别等功能。

Gray与RGB的转换方式为:
g r a y = 0.299 R + 0.587 G + 0.114 B gray = 0.299 R + 0.587 G + 0.114 B gray=0.299R+0.587G+0.114B

1.2 HSV色彩空间

HSV(Hue-Saturation-Value)是一种基于人类视觉感知的颜色模型,它将颜色表示为三维向量或坐标,其中包括色相(Hue)、饱和度(Saturation)和亮度(Value)三个分量。

  • 色相(Hue)表示颜色的基本属性,是色彩的本质特征,可以用角度度量(0~360°),对应于色轮上的位置。常见的色相包括红、黄、绿、青、蓝、紫等。

  • 饱和度(Saturation)表示颜色的纯度或深浅程度,是指该颜色与灰色的比例,取值范围为0~1。当饱和度为1时,颜色最鲜艳、最纯粹;当饱和度为0时,颜色最暗淡、最接近灰色。

  • 亮度(Value)表示颜色的明暗程度,是指该颜色的亮度,取值范围为0~1。当亮度为1时,颜色最亮;当亮度为0时,颜色最暗。

HSV色彩空间的使用有以下优点:

  1. 相对于RGB色彩空间,HSV色彩空间更符合人类视觉感知,能更好地描述颜色的主要属性和纯度。

  2. HSV色彩空间可更好地区分相似颜色,便于颜色选择、匹配和分类。

  3. HSV色彩空间可以方便地调整颜色的属性,如改变色相、饱和度和亮度,实现图像增强、特效处理和色彩平衡等功能。

在图像处理、计算机视觉和计算机图形学等领域中,HSV色彩空间常用于图像分割、特征提取、目标跟踪、目标检测、图像检索等方面。例如,在基于颜色的目标跟踪中,可以使用HSV色彩空间提取出目标的颜色信息,结合运动模型进行跟踪。

2 色彩空间的Python操作

2.1 空间转换

使用cv2.cvtColor()函数实现色彩空间的转换。
cv2.cvtColor() 是 OpenCV 中用于颜色空间转换的函数,它可以将一幅图像从一个颜色空间转换到另一个颜色空间。

cv2.cvtColor(src, code[, dst[, dstCn]]) 函数的参数说明如下:

  • src:需要转换的原始图像,可以是 numpy 数组、Mat 对象或图像文件名。
  • code:颜色空间转换的标志,可以使用预定义的颜色空间标志,如 cv2.COLOR_BGR2GRAY 表示将 BGR 色彩空间转换为 GRAY 色彩空间;也可以使用任意的两个自定义颜色空间的转换标志,如 cv2.COLOR_RGB2HSV 表示将 RGB 色彩空间转换为 HSV 色彩空间。
  • dst:可选参数,表示输出图像,其类型与原始图像的类型相同。
  • dstCn:可选参数,表示输出图像的通道数,当源图像和目标图像的通道数不同时,需要指定该参数。

cv2.cvtColor() 函数常用的颜色空间转换标志包括:

  • cv2.COLOR_BGR2GRAY:将 BGR 色彩空间转换为 GRAY 色彩空间。
  • cv2.COLOR_BGR2RGB:将 BGR 色彩空间转换为 RGB 色彩空间。
  • cv2.COLOR_BGR2HSV:将 BGR 色彩空间转换为 HSV 色彩空间。
  • cv2.COLOR_RGB2GRAY:将 RGB 色彩空间转换为 GRAY 色彩空间。
  • cv2.COLOR_RGB2BGR:将 RGB 色彩空间转换为 BGR 色彩空间。
  • cv2.COLOR_RGB2HSV:将 RGB 色彩空间转换为 HSV 色彩空间。
  • cv2.COLOR_GRAY2BGR:将 GRAY 色彩空间转换为 BGR 色彩空间。
  • cv2.COLOR_HSV2BGR:将 HSV 色彩空间转换为 BGR 色彩空间。

2.2 按颜色提取

cv2.inRange() 是 OpenCV 中用于提取图像中特定颜色区域的函数,它可以将一幅图像中所有颜色值在特定范围内的像素提取出来,生成一个二值掩模(mask)。

cv2.inRange(src, lowerb, upperb[, dst]) 函数的参数说明如下:

  • src:输入图像,可以是 numpy 数组、Mat 对象或图像文件名。
  • lowerb:代表颜色范围下限的数组或标量值,形状与输入图像相同。使用HSV格式。
  • upperb:代表颜色范围上限的数组或标量值,形状与输入图像相同。使用HSV格式。
  • dst:可选参数,表示输出的二值掩模,其大小与输入图像相同。

cv2.inRange() 函数的工作原理是,对于输入图像的每个像素,将其颜色值与 lowerbupperb 定义的颜色范围进行比较。如果该像素的颜色值在范围内,则该像素在输出的二值掩模中对应的像素值为 255,否则为 0。因此,输出的二值掩模中的像素值只有 0 和 255 两种取值。通过生成的掩膜,可以实现对图像的提取。
实例代码如下

import cv2  
import numpy as np  
  
# 读入图像  
img = cv2.imread('lenacolor.png')  
  
# 定义红色区域的范围  
lower_red = np.array([0, 0, 150])  
upper_red = np.array([100, 100, 255])  
  
# 提取红色区域  
mask = cv2.inRange(img, lower_red, upper_red)  
  
# 将掩模应用到原图像  
result = cv2.bitwise_and(img, img, mask=mask)  
  
# 显示结果  
cv2.imshow('original', img)  
cv2.imshow('mask', mask)  
cv2.imshow('result', result)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

image.png

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

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

相关文章

ChatGPT写代码水平惊艳到我,很性感但有点危险

这几天属实是被ChatGPT刷屏了,十年寒窗无人问,一举成名天下知。不少人和ChatGPT对话后,都觉得自己像个傻逼。这位“最强懂哥”可以轻松应答各种问题,给出的答案不仅条理清晰,还会引用例子支撑观点。让它帮忙写程序&…

九、初识卷积

文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时,神经网络的前几层需要完成对图像的边缘检测任务,所谓的边缘检测就是让计算机识别出一张图片的垂直…

【智能计算数学】微积分

高数问题解决流程引例:回归回归引例:分类分类线性可分FLD线性不可分智能计算讨论范围下降法为什么要用下降法?- 解析解很难写出公式或很复杂难计算有哪些常用的下降法?- 梯度下降&高斯-牛顿法梯度下降(Gradient De…

初步认识操作系统(Operator System)

操作系统一,冯诺依曼体系结构内存的重要作用二,操作系统的概念三,设计操作系统的目的三,操作系统在计算机体系中的定位四,操作系统是如何进行管理的一,冯诺依曼体系结构 在众多计算机相关的书籍中&#xff…

linux安装docker和Docker Compose

1、安装环境 此处在Centos7进行安装,可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位、系统内核版本为 3.10 以上,可以使用以下命令查看 uname -r 2、用yum源安装 2.1 查看是否已安装docker列表 yum list inst…

Doom流量回放工具导致的测试环境服务接口无响应的排查过程

Doom流量回放工具导致的测试环境服务接口无响应的排查过程 现象描述: a)部分接口(A组接口)无响应 b)部分接口(B组接口)正常响应 c)还有一部分接口(C组接口),场景1无响应,场景2正常响…

ChatGPT 桌面应用程序 for macOS, Linux, Windows v0.10

请访问原文链接:https://sysin.org/blog/chatgpt/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org ChatGPT 是什么 ChatGPT 是 OpenAI 公司开发的一种基于对话优化的语言模型。用俗话说就是“人工智障”聊天机器…

三次握手-升级详解-注意问题

TCP建立连接的过程就是三次握手(Three-way Handshake),在建立连接的过程实际上就是客户端和服务端之间总共发送三个数据包。进行三次握手主要是就是为了确认双方都能接收到数据包和发送数据包,而客户端和服务端都会指定自己的初始…

Tomcat构建

软件架构C/S:Client/Server.需要安装才能使用。B/S:Brower/Server。有浏览器就可以。资源分类动态资源:每个用户访问相同的资源后,得到的结果可能不一样,称为动态资源。动态资源被访问后,先转换为静态资源,再被浏览器解…

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码 SemaphoreHandle_t freeBowl NULL;//初始状态有5个空碗 SemaphoreHandle_t Mantou NULL;//初始状态没有馒头,从零开始计数 int queue[5]; //用数组模拟空碗,对数组取余操作,模拟循环链…

如何利用 ESLint 规范 TypeScript 代码

ESLint 是一种 JavaScript linter,可以用来规范 JavaScript 或 TypeScript 代码,本文教你怎么在项目中快速把 ESLint 安排上。 前导 怎么写出优雅的代码是一个老生常谈的话题,这其中包含了太多内容可聊,但搞一套标准规范绝对是万…

opencv锁定鼠标定位

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

【MySQL进阶】 存储引擎 索引

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…

如何编译和运行C++程序?

C 和C语言类似,也要经过编译和链接后才能运行。在《C语言编译器》专题中我们讲到了 VS、Dev C、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器,它们除了可以运行C语言程序,还可以运行 C 程序,步骤是一样的&#…

SpringMvc的请求和响应

SpringMvc的数据响应 1.springmvc的数据相应方式 &#xff08;1&#xff09;页面跳转 直接返回字符串 通过ModelAndView对象返回 &#xff08;2&#xff09;回写数据 直接返回字符串 返回对象或集合 页面跳转 jsp页面 <% page contentType"text/html;charsetUTF-8&q…

ChatGPT的出现,为我们展现出来的是智能社会来临的美好图景

ChatGPT&#xff0c;的确是当下最炙手可热的一个话题。然而&#xff0c;人们对于ChatGPT的认识&#xff0c;依然还是仅仅停留在ChatGPT本身&#xff0c;而没有将它与它的「前任」——元宇宙、web3.0&#xff0c;乃至NFT联系在一起。如果在看待ChatGPT的时候&#xff0c;将它放置…

KDJ日周月金叉共振指标

昨天介绍了MACD多周期共振指标公式&#xff0c;KDJ通过类似的写法&#xff0c;也可以共振。本文介绍的KDJ日周月金叉共振指标包含日周金叉共振、日月金叉共振、周月金叉共振、日周月金叉共振四种类型。 需要注意的问题依然是周、月金叉的信号漂移&#xff0c;接近周末月末的信…

如何用Redis实现延迟队列

背景前段时间有个小项目需要使用延迟任务&#xff0c;谈到延迟任务&#xff0c;我脑子第一时间一闪而过的就是使用消息队列来做&#xff0c;比如RabbitMQ的死信队列又或者RocketMQ的延迟队列&#xff0c;但是奈何这是一个小项目&#xff0c;并没有引入MQ&#xff0c;我也不太想…

企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean

文章目录一、Spring容器演示——采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Maven项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;采用传统方式让勇…

IDEA设置方法注释模板

IDEA设置方法注释模板 类注释模板方法注释模板 效果步骤 补充 类注释模板 类注释模板是IDEA创建类时生成的注释&#xff0c;之前发文章跟大家分享过了&#xff0c;而且这也不是本篇文章的重点&#xff0c;文章的链接附在下面&#xff0c;需要的朋友可以去看看。 Intellij ID…