1 转换颜色空间

1 什么是颜色空间

颜色空间这个名词,初学计算机视觉可能没有听过,但是学了之前的课程,你一定知道,图像像素由三个颜色通道组成。这三个颜色通道就会构成一个颜色空间:BGR。


所以颜色空间由不同通道组成的一个多维的空间,用来表示图像的颜色


以BGR为例,我们可以通过调整三种颜色的不同比例得到各式各样的颜色,也就是说,我们利用三原色作为向量,构造了一个向量空间,这个向量空间表达的是颜色的空间(如下面这幅图),我们称之为颜色空间。

2 常见颜色空间

BGR是我们最常见的颜色空间,也有人叫BGR为RGB,用在计算机视觉里面,只不过是数据排列方式不同,但其内涵是一致的。其中:


B:blue蓝色G:green绿色R:red红色


除了BGR,还有很多颜色空间,最常见包括:


BGR系列灰度图像HSV/HSL


在后面,我们会详细讲一下常见的颜色空间,有兴趣的,大家也可以深入了解一下。

3 获取OpenCV中的颜色空间

我们了解了颜色空间,也知道了最常见的颜色空间,那OpenCV中的颜色空间都有哪些呢?


我们可以通过如下代码去获取:


# coding=utf-8

import cv.cv2 as cv


flags = [i for i in dir(cv) if i.startswith('COLOR_')]

print(flags)


执行结果如下:


【OpenCV教程】12 转换颜色空间_c++


这些颜色空间,是OpenCV中用于图像空间转换的颜色空间,具体的定义如下:


COLOR_BayerBG2BGR = 46
COLOR_BayerBG2BGRA = 139

COLOR_BayerBG2BGR_EA = 135
COLOR_BayerBG2BGR_VNG = 62

COLOR_BayerBG2GRAY = 86
COLOR_BayerBG2RGB = 48
COLOR_BayerBG2RGBA = 141

COLOR_BayerBG2RGB_EA = 137
COLOR_BayerBG2RGB_VNG = 64

COLOR_BayerGB2BGR = 47
COLOR_BayerGB2BGRA = 140

COLOR_BayerGB2BGR_EA = 136
COLOR_BayerGB2BGR_VNG = 63

COLOR_BayerGB2GRAY = 87
COLOR_BayerGB2RGB = 49
COLOR_BayerGB2RGBA = 142

COLOR_BayerGB2RGB_EA = 138
COLOR_BayerGB2RGB_VNG = 65

COLOR_BayerGR2BGR = 49
COLOR_BayerGR2BGRA = 142

COLOR_BayerGR2BGR_EA = 138
COLOR_BayerGR2BGR_VNG = 65

COLOR_BayerGR2GRAY = 89
COLOR_BayerGR2RGB = 47
COLOR_BayerGR2RGBA = 140

COLOR_BayerGR2RGB_EA = 136
COLOR_BayerGR2RGB_VNG = 63

COLOR_BayerRG2BGR = 48
COLOR_BayerRG2BGRA = 141

COLOR_BayerRG2BGR_EA = 137
COLOR_BayerRG2BGR_VNG = 64

COLOR_BayerRG2GRAY = 88
COLOR_BayerRG2RGB = 46
COLOR_BayerRG2RGBA = 139

COLOR_BayerRG2RGB_EA = 135
COLOR_BayerRG2RGB_VNG = 62

COLOR_BAYER_BG2BGR = 46
COLOR_BAYER_BG2BGRA = 139

COLOR_BAYER_BG2BGR_EA = 135
COLOR_BAYER_BG2BGR_VNG = 62

COLOR_BAYER_BG2GRAY = 86
COLOR_BAYER_BG2RGB = 48
COLOR_BAYER_BG2RGBA = 141

COLOR_BAYER_BG2RGB_EA = 137
COLOR_BAYER_BG2RGB_VNG = 64

COLOR_BAYER_GB2BGR = 47
COLOR_BAYER_GB2BGRA = 140

COLOR_BAYER_GB2BGR_EA = 136
COLOR_BAYER_GB2BGR_VNG = 63

COLOR_BAYER_GB2GRAY = 87
COLOR_BAYER_GB2RGB = 49
COLOR_BAYER_GB2RGBA = 142

COLOR_BAYER_GB2RGB_EA = 138
COLOR_BAYER_GB2RGB_VNG = 65

COLOR_BAYER_GR2BGR = 49
COLOR_BAYER_GR2BGRA = 142

COLOR_BAYER_GR2BGR_EA = 138
COLOR_BAYER_GR2BGR_VNG = 65

COLOR_BAYER_GR2GRAY = 89
COLOR_BAYER_GR2RGB = 47
COLOR_BAYER_GR2RGBA = 140

COLOR_BAYER_GR2RGB_EA = 136
COLOR_BAYER_GR2RGB_VNG = 63

COLOR_BAYER_RG2BGR = 48
COLOR_BAYER_RG2BGRA = 141

COLOR_BAYER_RG2BGR_EA = 137
COLOR_BAYER_RG2BGR_VNG = 64

COLOR_BAYER_RG2GRAY = 88
COLOR_BAYER_RG2RGB = 46
COLOR_BAYER_RG2RGBA = 139

COLOR_BAYER_RG2RGB_EA = 135
COLOR_BAYER_RG2RGB_VNG = 62

COLOR_BGR2BGR555 = 22
COLOR_BGR2BGR565 = 12
COLOR_BGR2BGRA = 0
COLOR_BGR2GRAY = 6
COLOR_BGR2HLS = 52

COLOR_BGR2HLS_FULL = 68

COLOR_BGR2HSV = 40

COLOR_BGR2HSV_FULL = 66

COLOR_BGR2Lab = 44
COLOR_BGR2LAB = 44
COLOR_BGR2Luv = 50
COLOR_BGR2LUV = 50
COLOR_BGR2RGB = 4
COLOR_BGR2RGBA = 2
COLOR_BGR2XYZ = 32
COLOR_BGR2YCrCb = 36

COLOR_BGR2YCR_CB = 36

COLOR_BGR2YUV = 82

COLOR_BGR2YUV_I420 = 128
COLOR_BGR2YUV_IYUV = 128
COLOR_BGR2YUV_YV12 = 132

COLOR_BGR5552BGR = 24
COLOR_BGR5552BGRA = 28
COLOR_BGR5552GRAY = 31
COLOR_BGR5552RGB = 25
COLOR_BGR5552RGBA = 29
COLOR_BGR5652BGR = 14
COLOR_BGR5652BGRA = 18
COLOR_BGR5652GRAY = 21
COLOR_BGR5652RGB = 15
COLOR_BGR5652RGBA = 19
COLOR_BGRA2BGR = 1
COLOR_BGRA2BGR555 = 26
COLOR_BGRA2BGR565 = 16
COLOR_BGRA2GRAY = 10
COLOR_BGRA2RGB = 3
COLOR_BGRA2RGBA = 5

COLOR_BGRA2YUV_I420 = 130
COLOR_BGRA2YUV_IYUV = 130
COLOR_BGRA2YUV_YV12 = 134

COLOR_COLORCVT_MAX = 143

COLOR_GRAY2BGR = 8
COLOR_GRAY2BGR555 = 30
COLOR_GRAY2BGR565 = 20
COLOR_GRAY2BGRA = 9
COLOR_GRAY2RGB = 8
COLOR_GRAY2RGBA = 9
COLOR_HLS2BGR = 60

COLOR_HLS2BGR_FULL = 72

COLOR_HLS2RGB = 61

COLOR_HLS2RGB_FULL = 73

COLOR_HSV2BGR = 54

COLOR_HSV2BGR_FULL = 70

COLOR_HSV2RGB = 55

COLOR_HSV2RGB_FULL = 71

COLOR_Lab2BGR = 56
COLOR_LAB2BGR = 56
COLOR_Lab2LBGR = 78
COLOR_LAB2LBGR = 78
COLOR_Lab2LRGB = 79
COLOR_LAB2LRGB = 79
COLOR_Lab2RGB = 57
COLOR_LAB2RGB = 57
COLOR_LBGR2Lab = 74
COLOR_LBGR2LAB = 74
COLOR_LBGR2Luv = 76
COLOR_LBGR2LUV = 76
COLOR_LRGB2Lab = 75
COLOR_LRGB2LAB = 75
COLOR_LRGB2Luv = 77
COLOR_LRGB2LUV = 77
COLOR_Luv2BGR = 58
COLOR_LUV2BGR = 58
COLOR_Luv2LBGR = 80
COLOR_LUV2LBGR = 80
COLOR_Luv2LRGB = 81
COLOR_LUV2LRGB = 81
COLOR_Luv2RGB = 59
COLOR_LUV2RGB = 59
COLOR_mRGBA2RGBA = 126

COLOR_M_RGBA2RGBA = 126

COLOR_RGB2BGR = 4
COLOR_RGB2BGR555 = 23
COLOR_RGB2BGR565 = 13
COLOR_RGB2BGRA = 2
COLOR_RGB2GRAY = 7
COLOR_RGB2HLS = 53

COLOR_RGB2HLS_FULL = 69

COLOR_RGB2HSV = 41

COLOR_RGB2HSV_FULL = 67

COLOR_RGB2Lab = 45
COLOR_RGB2LAB = 45
COLOR_RGB2Luv = 51
COLOR_RGB2LUV = 51
COLOR_RGB2RGBA = 0
COLOR_RGB2XYZ = 33
COLOR_RGB2YCrCb = 37

COLOR_RGB2YCR_CB = 37

COLOR_RGB2YUV = 83

COLOR_RGB2YUV_I420 = 127
COLOR_RGB2YUV_IYUV = 127
COLOR_RGB2YUV_YV12 = 131

COLOR_RGBA2BGR = 3
COLOR_RGBA2BGR555 = 27
COLOR_RGBA2BGR565 = 17
COLOR_RGBA2BGRA = 5
COLOR_RGBA2GRAY = 11
COLOR_RGBA2mRGBA = 125

COLOR_RGBA2M_RGBA = 125

COLOR_RGBA2RGB = 1

COLOR_RGBA2YUV_I420 = 129
COLOR_RGBA2YUV_IYUV = 129
COLOR_RGBA2YUV_YV12 = 133

COLOR_XYZ2BGR = 34
COLOR_XYZ2RGB = 35
COLOR_YCrCb2BGR = 38
COLOR_YCrCb2RGB = 39

COLOR_YCR_CB2BGR = 38
COLOR_YCR_CB2RGB = 39

COLOR_YUV2BGR = 84

COLOR_YUV2BGRA_I420 = 105
COLOR_YUV2BGRA_IYUV = 105
COLOR_YUV2BGRA_NV12 = 95
COLOR_YUV2BGRA_NV21 = 97
COLOR_YUV2BGRA_UYNV = 112
COLOR_YUV2BGRA_UYVY = 112
COLOR_YUV2BGRA_Y422 = 112
COLOR_YUV2BGRA_YUNV = 120
COLOR_YUV2BGRA_YUY2 = 120
COLOR_YUV2BGRA_YUYV = 120
COLOR_YUV2BGRA_YV12 = 103
COLOR_YUV2BGRA_YVYU = 122

COLOR_YUV2BGR_I420 = 101
COLOR_YUV2BGR_IYUV = 101
COLOR_YUV2BGR_NV12 = 91
COLOR_YUV2BGR_NV21 = 93
COLOR_YUV2BGR_UYNV = 108
COLOR_YUV2BGR_UYVY = 108
COLOR_YUV2BGR_Y422 = 108
COLOR_YUV2BGR_YUNV = 116
COLOR_YUV2BGR_YUY2 = 116
COLOR_YUV2BGR_YUYV = 116
COLOR_YUV2BGR_YV12 = 99
COLOR_YUV2BGR_YVYU = 118

COLOR_YUV2GRAY_420 = 106
COLOR_YUV2GRAY_I420 = 106
COLOR_YUV2GRAY_IYUV = 106
COLOR_YUV2GRAY_NV12 = 106
COLOR_YUV2GRAY_NV21 = 106
COLOR_YUV2GRAY_UYNV = 123
COLOR_YUV2GRAY_UYVY = 123
COLOR_YUV2GRAY_Y422 = 123
COLOR_YUV2GRAY_YUNV = 124
COLOR_YUV2GRAY_YUY2 = 124
COLOR_YUV2GRAY_YUYV = 124
COLOR_YUV2GRAY_YV12 = 106
COLOR_YUV2GRAY_YVYU = 124

COLOR_YUV2RGB = 85

COLOR_YUV2RGBA_I420 = 104
COLOR_YUV2RGBA_IYUV = 104
COLOR_YUV2RGBA_NV12 = 94
COLOR_YUV2RGBA_NV21 = 96
COLOR_YUV2RGBA_UYNV = 111
COLOR_YUV2RGBA_UYVY = 111
COLOR_YUV2RGBA_Y422 = 111
COLOR_YUV2RGBA_YUNV = 119
COLOR_YUV2RGBA_YUY2 = 119
COLOR_YUV2RGBA_YUYV = 119
COLOR_YUV2RGBA_YV12 = 102
COLOR_YUV2RGBA_YVYU = 121

COLOR_YUV2RGB_I420 = 100
COLOR_YUV2RGB_IYUV = 100
COLOR_YUV2RGB_NV12 = 90
COLOR_YUV2RGB_NV21 = 92
COLOR_YUV2RGB_UYNV = 107
COLOR_YUV2RGB_UYVY = 107
COLOR_YUV2RGB_Y422 = 107
COLOR_YUV2RGB_YUNV = 115
COLOR_YUV2RGB_YUY2 = 115
COLOR_YUV2RGB_YUYV = 115
COLOR_YUV2RGB_YV12 = 98
COLOR_YUV2RGB_YVYU = 117

COLOR_YUV420p2BGR = 99
COLOR_YUV420P2BGR = 99
COLOR_YUV420p2BGRA = 103
COLOR_YUV420P2BGRA = 103
COLOR_YUV420p2GRAY = 106
COLOR_YUV420P2GRAY = 106
COLOR_YUV420p2RGB = 98
COLOR_YUV420P2RGB = 98
COLOR_YUV420p2RGBA = 102
COLOR_YUV420P2RGBA = 102
COLOR_YUV420sp2BGR = 93
COLOR_YUV420SP2BGR = 93
COLOR_YUV420sp2BGRA = 97
COLOR_YUV420SP2BGRA = 97
COLOR_YUV420sp2GRAY = 106
COLOR_YUV420SP2GRAY = 106
COLOR_YUV420sp2RGB = 92
COLOR_YUV420SP2RGB = 92
COLOR_YUV420sp2RGBA = 96
COLOR_YUV420SP2RGBA = 96




这里我们是将全部的列举出来,最常用的是我们今天提到的三个之间的转化:


COLOR_BGR2BGRA = 0COLOR_BGR2GRAY = 6COLOR_BGR2HLS = 52COLOR_BGR2HSV = 40COLOR_BGR2RGB = 4COLOR_BGR2RGBA = 2
COLOR_BGRA2BGR = 1COLOR_BGRA2GRAY = 10COLOR_BGRA2RGB = 3COLOR_BGRA2RGBA = 5
COLOR_GRAY2BGR = 8COLOR_GRAY2BGRA = 9COLOR_GRAY2RGB = 8COLOR_GRAY2RGBA = 9
COLOR_HLS2BGR = 60COLOR_HLS2RGB = 61
COLOR_HSV2BGR = 54COLOR_HSV2RGB = 55
COLOR_RGB2BGR = 4COLOR_RGB2BGRA = 2COLOR_RGB2GRAY = 7COLOR_RGB2HLS = 53
COLOR_RGB2HSV = 41COLOR_RGB2RGBA = 0COLOR_RGBA2BGR = 3COLOR_RGBA2BGRA = 5COLOR_RGBA2GRAY = 11COLOR_RGBA2RGB = 1


总结如下:


0-5:表示BGR系列之间的相互转化,其中还有一个通道A,表示的是第四个参数alpha,用于设置透明图像。可以让图片更好地进行合成。6-11:BGR系列与灰度图像之间的转化;40、41:BGR、RGB转为HSV52、53:BGR、RGB转为HLS54、55:HSV转为BGR、RGB60、61:HLS转为BGR、RGB


4 转换颜色空间API

在OpenCV中,提供了调整色彩空间的API。


这个API是:cvtColor ,该API实现的功能是:


将一个图像从一个图像的颜色空间转换为图像的另一个颜色空间。


API定义如下:


def cvtColor(src, code, dst=None, dstCn=None)


API参数含义如下:


(1)src:第一个输入图像(2)code:颜色空间转换编码(3)dst:输出图像(4)dstCn:输出图像通道数,默认和原图像一致


第二个参数可选择的值就是我们上面通过代码获取到的。


第四个参数默认和原图一样,所以不用写。

5 代码示例

我们举个例子:


# coding=utf-8

import cv.cv2 as cv
import numpy as np

def changeColorSpace(mode):
    dst = cv.cvtColor(img, modeList[mode])
    cv.putText(dst, nameList[mode], (10100), cv.FONT_HERSHEY_SIMPLEX, 4, (25112185), 2, cv.LINE_AA)
    cv.imshow('change Color Space', dst)

modeList = [64052]
nameList = ['GRAY''HSV''HLS']
img = cv.imread('./image/sign.png')
cv.namedWindow('change Color Space')

cv.createTrackbar('conversion code','change Color Space',0,2,changeColorSpace)
cv.waitKey(0)
cv.destroyAllWindows()


执行结果如下:


模式0:转为灰度图像


模式1:转为HSV


【OpenCV教程】12 转换颜色空间_c++_02

模式2:转为HLS



附:常见颜色空间

1 总述

我们生活中会常见一些颜色空间,OpenCV中也定义了一些颜色空间,在这里,我们详细的讲解一下常见的颜色空间。

2 BGR系列

BGR是我们最常见的颜色空间,也有人叫BGR为RGB,用在计算机视觉里面,只不过是数据排列方式不同,但其内涵是一致的。


BGR系列包括BGR,RGB等包含R,G,B三个颜色分量的颜色空间。一般来说三个分量的取值范围都是0-255,如果用16进制表示就是0-FF,每个通道的数值表示该通道所占的比重。例如如下几个:


注:在有些图像里面,范围不是0-255。这是因为图像编码不同,我们一般说的图像数据都是八位数据,所以是0-255,如果是16位,就是0-65535。我们这是基本教程,所以我们只讲一般情况。


BGR是最常见的颜色空间,也是我们最常使用的颜色空间。但是BGR系列也有一些问题:


1.自然界中,由于光照等问题的影响,颜色发生变化,而是哪个颜色分量和光照都有关,所以图像亮度改变,三个通道的颜色都会改变。2.人眼睛对不同颜色的敏感程度不同,有时候难以对一个颜色进行区分。


这些问题就会导致,我们图像显示很方便,但是在图像处理的过程中,会受到人的主观感受和光照等外部因素的影响,难以处理


在OpenCV中,BGR系列有两种排布方式,一种是BGR,一种是RGB,这个只是排布方式不同,如果我们使用cvtColor转化:


# coding=utf-8

import cv.cv2 as cv
import numpy as np

pic = np.ones((2,2,3), np.uint8)*50
for i in range(2):
   for j in range(2):
       # pic[i][j][0] = 50
       pic[i][j][1] = 100
       pic[i][j][2] = 150

print("转换前:\n", pic)

pic_rgb = cv.cvtColor(pic, cv.COLOR_BGR2RGB)

print("转换后:\n", pic_rgb)


执行结果如下:


转换前: [[[ 50 100 150]    [ 50 100 150]]  [[ 50 100 150]   [ 50 100 150]]]转换后: [[[150 100  50]   [150 100  50]]  [[150 100  50]   [150 100  50]]]


我们发现,R和B通道的数据换了位置。


BGR系列还有一个参数A表示的是RGB模型的附加了额外的信息,可以用于图像合成与图像融合,我们称之为alpha通道


alpha通道一般用作不透明参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。在0%和100%之间的值则使得像素可以透过背景显示出来,就像透过玻璃(半透明性)。alpha通道值可以用百分比、整数或者像RGB参数那样用0到1的实数表示。


PNG是一种使用RGBA的图像格式。

3 灰度图像

灰度图像可以理解为简化的BGR图像,BGR有三个通道,而灰度图像只有一个通道,所以灰度图像也叫单通道图像


灰度图像通道的取值范围也是0-255,0表示纯黑色,255表示纯白色,值越小,灰度越大,颜色越深,值越大,灰度越小,颜色越浅,越趋于白色。


下面这幅图,就是我们从0一直取到255后的图案:


【OpenCV教程】12 转换颜色空间_c++_03


4 HSV与HSL

HSV系列是除了RGB系列最常见的表达彩色图像的颜色空间,其中:


H表示Hue,色调;S表示Saturation,饱和度;V表示Value,明度;


H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;


S:一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。


V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)


HSV空间如下:


【OpenCV教程】12 转换颜色空间_c++_04


有人说,V表示的是亮度,其实不然。有另外一种方式——HSL来表示亮度,前两个和HSV一致,最后一个L表示的是light亮度。


亮度和明度的区别在于:L表示的是亮度,强调白色的亮度如何;V表示的是明度,表示光的亮度,可以是任何颜色光的亮度

5 其他

除了上述常见的,还有很多颜色空间,例如:


CMY:CMY是工业印刷采用的颜色空间。YUV:YUV是通过亮度-色差来描述颜色的颜色空间。Lab:Lab颜色模型是由CIE(国际照明委员会)制定的一种色彩模式。


有兴趣的,大家可以深入了解一下。