你在训模型的时候,有使用过颜色空间变换嘛?你知道常用的颜色空间有哪些呢?
1.使用颜色空间进行空间变换的项目
在我所做的一些项目中,目前使用颜色空间变换的比较少,目前就是看pix2pix-tensorflow中使用过,直接上图:
项目中使用了Lab空间变换来学习A->B图像的映射。在测试的时候,同样是使用了Lab变换,将生成的图来进行前向预测,再将输出结果转换成RGB图像。
当然,后面要是看到了其它项目使用到的话,我这边再进行补充!
2. 相关颜色空间
2. 1. RGB
RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色®,绿色(G)和蓝色(B)三个通道。这
三种颜色的不同组合可以形成几乎所有的其他颜色。RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间。
RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
但是,人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。
所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。
2.2 CMY/CMYK颜色空间
CMY是工业印刷采用的颜色空间。它与RGB对应。简单的类比RGB来源于是物体发光,而CMY是依据反射光得到的。具体应用如打印机:一般采用四色墨盒,即CMY加黑色墨盒。
2.3 HSV颜色空间
由于上述的原因,在实际图像处理中,我们使用更多的是HSV颜色空间,因为它可以比RGB更接近人们对彩色的感知经验。
其中,HSV主要是由表达彩色图像的三个部分组成:
- Hue,色相、色调
- Saturation:饱和度
- Value,明度
其中用一张图可以表明H、S、V三者之间的关系:
-
H用极坐标的极角表示
-
S用极坐标的极轴长度表示
-
V用圆柱中轴的高度表示
其中,Hue是用角度度量,取值范围为0~ 36 0 ∘ 360^{\circ} 360∘,表示所处的光谱颜色的位置。Hue=0表示红色,Hue=120表示绿色,Hue=240表示蓝色,等等。
Saturation是饱和度,其表示颜色接近光谱色的程度。其中,饱和度越高,表明颜色就越深。饱和度为0考试为纯色,取之范围为0~1,值越大,表示颜色越饱和。
Value表明了颜色空间中颜色的阴暗程度,明度越高,表示颜色越亮,范围为0~1,0为纯黑色。
2.4 HLS颜色空间
HLS 和 HSV 比较类似,这里一起介绍。HLS 也有三个分量,hue(色相)、saturation(饱和度)、lightness(亮度)。
HLS 中的 L 分量为亮度,亮度为100,表示白色,亮度为0,表示黑色。其中,S与L与HSV中保持一致。
2.5 YUV/YCbCr颜色空间
YUV是通过亮度-色差来描述颜色的颜色空间。亮度信号经常被称作Y,色度信号是由两个互相独立的信号组成。视颜色系统和格式不同,两种色度信号经常被称作UV或PbPr或CbCr。这些都是由不同的编码格式所产生的,但是实际上,他们的概念基本相同。在DVD中,色度信号被存储成Cb和Cr(C代表颜色,b代表蓝色,r代表红色)。
2.6 Lab颜色空间
Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:
-
L代表明度,取值0~100
-
a代表从绿色到红色的分量 ,取值-128~127
-
b代表从蓝色到黄色的分量,取值-128~127
2.7 LUV颜色空间
LUV通常是指一种颜色空间标准,目的是建立与视觉统一的颜色空间,因为人类眼睛有响应不同波长范围的三种类型的颜色传感器,所有可视颜色的完整绘图是三维的。但是颜色的概念可以分为两部分:明度和色度。
LUV的存在三个分量,L是亮度,u和v是色度坐标。对于一般的图像,u和v的取值范围为-100到+100,亮度为0到100。
2.8 代码举例
import matplotlib.pyplot as plt
import cv2
canshi_BGR = cv2.imread("./canshi.png")
# show BGR canshi
plt.subplot(3, 3, 1)
plt.imshow(canshi_BGR)
plt.axis('off')
plt.title('canshi_BGR')
# BGR to RGB
canshi_RGB = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2RGB)
plt.subplot(3, 3, 2)
plt.imshow(canshi_RGB)
plt.axis('off')
plt.title('canshi_RGB')
# BGR to GRAY
canshi_GRAY = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2GRAY)
plt.subplot(3, 3, 3)
plt.imshow(canshi_GRAY)
plt.axis('off')
plt.title('canshi_GRAY')
# BGR to YCrCb
canshi_YCrCb = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2YCrCb)
plt.subplot(3, 3, 4)
plt.imshow(canshi_YCrCb)
plt.axis('off')
plt.title('canshi_YCrCb')
# BGR to HSV
canshi_HSV = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2HSV)
plt.subplot(3, 3, 5)
plt.imshow(canshi_HSV)
plt.axis('off')
plt.title('canshi_HSV')
# BGR to HLS
canshi_HLS = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2HLS)
plt.subplot(3, 3, 6)
plt.imshow(canshi_HLS)
plt.axis('off')
plt.title('canshi_HLS')
# BGR to CIE L*a*b
canshi_Lab = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2Lab)
plt.subplot(3, 3, 7)
plt.imshow(canshi_Lab)
plt.axis('off')
plt.title('canshi_Lab')
# BGR to CIE L*u*v
canshi_Luv = cv2.cvtColor(canshi_BGR, cv2.COLOR_BGR2Luv)
plt.subplot(3, 3, 8)
plt.imshow(canshi_Luv)
plt.axis('off')
plt.title('canshi_Luv')
plt.show()
2.9 转换的具体公式(看了也记不住,整理在这,感兴趣的看看就好!反正我直接查API了)
2.9.1 RGB与灰度图之间的转换
RGB -> GRAY
Gray -> RGB
2.9.2 RGB与YCrCb之间的转换
RGB -> YCrCb
YCrCb -> RGB
2.9.3 RGB转HSV
RGB -> HSV
HSV -> RGB
2.9.4 RGB与HLS转换
RGB -> HLS
HLS -> RGB
2.9.5 RGB与Lab转换
RGB转Lab
RGB无法直接转换成Lab,需要先转换成XYZ再转换成Lab,即:RGB—>XYZ—>Lab。
1.首先是RGB转XYZ:
则:
其中:
等价于
2.其次是XYZ转Lab
上面两个公式中 L ⋆ L^{\star} L⋆, a ⋆ a^{\star} a⋆, b ⋆ b^{\star} b⋆是最终的LAB色彩空间三个通道的值。X,Y,Z是RGB转XYZ后计算出来的值, X n X_{n} Xn, Y n Y_{n} Yn, Z n Z_{n} Zn一般默认是1,1,1。
Lab转RGB
同样,需要Lab -> XYZ ->RGB.
1.Lab -> XYZ
其中,
3. 小结
传统图像处理关于颜色空间部分,基本上了解下,毕竟现在深度学习时代,基本上很多都只知道RGB~但是,我们是专业的AI从业人员,专业的CV工程师。
大家好,我是灿视。目前是位算法工程师 + 创业者 + 奶爸的时间管理者!
我曾在19,20年联合了各大厂面试官,连续推出两版《百面计算机视觉》,受到了广泛好评,帮助了数百位同学们斩获了BAT等大小厂算法Offer。现在,我们继续出发,持续更新最强算法面经。
我曾经花了4个月,跨专业从双非上岸华五软工硕士,也从不会编程到进入到百度与腾讯实习。
欢迎加我私信,点赞朋友圈,参加朋友圈抽奖活动。如果你想加入<百面计算机视觉交流群>,也可以私我。