百面AI,致力构建起最强AI算法面经!欢迎关注我们!
在我所做的一些项目中,目前使用颜色空间变换的比较少,目前就是看pix2pix-tensorflow中使用过,直接上图:
项目中使用了Lab空间变换来学习A->B图像的映射。在测试的时候,同样是使用了Lab变换,将生成的图来进行前向预测,再将输出结果转换成RGB图像。
当然,后面要是看到了其它项目使用到的话,我这边再进行补充!
RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)三个通道。这
三种颜色的不同组合可以形成几乎所有的其他颜色。RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间。
RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
但是,人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。
所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。
CMY是工业印刷采用的颜色空间。它与RGB对应。简单的类比RGB来源于是物体发光,而CMY是依据反射光得到的。具体应用如打印机:一般采用四色墨盒,即CMY加黑色墨盒。
由于上述的原因,在实际图像处理中,我们使用更多的是HSV颜色空间,因为它可以比RGB更接近人们对彩色的感知经验。
其中,HSV主要是由表达彩色图像的三个部分组成:
其中用一张图可以表明H、S、V三者之间的关系:
img
,表示所处的光谱颜色的位置。Hue=0表示红色,Hue=120表示绿色,Hue=240表示蓝色,等等。 Saturation是饱和度,其表示颜色接近光谱色的程度。其中,饱和度越高,表明颜色就越深。饱和度为0考试为纯色,取值范围为0~1,值越大,表示颜色越饱和。 Value表明了颜色空间中颜色的阴暗程度,明度越高,表示颜色越亮,范围为0~1,0为纯黑色。
HLS 和 HSV 比较类似,这里一起介绍。HLS 也有三个分量,hue(色相)、saturation(饱和度)、lightness(亮度)。
HLS 中的 L 分量为亮度,亮度为100,表示白色,亮度为0,表示黑色。其中,S与L与HSV中保持一致。
YUV是通过亮度-色差来描述颜色的颜色空间。亮度信号经常被称作Y,色度信号是由两个互相独立的信号组成。视颜色系统和格式不同,两种色度信号经常被称作UV或PbPr或CbCr。这些都是由不同的编码格式所产生的,但是实际上,他们的概念基本相同。在DVD中,色度信号被存储成Cb和Cr(C代表颜色,b代表蓝色,r代表红色)。
Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:
LUV通常是指一种颜色空间标准,目的是建立与视觉统一的颜色空间,因为人类眼睛有响应不同波长范围的三种类型的颜色传感器,所有可视颜色的完整绘图是三维的。但是颜色的概念可以分为两部分:明度和色度。
LUV的存在三个分量,L是亮度,u和v是色度坐标。对于一般的图像,u和v的取值范围为-100到+100,亮度为0到100。
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.其次是XYZ转Lab
上面两个公式中,
,
,
是最终的LAB色彩空间三个通道的值。X,Y,Z是RGB转XYZ后计算出来的值,
,
,
一般默认是1,1,1。
其中,
传统图像处理关于颜色空间部分,基本上了解下,毕竟现在深度学习时代,基本上很多都只知道RGB~但是,我们是专业的AI从业人员,专业的CV工程师。
你好,我是灿视。目前我正致力于做出最强的AI算法面经。如果你从业算法,或者打算从业算法,可以关注我们哦!