opencv-19 图像色彩空间转换函数cv2.cvtColor()

news/2025/3/19 23:34:37/

cv2.cvtColor() 函数是 OpenCV 中用于图像颜色空间转换的函数。它允许你将图像从一个色彩空间转换为另一个色彩空间。在 Python 中,你可以使用这个函数来实现不同色彩空间之间的转换。

函数的基本语法为:

cv2.cvtColor(src, code[, dst[, dstCn]])

参数说明:

src:输入图像,可以是 NumPy 数组或 OpenCV 中的 Mat 对象。
code:颜色空间转换代码,表示目标色彩空间。可以使用 OpenCV 中的 cv2.COLOR_* 常量来指定,如 cv2.COLOR_BGR2GRAY 表示将 BGR 彩色图像转换为灰度图像。
dst:可选参数,输出图像,可以是 NumPy 数组或 Mat 对象。如果未提供,将会创建一个新的图像来保存转换后的结果。
dstCn:可选参数,目标图像的通道数。默认值为 0,表示与输入图像通道数保持一致。

枚举值表:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里需要注意,BGR 色彩空间与传统的 RGB 色彩空间不同。对于一个标准的 24 位位图,
BGR 色彩空间中第 1 个 8 位(第 1 个字节)存储的是蓝色组成信息(Blue component),第 2
个 8 位(第 2 个字节)存储的是绿色组成信息(Green component),第 3 个 8 位(第 3 个字节)
存储的是红色组成信息(Red component)。同样,其第 4 个、第 5 个、第 6 个字节分别存储蓝色、绿色、红色组成信息,以此类推。
颜色空间的转换都用到了如下约定:
 8 位图像值的范围是[0,255]。
 16 位图像值的范围是[0,65 535]。
 浮点数图像值的范围是[0.0~1.0]。

对于线性转换来说,这些取值范围是无关紧要的。但是对于非线性转换来说,输入的 RGB图像必须归一化到其对应的取值范围内,才能获取正确的转换结果。

例如,对于 8 位图,其能够表示的灰度级有 28=256 个,也就是说,在 8 位图中,最多能表示 256 个状态,通常是[0,255]之间的值。但是,在很多色彩空间中,值的范围并不恰好在[0,255]
范围内,这时,就需要将该值映射到[0,255]内。

例如,在 HSV 或 HLS 色彩空间中,色调值通常在[0,360)范围内,在 8 位图中转换到上述色彩空间后,色调值要除以 2,让其值范围变为[0,180),以满足存储范围,即让值的分布位于8 位图能够表示的范围[0,255]内。

又例如,在 CIELab*色彩空间中,a 通道和 b 通道的值范围
是[−127,127],为了使其适应[0,255]的范围,每个值都要加上 127。
不过需要注意,由于计算过程存在四舍五入,所以转换过程并不是精准可逆的。
下面使用像素数组来观察转换效果

import cv2
import numpy as np
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rst=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("img=\n",img)
print("rst=\n",rst)print(img[1,0,0],img[1,0,1],img[1,0,2])print("像素点(1,0)直接计算得到的值=",img[1,0,0]*0.114+img[1,0,1]*0.587+img[1,0,2]*0.299)
print("像素点(1,0)使用公式 cv2.cvtColor()转换值=",rst[1,0])

结果如下:

img=[[[ 25  17 215][157  31  16][ 62  30  87][ 95 210 182]][[115 165 251][116  21  65][116  55 246][150  78  61]]]
rst=[[ 77  41  51 189][185  45 119  81]]
115
165
251
像素点(1,0)直接计算得到的值= 185.01399999999998
像素点(1,0)使用公式 cv2.cvtColor()转换值= 185

像素点(1,0)直接计算得到的值= 185.01399999999998
像素点(1,0)使用公式 cv2.cvtColor()转换值= 185

OpenCV 中,灰度图像是按照行列直接存储的。而 BGR 模式的图像会依次将它的 B 通道、G 通道、R 通道中的像素点,以行为单位按照顺序存储在 ndarray 的列中。例如,有大小
为 R 行×C 列的 BGR 图像,其存储方式如图 4-2 所示。
当图像由 RGB 色彩空间转换到 GRAY 色彩空间时,其处理方式如下:

Gray = 0.299 · 𝑅 + 0.587 · 𝐺 + 0.114 · B

在本例中,各个像素点的像素值如下:
 原始图像 BGR 图像内第 1 行第 0 列上的 B 通道像素点的值为 img[1,0,0]=115。
 原始图像 BGR 图像内第 1 行第 0 列上的 G 通道像素点的值为 img[1,0,1]=165。
 原始图像 BGR 图像内第 1 行第 0 列上的 R 通道像素点的值为 img[1,0,2]=251

在这里插入图片描述

计算结果为 185.0139。目标图像是灰度图像,是 8 位图像,值是位于[0,255]之间的无符号整数。所以,要将上述小数结果进行四舍五入,得到 185,并将它作为目标灰度图像内 rst[1,0]的像素值。


http://www.ppmy.cn/news/980991.html

相关文章

存储简单了解

存储目前常用的有磁盘(磁性存储器)和固态硬盘(半导体存储器) 磁盘由盘片,磁头和移动磁头的机械装置组成。磁盘从空间结构上分为扇区和磁道,每个扇区存储大小一致。 固态硬盘由多个闪存芯片组成,…

自然语言处理NLP介绍——NLP简介

目录 内容先进性说明内容大纲概要云服务器的使用 内容先进性说明 内容大纲概要 云服务器的使用

Redis持久化 :rdb与aof的持久化操作

redis持久化:分别启用rdb和aof,并查看是否有对应文件生成 rdb: #save 秒钟 写操作次数 如果在设置时间内写入数据达到规定的次数,则产生一次快照 [rootlocalhost redis-stable]# vim /etc/redis.conf :/save #查找有save关键字的…

VS构建项目报错信息及解决办法01

报错信息及解决1: 报错信息详情:1>MSVCRT.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 _WinMain16,该符号在函数 "int cdecl scrt_common_main_seh(void)" (?__scrt_common_main_sehYAHXZ) 中被引用 原因&…

若依框架后台管理系统-忘记后台管理密码-忘记密码重置方法

1. 无盐老版 1.1、生成密码密文1.2、替换数据库中密码2. 加盐新版 (今天 2022-03-16) 2.1、生成密码密文2.2、替换数据库中密码补充说明参考资料 管理后台忘记密码两步解决: 1. 无盐老版 1.1、生成密码密文 找到工具类:com.ruo…

【力扣每日一题】2023.7.25 将数组和减半的最少操作次数

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 题目给我们一个数组,我们每次可以将任意一个元素减半,问我们操作几次之后才可以将整个数组的和减半&…

【MIRA】学习笔记

1. 系统要求 支持Win11系统基于python进行开发 为什么不用直接适配ROS2呢? 因为ROS2(包括Iron)目前(截止至2023年7月26日)不支持Win11系统,我们不希望软件栈的选择会对操作系统有限制。 同时&#xff0c…

常用测试工具汇总

目录 1.Web页面检查器 2.客户端-代理抓包 3.自动化测试工具 3.1接口自动化测试 3.2webUI自动化测试 3.3客户端UI自动化测试 4.手机模拟器测试工具 5.阿里云测试工具 1.Web页面检查器 F12查看html页面,查看页面大小和加载时间 2.客户端-代理抓包 Charles&a…