文章目录
色彩
即是颜色,一种人体视觉系统对光的反射的不同波长的感知的结果。人们又对不同的波长范围的电磁波定义可视光的“颜色”。
在日常生活、美术课中,通过把(红黄蓝)三种颜色成为”认为是能够混合得到其他所有颜色的颜料。
而对于光学,就把(红绿蓝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 色彩空间
import cv2 as cv
# 读取RGB图像
img_rgb = cv.imread("image.jpg")# 将RGB图像转换为XYZ图像
img_xyz = cv.cvtColor(img_rgb, cv.COLOR_BGR2XYZ)
将 XYZ 色彩空间转换为 RGB 色彩空间
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)HSV(Hue, 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色彩空间
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等的转变
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 转换方式:
Gray =0.299*R +0.587*G +0.114*B
这种权重分布是基于人眼对不同颜色的敏感度来设计的。人眼对绿色的敏感度最高,红色次之,蓝色最低。这是因为人眼中的视网膜上有三种类型的颜色感受器,分别对红色、绿色和蓝色光最为敏感。
2.1.2 BGR -> GRAY
由于OpenCV默认是BGR的显示方式。
可以使用
cvtColor
函数是OpenCV库中的一个函数,用于将图像从一个颜色空间转换到另一个颜色空间。
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
参数:
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)# 打印转换后的图像的通道数,应该为1print(dst.shape)# (864, 1920, 3)
np.zeros_like(img)将创建一个与img具有相同形状(即相同的行数和列数)和数据类型的全零数组。这意味着返回的数组将具有与img相同的维度,并且每个元素都将被初始化为零。
这个函数在上述示例中的作用是创建一个与输入图像img具有相同大小和深度的空图像,用于存储cvtColor函数的转换结果。通过使用np.zeros_like(img),我们可以确保创建的空图像与输入图像具有相同的形状和数据类型,从而避免了在转换过程中出现大小或类型不匹配的错误。
原图
没有参数
import cv2 as cv
# 读取一张彩色图片
img = cv.imread('pic.jpg')# 使用cvtColor函数将图片从BGR色彩空间转换到灰度色彩空间
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 打印转换后的图像的通道数,应该为1print(gray.shape)
2.1.3 如何证明
Gray = 0.299*R + 0.587*G + 0.114*B
(1) 把彩色图拆分成三层图层
使用函数
b,g,r=cv.split(img1)
Step1: 基本代码
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:拆分
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三个通道。
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】类型转换函数
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]]]。
版权归原作者 你会魔法吗✧(≖ ◡ ≖✿) 所有, 如有侵权,请联系我们删除。