我在Vscode学OpenCV 色彩空间转换

文章目录

  • 色彩
  • [【 1 】色彩空间(色域)](#【 1 】色彩空间(色域))
  • [【 2 】色彩空间转换](#【 2 】色彩空间转换)
    • [2.1 GRAY色彩空间](#2.1 GRAY色彩空间)
      • [2.1.1 转换方式:](#2.1.1 转换方式:)
      • [2.1.2 BGR -> GRAY](#2.1.2 BGR -> GRAY)
      • [2.1.3 如何证明`Gray = 0.299*R + 0.587*G + 0.114*B`](#2.1.3 如何证明Gray = 0.299*R + 0.587*G + 0.114*B)
        • [(1) 把彩色图拆分成三层图层](#(1) 把彩色图拆分成三层图层)
        • [(2)证明当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的。](#(2)证明当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的。)
  • 【3】类型转换函数

色彩

即是颜色,一种人体视觉系统对光的反射的不同波长的感知的结果。人们又对不同的波长范围的电磁波定义可视光的"颜色"。

在日常生活、美术课中,通过把(红黄蓝)三种颜色成为"认为是能够混合得到其他所有颜色的颜料。

而对于光学,就把(红绿蓝RGB)三基色【此处为了区分名字】是能够创建其他颜色的基本。

例如,RGB值(255, 0, 0)表示纯红色,(0, 255, 0)表示纯绿色,(0, 0, 255)表示纯蓝色,(0, 0, 0)表示黑色,(255, 255, 255)表示白色。

【 1 】色彩空间(色域)

一种抽象的数学模型,以不同的维度和表示方式,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有RGB、CMYK、Lab等。

常见的:

(1)RGB色彩空间

三种基本颜色的不同组合来表示颜色,在计算机图像和电视显示技术中广泛使用。

与xyz色彩空间的转换

将 RGB 色彩空间转换为 XYZ 色彩空间
python 复制代码
import cv2 as cv

# 读取RGB图像
img_rgb = cv.imread("image.jpg")

# 将RGB图像转换为XYZ图像
img_xyz = cv.cvtColor(img_rgb, cv.COLOR_BGR2XYZ)
将 XYZ 色彩空间转换为 RGB 色彩空间
python 复制代码
import cv2 as cv

# 读取XYZ图像
img_xyz = cv.imread("image.jpg")

# 将XYZ图像转换为RGB图像
img_rgb = cv.cvtColor(img_xyz, cv.COLOR_XYZ2BGR)

(2)CMYK色彩空间

青色(Cyan)、品红(Magenta)、黄色(Yellow)加上黑色(Key)四种基本颜色的不同组合来表示颜色。主要用于印刷业。[全彩印刷]

此处缩写使用最后一个字母K而非开头的B,是因为在整体色彩学中已经将B给了RGB的Blue蓝色

(3)HSVHue, Saturation, Value)色彩空间

HSV代表色调(Hue)、饱和度(Saturation)、明度(Value)。

  • 色调(Hue):表示颜色的种类,如红色、蓝色、绿色等。在HSV模型中,色调被表示为角度,范围从0到360度。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
  • 饱和度(Saturation):表示颜色的纯度,饱和度越高,颜色越纯,饱和度越低,颜色越接近灰色。在HSV模型中,饱和度的范围是0到1。
  • 明度(Value):表示颜色的亮度。在HSV模型中,明度的范围也是0到1,0表示完全的黑色,1表示最亮的颜色。

OpenCV中,可以使用cv.cvtColor函数将RGB色彩空间转换为HSV色彩空间

python 复制代码
hsv_image = cv.cvtColor(rgb_image, cv.COLOR_RGB2HSV)

色调(Hue)是指光的颜色,与光的波长相关。不同的波长对应不同的色调,例如红色、橙色、黄色等。

饱和度(Saturation)表示颜色的纯净度或深浅程度。高饱和度的颜色是纯净的,没有混合其他颜色的成分。低饱和度的颜色则含有更多的灰色或白色成分,使其看起来较淡。

亮度(Value)反映了光的明暗程度,即颜色的明亮度。较高的亮度表示颜色较亮,较低的亮度表示颜色较暗。亮度受到颜色中白色或黑色成分的影响,白色成分增加会使亮度增加,黑色成分增加会使亮度减少。

这些概念描述了颜色的不同特性,色调决定了颜色的种类,饱和度决定了颜色的纯净度,亮度决定了颜色的明暗程度。

(4)YUV和YCbCr色彩空间

Y表示亮度信息,U和V或Cb和Cr表示色度信息,这种分离的方式使得视频压缩更为高效。


【 2 】色彩空间转换

是指有一种色彩空间的状态以另一种方式表现出来。

例如:RGB -> HSV 或者RGB -> GRAY

而在OpenCV中,cv的表现是BGR那么就是BGR向HSV或者GRAY等的转变

python 复制代码
cv.cvtColor(input_image,flag)

input_image 是需要进行空间转换的图像
flag为转换后的类型

cv.COLOR_BGR2GRAY:bgr->gray

cv.COLOR_BGR2HSV:bgr->hsv 

2.1 GRAY色彩空间

GRAY色彩空间,也被称作灰度色彩空间,每个像素按照一个通道去 ' 灰度 ' 表示。

这种灰度在先前也介绍过,当时我们以二值图像为引,二值是非黑即白的图像,而在灰度图中给其划分开了 ' 灰度级别 ' (只有256个灰度级别,像素值的范围:[0,255] ,由黑向白)

它可以帮助在图像处理和计算机视觉人物中简化问题,降低复杂性,同时仍然保留了大部分的结构和形状信息。

2.1.1 转换方式:

python 复制代码
Gray = 0.299*R + 0.587*G + 0.114*B

这种权重分布是基于人眼对不同颜色的敏感度来设计的。人眼对绿色的敏感度最高,红色次之,蓝色最低。这是因为人眼中的视网膜上有三种类型的颜色感受器,分别对红色、绿色和蓝色光最为敏感。

2.1.2 BGR -> GRAY

由于OpenCV默认是BGR的显示方式。

可以使用cvtColor函数是OpenCV库中的一个函数,用于将图像从一个颜色空间转换到另一个颜色空间。

python 复制代码
cvtColor(src, code[, dst[, dstCn]]) -> dst

The conventional ranges for R, G, and B channel values are:

. - 0 to 255 for CV_8U images

. - 0 to 65535 for CV_16U images

. - 0 to 1 for CV_32F images
参数:

python 复制代码
import numpy as np
import cv2 as cv

# 读取一张彩色图片
img = cv.imread('./Pic/test_img.jpg')

# 创建一个与输入图像同样大小的空图像,用于存储转换结果
dst = np.zeros_like(img)

# 使用cvtColor函数将图片从BGR色彩空间转换到灰度色彩空间
# 我们提供了dst参数,所以函数将把转换结果存储在这个图像中
# 我们也提供了dstCn参数,指定输出图像的通道数为1
cv.cvtColor(img, cv.COLOR_BGR2GRAY, dst=dst, dstCn=1)

# 打印转换后的图像的通道数,应该为1
print(dst.shape)

# (864, 1920, 3)

np.zeros_like(img)将创建一个与img具有相同形状(即相同的行数和列数)和数据类型的全零数组。这意味着返回的数组将具有与img相同的维度,并且每个元素都将被初始化为零。

这个函数在上述示例中的作用是创建一个与输入图像img具有相同大小和深度的空图像,用于存储cvtColor函数的转换结果。通过使用np.zeros_like(img),我们可以确保创建的空图像与输入图像具有相同的形状和数据类型,从而避免了在转换过程中出现大小或类型不匹配的错误。

原图

没有参数

python 复制代码
import cv2 as cv

# 读取一张彩色图片
img = cv.imread('pic.jpg')

# 使用cvtColor函数将图片从BGR色彩空间转换到灰度色彩空间
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 打印转换后的图像的通道数,应该为1
print(gray.shape)

2.1.3 如何证明Gray = 0.299*R + 0.587*G + 0.114*B

(1) 把彩色图拆分成三层图层

使用函数b,g,r=cv.split(img1)

Step1: 基本代码

python 复制代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1=cv.imread("Pic/test_img.jpg")
# img1=cv.imread("Pic/test_img.jpg",0)  实现下面的同理
src=cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
plt.imshow(img1[:,:,::-1])

Step2:拆分

python 复制代码
b,g,r=cv.split(img1)
img1


Step3:拆分情况

1 \] 灰度的src(原图img1) ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/095c678087f6280bb9bd8b7d1dcf22d7.webp) \[ 2 \] b ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/9c6b2a72fd9684a87d19189724746f11.webp) \[ 3 \] g ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/2b03285bec76a8864027bfcdc2a0f039.webp) \[ 4 \] r ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/a83882ec62aee33c64307d63fe64365c.webp) **Step4** :计算(因为是整数所以会四舍五入计算) ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/79490bcf3d4aceffea3a64b59a5d51a6.webp) ##### (2)证明当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的。 从灰度图像(GRAY)转换回RGB图像时,所有的R、G、B通道的值都会是相同的。这是因为灰度图像只有一个通道,所以在转换回RGB图像时,这个单一的通道的值会被复制到R、G、B三个通道。 ```python import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 读取灰度图像 img_gray = cv.imread("Pic/test_img.jpg", 0) # 将灰度图像转换为RGB图像 img_rgb = cv.cvtColor(img_gray, cv.COLOR_GRAY2BGR) # 分离RGB通道 b, g, r = cv.split(img_rgb) # 检查R、G、B三个通道的值是否相同 print("R == G: ", np.all(r == g)) print("R == B: ", np.all(r == b)) print("G == B: ", np.all(g == b)) ``` 首先读取一个灰度图像,然后将其转换为RGB图像。然后,它分离出R、G、B三个通道,并检查这三个通道的值是否相同。如果所有的输出都是True,那么就证明了在从灰度图像转换为RGB图像时,所有的R、G、B通道的值都是相同的。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/ce20cde3c0c19e18ba895e45cc69ab79.webp) > RGB三个通道的值 > ![在这里插入图片描述](https://file.jishuzhan.net/article/1723869416686358530/7f0e421fa66ebac1a943021c0329e998.webp) ## 【3】类型转换函数 ```python dst = cv2.cvtColor( src, code [, dstCn] ) ``` cv2.cvtColor() 是OpenCV中的一个函数,用于进行颜色空间的转换。它接受三个参数: * src:输入图像,可以是一个NumPy数组或一个OpenCV的Mat对象。 * code:颜色空间转换的代码,指定了要进行的转换类型。常见的转换类型包括: * cv2.COLOR_BGR2GRAY:将BGR图像转换为灰度图像。 * cv2.COLOR_BGR2HSV:将BGR图像转换为HSV色彩空间。 * cv2.COLOR_BGR2RGB:将BGR图像转换为RGB色彩空间。 * 其他转换类型可以在OpenCV的文档中找到。 * dstCn(可选):目标图像的通道数。默认值为0,表示与输入图像的通道数相同。 函数的返回值是转换后的图像,以NumPy数组的形式返回。 ### 【4】标记指定颜色 在 HSV 色彩空间中,H 通道(饱和度 Hue 通道)对应不同的颜色。 ### 1.通过inRange函数锁定特定值 OpenCV 中通过函数 cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其 语法格式为: dst = cv2.inRange( src, lowerb, upperb ) 式中:  dst 表示输出结果,大小和 src 一致。  src 表示要检查的数组或图像。  lowerb 表示范围下界。  upperb 表示范围上界。 返回值 dst 与 src 等大小,其值取决于 src 中对应位置上的值是否处于区间\[lowerb,upperb

内:

 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。

 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0

HSV色彩空间

蓝色的RGB值为[[[255 0 0]]],转换为HSV值为[[[120 255 255]]]。

绿色的RGB值为[[[0 255 0]]],转换为HSV值为[[[60 255 255]]]。

红色的RGB值为[[[0 0 255]]],转换为HSV值为[[[0 255 255]]]。

相关推荐
等风来不如迎风去1 小时前
【ubuntu24.04】pycharm 死机结束进程
ide·chrome·pycharm
humiaor4 小时前
Xcode报错:“Set `maskView` to `nil` before adding it as a subview of ZFMaskView
ide·macos·xcode·ios18报错
谢尔登8 小时前
【VSCode】修改侧边文件资源管理器中的文件夹折叠模式
ide·vscode·编辑器
hnlucky8 小时前
windows编写和调试代码工具——IDE安装
ide·windows
whoarethenext9 小时前
c/c++的opencv的轮廓匹配初识
c语言·c++·opencv
新手村领路人9 小时前
qt5.14.2 opencv调用摄像头显示在label
qt·opencv·命令模式
bloglin999999 小时前
关闭VSCode 自动更新
ide·vscode·编辑器
慢一点会很快11 小时前
【vscode】解决vscode无法安装远程服务器插件问题,显示正在安装
服务器·ide·vscode
谢尔登12 小时前
【VSCode】快捷键合集(持续更新~)
ide·vscode·编辑器
习明然14 小时前
Visual Studio2022跨平台Avalonia开发搭建
ide·visual studio