opencv中的色彩空间及其转换

在 OpenCV 中,色彩空间(Color Space)指的是表示颜色的一种方式,或是用数学模型对颜色的表达。不同的色彩空间采用不同的方式来描述颜色的三要素(如亮度、饱和度、色调),因此可以在不同的应用场景下提供不同的优点。

在计算机视觉和图像处理中,了解和转换不同的色彩空间是非常重要的,因为某些操作(例如,目标检测、图像分割、特征提取等)在某些色彩空间中比在其他色彩空间中更加有效。

1. 常见的色彩空间

OpenCV 支持多种色彩空间的转换。以下是常见的几种色彩空间:

1.1 RGB(Red, Green, Blue)和 BGR(Blue, Green, Red)

RGB:

  • RGB 是最常用的色彩空间,尤其是在显示设备(如显示器、电视)中。每种颜色通道(红、绿、蓝)用一个整数值表示,通常是 0 到 255(即 8 位表示)。
  • 该色彩空间直观且易于理解,主要用于显示和图像采集。每个颜色通道的值分别代表图像中的红、绿和蓝的强度。
BGR:
  • BGR 是 OpenCV 中的默认色彩空间。虽然 RGB 更常见,但 OpenCV 默认读取图像为 BGR 格式。这是因为 OpenCV 设计时参考了早期的一些硬件标准。
  • 在 BGR 色彩空间中,蓝色(Blue)是第一个通道,绿色(Green)是第二个通道,红色(Red)是第三个通道。
  • opencv中imread、imshow、imwrite都是使用的BGR的顺序。
import cv2# 读取 RGB 图像
img_bgr = cv2.imread('./images/bg.jpg')
print(img_bgr.shape)  # 输出图像的尺寸,通常是 (height, width, channels)
print(img_bgr[0, 0, :]) # 查看第一像素的颜色值 [192 162 105] [B,G,R]
cv2.imshow('bgr', img_bgr)img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_RGB2BGR)
print(img_rgb.shape)
print(img_rgb[0, 0, :]) # 查看第一像素的颜色值 [105 162 192] [R,G,B]
cv2.imshow('rgb', img_rgb) # 图像转成RGB后imshow显示会有所变化cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 HSV(Hue, Saturation, Value)
  • HSV 是一种在色彩选择、图像分割和增强中非常常用的色彩空间。它通过三个参数来描述颜色:色调(Hue)、饱和度(Saturation)和明度(Value)。

    • 色调(H):颜色的类型,通常表示为角度,范围为 0° 到 360°,例如,红色为 0°,绿色为 120°,蓝色为 240°。
    • 饱和度(S):颜色的纯度或强度,范围是 0 到 100%。0 表示灰色,100% 表示最纯的颜色。
    • 明度(V):颜色的亮度或亮度,范围是 0 到 100%。0 表示完全黑色,100% 表示最亮的颜色。
  • 在 HSV 空间中,图像的颜色信息更符合人类的视觉感知,通常在图像分割、颜色跟踪等任务中表现优异。

# BGR 转换到 HSV 
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
print(img_hsv) # (200, 300, 3)
print(img_hsv[0,0,:]) # 第一个像素的hsv值:[100, 116, 192] [h,s,v]
1.4 HLS(Hue, Lightness, Saturation)
  • HLS 色彩空间与 HSV 相似,但将饱和度和亮度的位置交换。HLS 也常用于色彩处理,它比 HSV 更能模拟人眼对颜色的感知。
    • 色调(H):与 HSV 中的色调相同,表示颜色的类型。
    • 亮度(L):亮度的描述,不同于 HSV 中的明度,HLS 中的亮度表现方式与实际视觉体验更接近。
    • 饱和度(S):颜色的饱和度,范围 0 到 100%。
# BGR 转换到 HLS 
img_hls = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HLS)
print(img_hls.shape) # (200, 300, 3)
print(img_hls[0,0,:]) # [100 149 104]
1.5 Lab(CIELAB)
  • Lab 是一种基于人类视觉感知的色彩空间,分为三个通道:

    • L:亮度(Lightness),范围是 0 到 100,0 表示黑色,100 表示白色。
    • a:绿色到红色的色差,负值表示绿色,正值表示红色。
    • b:蓝色到黄色的色差,负值表示蓝色,正值表示黄色。
  • Lab 色彩空间的一个重要特点是它是与设备无关的(与显示设备的亮度、对比度等无关),因此在许多图像处理任务中具有很好的稳定性。

# BGR 转换到 Lab 
img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
print(img_lab.shape) # (200, 300, 3)
print(img_lab[0,0,:]) # [163 117 107]
1.6 YUV
  • YUV 色彩空间常用于视频编码和广播电视等应用。它将颜色分为亮度分量(Y)和色度分量(U 和 V),因此能够更有效地处理视频图像。
    • Y:亮度分量(Luminance),范围是 0 到 255。
    • U 和 V:色度分量,表示色彩信息,范围是 -128 到 127。
# BGR 转换到 YUV 
img_yuv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YUV)
print(img_yuv.shape) # (200, 300, 3)
print(img_yuv[0,0,:]) # [148 150  90]

2. 常见色彩空间转换

OpenCV 提供了非常方便的色彩空间转换函数 cv2.cvtColor。以下是一些常见的色彩空间转换:

  • BGR 到 HSV

    img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
  • BGR 到 RGB

    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
  • BGR 到 Lab

    img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
  • BGR 到 YUV

    img_yuv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YUV)
  • RGB 到 HSV

    img_hsv = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2HSV)

3. 使用色彩空间的场景

3.1 图像分割

在某些色彩空间(例如 HSV、Lab)中,分割图像中的不同颜色区域比在 RGB 空间中更为简便。例如,我们可以通过设置合适的色调、饱和度和亮度阈值来提取特定颜色的区域。

3.2 目标追踪

HSV 和 HLS 空间的色调分量对于目标追踪特别有效,尤其是在目标的颜色变化较大时,使用色调(H)来进行追踪更为准确。

3.3 颜色校正与增强

Lab 和 YUV 空间在颜色校正和增强中非常常用,特别是在改变图像的亮度、对比度、饱和度时。

4. 总结

OpenCV 支持多种色彩空间,每种色彩空间有其特定的优点,选择合适的色彩空间可以帮助我们更好地完成图像处理任务。常见的色彩空间包括 RGB、BGR、HSV、HLS、Lab 和 YUV,每个空间通过不同的方式表示颜色信息。在进行图像处理时,理解这些色彩空间的特点和如何在它们之间进行转换是非常重要的。

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

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

相关文章

大模型微调---Prompt-tuning微调

目录 一、前言二、Prompt-tuning实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、Prompt-tuning微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 Prompt-tuning通过修改输入文本的提示(Prompt)来引导模型生…

Edge Scdn用起来怎么样?

Edge Scdn:提升网站安全与性能的最佳选择 在当今互联网高速发展的时代,各种网络攻击层出不穷,特别是针对网站的DDoS攻击威胁,几乎每个行业都可能成为目标。为了确保网站的安全性与稳定性,越来越多的企业开始关注Edge …

通信技术以及5G和AI保障电网安全与网络安全

摘 要:电网安全是电力的基础,随着智能电网的快速发展,越来越多的ICT信息通信技术被应用到电力网络。本文分析了历史上一些重大电网安全与网络安全事故,介绍了电网安全与网络安全、通信技术与电网安全的关系以及相应的电网安全标准…

批量提取zotero的论文构建知识库做问答的大模型(可选)——含转存PDF-分割统计PDF等

文章目录 提取zotero的PDF上传到AI平台保留文件名代码分成20个PDF视频讲解 提取zotero的PDF 右键查看目录 发现目录为 C:\Users\89735\Zotero\storage 写代码: 扫描路径‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部复制一份汇总到"C:\Users\89735\Downl…

精准采集整车信号:风丘混合动力汽车工况测试

一 背景 混合动力汽车是介于纯电动汽车与燃油汽车两者之间的一种新能源汽车。它既包含纯电动汽车无污染、启动快的优势,又拥有燃油车续航便捷、不受电池容量限制的特点。在当前环境下,混合动力汽车比纯电动汽车更符合目前的市场需求。 然而&#xff0c…

带标题和不带标题的内部表

什么是工作区? 什么是工作区?简单来说,工作区是单行数据。它们应具有与任何内部表相同的格式。它用于一次处理一行内部表中的数据。 内表和工作区的区别 ? 一图胜千言 内表的类型 有两种类型的内表: 带 Header 行…

【图像分类实用脚本】数据可视化以及高数量类别截断

图像分类时,如果某个类别或者某些类别的数量远大于其他类别的话,模型在计算的时候,更倾向于拟合数量更多的类别;因此,观察类别数量以及对数据量多的类别进行截断是很有必要的。 1.准备数据 数据的格式为图像分类数据集…

React系列(八)——React进阶知识点拓展

前言 在之前的学习中,我们已经知道了React组件的定义和使用,路由配置,组件通信等其他方法的React知识点,那么本篇文章将针对React的一些进阶知识点以及React16.8之后的一些新特性进行讲解。希望对各位有所帮助。 一、setState &am…

PCIe_Host驱动分析_地址映射

往期内容 本文章相关专栏往期内容,PCI/PCIe子系统专栏: 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 深入解析非桥PCI设备的访问和配置方法 PCI桥设备的访问方法、软件角度讲解PCIe设备的硬件结构 深入解析PCIe设备事务层与配置过程 PCIe的三…

【阅读记录-章节6】Build a Large Language Model (From Scratch)

文章目录 6. Fine-tuning for classification6.1 Different categories of fine-tuning6.2 Preparing the dataset第一步:下载并解压数据集第二步:检查类别标签分布第三步:创建平衡数据集第四步:数据集拆分 6.3 Creating data loa…

梳理你的思路(从OOP到架构设计)_简介设计模式

目录 1、 模式(Pattern) 是较大的结构​编辑 2、 结构形式愈大 通用性愈小​编辑 3、 从EIT造形 组合出设计模式 1、 模式(Pattern) 是较大的结构 组合与创新 達芬奇說:簡單是複雜的終極形式 (Simplicity is the ultimate form of sophistication) —Leonardo d…

【libuv】Fargo信令2:【深入】client为什么收不到服务端响应的ack消息

客户端处理server的ack回复,判断链接连接建立 【Fargo】28:字节序列【libuv】Fargo信令1:client发connect消息给到server客户端启动后理解监听read消息 但是,这个代码似乎没有触发ack消息的接收: // 客户端初始化 void start_client(uv_loop_t

Python-基于Pygame的小游戏(贪吃蛇)(一)

前言:贪吃蛇是一款经典的电子游戏,最早可以追溯到1976年的街机游戏Blockade。随着诺基亚手机的普及,贪吃蛇游戏在1990年代变得广为人知。它是一款休闲益智类游戏,适合所有年龄段的玩家,其最初为单机模式,后来随着技术发…

使用k6进行MongoDB负载测试

1.安装环境 安装xk6-mongo扩展 ./xk6 build --with github.com/itsparser/xk6-mongo 2.安装MongoDB 参考Docker安装MongoDB服务-CSDN博客 连接成功后新建test数据库和sample集合 3.编写脚本 test_mongo.js import xk6_mongo from k6/x/mongo;const client xk6_mongo.new…

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块?模块是一个封装了特定功能的代码块,可以独立开发、测试和维护。模块通过导出(export)和导入(import)与其他模块通信,保持内部细节的封装。 前端 JavaScript 模块化是指…

最小堆及添加元素操作

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 最小堆及添加元素操作 [太阳]选择题 以下代码执行的结果为? import heapq heap [] heapq.heappush(heap, 5) heapq.heappush(heap, 3) heapq.heappush(heap, 2) heapq.…

【计算机网络】期末考试预习复习|中

作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备,转发器、网桥、路由器和网关有何区别? (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…

前端工程化-Vue脚手架安装

在现代前端开发中,Vue.js已成为一个流行的框架,而Vue CLI(脚手架)则为开发者提供了一个方便的工具,用于快速创建和管理Vue项目。本文将详细介绍如何安装Vue脚手架,创建新项目以及常见问题的解决方法。 什么…

罗德与施瓦茨ZN-Z129E网络分析仪校准套件具体参数

罗德与施瓦茨ZN-Z129E网络校准件ZN-Z129E网络分析仪校准套件 1,频率范围从9kHz到4GHz(ZNB4),8.5GHz(ZNB8),20GHz(ZNB20),40GHz(ZNB40) 2,动态范围宽,高达140 dB 3,扫描时间短达4ms…

如何为IntelliJ IDEA配置JVM参数

在使用IntelliJ IDEA进行Java开发时,合理配置JVM参数对于优化项目性能和资源管理至关重要。IntelliJ IDEA提供了两种方便的方式来设置JVM参数,以确保你的应用程序能够在最佳状态下运行。本文将详细介绍这两种方法:通过工具栏编辑配置和通过服…