我在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)

2 b

3 g

4 r

Step4 :计算(因为是整数所以会四舍五入计算)

(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通道的值都是相同的。

RGB三个通道的值

【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]]。

相关推荐
p似笑非笑5 小时前
在Mac上完美配置VSCode的C/C++开发环境(GCC/G++详细教程)
c语言·vscode·macos
daad77710 小时前
记录vscode连接matlab启动环境搭建
java·vscode·matlab
我命由我1234520 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
Luoxi_81 天前
Anaconda超详细的安装教程+VScode的使用
ide·vscode·编辑器
球king1 天前
CC GUI 插件:在 IDEA 中使用 CodeX
java·ide·intellij-idea
大龄牛码1 天前
从模型基座到工程范式:GPT-5.6与Grok 4.5在主流AI IDE中的架构适配与选型分析
ide·人工智能·gpt
无糖冰可乐211 天前
安装wsl2,并链接Windows上的vscode运行项目
pytorch·vscode·python·pip
不负信仰1 天前
Visual Studio 三月更新 —— 打造专属自定义 Agent
ide·visual studio
流量猎手1 天前
Vscode登陆服务器
服务器·ide·vscode
HAPPY酷1 天前
【ROS2】16G 内存笔记本跑 ROS2 仿真?VMware 虚拟机“保姆级”配置指南 (R9 7940HX + RTX 4060)
java·linux·ide·windows·pycharm