常用色彩空间 RGB HSV YUV

参考资料

链接:https://www.jianshu.com/p/3e44c2262775

RGB色彩空间

在图像处理中最常用的就是RGB色彩空间,非常容易被理解,用三个颜色分量来表示某个具体颜色。
在这里插入图片描述
他们组成三维正交座标系统,该系统中任何颜色都落入RGB彩色立方体内,在RGB颜色模型中,黑色在原点处,白色位于离原点最远的角上,灰度级沿着这两点的连线分布,每一个分量图像都是其原色图像。
在这里插入图片描述
三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。
只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。

存储类型

(1)RGB555:16位的RGB格式,各分量都用5位表示,剩下的一位不用。

高字节 -> 低字节(根据内存大小端) XRRRRRGGGGGBBBBB(X代表不用)

(2)RGB565:16位的RGB格式,但是R占用5位,G占用6位,B占用5位。

(3)RGB24:24位的RGB格式,各分量占用8位,取值范围为0-255。

(4)RGB32:32位的RGB格式,各分量占用8位,剩下的8位作Alpha通道或者不用。

(5)RGB222:8位的RGB格式,各分量占用2bit位,剩下的2bit位不用!

为什么三原色可以表示不同的色彩,基本的原理是吸收俩种,反射另一种;把黄色颜料和青色颜料混合起来,因为黄色颜料吸收蓝光,青色颜料吸收红光,因此只有绿色光反射出来,这就是黄色颜料加上青色颜料形成绿色的道理。

HSV色彩空间

而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何

H:色彩 ,就是我们平时所说的颜色,红、黄、橘红等 取值范围是0°~360° ,从红色开始 ,逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。
S:饱和度,色彩的深浅度(0~100%)
V:明度,色彩的色调(0~100%)
在这里插入图片描述

有个很棒的理解方式:HSV模型对应于画家配色的方法。画家用改变色浓和 色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时 加入不同比例的白色,黑色即可获得各种不同的色调。

HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4
S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。
–百度百科

在这里插入图片描述

如果我们把红色,也就是H为0°,做个切片,那么可以更好的分析色调 ,饱和度,亮度的关系
关键点:
当S=1 V=1时,H所代表的任何颜色被称为纯色;
当S=0时,颜色最浅,最浅被描述为灰色(灰色也有亮度,黑色和白色也属于灰色),灰色的亮度由V决定,此时H无意义;
当V=0时,颜色最暗,最暗被描述为黑色,因此此时H(无论什么颜色最暗都为黑色)和S(无论什么深浅的颜色最暗都为黑色)均无意义。
下面是当H=0度 即为红色时,S和V组成的平面:
在这里插入图片描述
在这张图中,S沿横轴从左到右0-1增长 V沿纵轴由下到上0-1增长
可以看到,当S=0,即矩形左边的竖线边缘处,呈不同深浅的灰色
当V=0,即矩形下班的横线边缘处,呈黑色
当S=0 V=1时,此时颜色最亮,但也最浅。也就是矩形的左上角,呈白色。
当S=1(S=0) V=0时,颜色最深(最浅),但最暗,均体现为黑色
当S=1 V=1时,在矩形的右上角,就是纯色的红色,也就是我们常用的RGB(255, 0, 0)

与HSI的区别

HSV是(色相hue, 饱和度saturation, 明度value) ,而HSI是(色相hue, 饱和度saturation, 亮度lightness)

与HSV非常相似,仅用亮度(lightness)替代了明度(brightness)

二者区别在于,一种纯色的明度等于白色的明度,而纯色的亮度等于中度灰的亮度

HSV是一个颜色的子集,并不能表示所有颜色

与RGB的联系

  1. 亮度V就是RGB值中最大的那个值进行归一化。也就是说 V = max(R, G, B)/255.0f;
    可印证当V=0时,max(R, G, B)=0,也就是R=G=B=0,即为黑色。
  2. 深浅度S是RGB中最大值和最小值的差值与最大值的比值。设RGBMax=max(R,G,B) RGBMin=min(R,G,B) 那么S= (RGBMax-RGBMin)/(float)RGBMax
    可印证当S=0时,RGBMax-RGBMin == 0,即R ==G ==B,此时颜色呈不同程度的灰色(由白到黑,亮度由V而定,因为V=RGBMax*100/255,V越高,RGBMax ==R ==G ==B就越高,灰色越亮))。这也可以从上面给出的矩形图看出

RGB2HSV
在这里插入图片描述
HSV2RGB
在这里插入图片描述

为什么选用HSV

在图像处理中,通常情况下我们不会直接对RGB图像做处理,这主要是因为RGB与人类的视觉感知相差较远,而HSV是接近人视觉的

比如,某些由于光照不同造成的视觉感知不同的场景下,我们通常用Value这个通道进行计算,通过计算梯度,可以较好的提取物体边缘。

再比如某些场景下,前景饱和度较高,背景采用饱和度较低的颜色来衬托前景,这时Saturation这个通道的信息就非常有用了。

再比如,在某些室内场景下,风格较为单一,一般一个物体只有一种颜色,这时候Hue这个通道就显得尤为重要了。

总之,HSV色彩空间在图像处理领域应用非常广泛,一般通过采用合适的通道就能完成大多数图像预处理工作。

YUV色彩空间

YUV细分的话有Y’UV,YUV,YCbCr,YPbPr等类型,其中YCbCr主要用于数字信号。一般在做数字图像处理时,所讲的YUV大多是指YCbCr。YCbCr 有许多取样格式, 如4∶4∶4 , 4∶2∶2 , 4∶1∶1 和4∶2∶0。

分类

以最常用的 444 422 420 为例子

  • YUV 4:4:4采样,每一个Y对应一组UV分量。

  • YUV 4:2:2采样,每两个Y共用一组UV分量。

  • YUV 4:2:0采样,每四个Y共用一组UV分量。

存储

YUV的存储格式有两大类:packed、planar和SemiPlanar

  • 对于packed的YUV格式,每个像素点的Y,U,V是连续交错存储的。
  • 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
  • 对于SemiPlanar,则是先连续存储所有像素点的Y,再连续交错U和V。
    先说复杂一些的packed方式

packed

  • 对于444的packed 来说 内存排列是固定的Y1 U1 V1 Y2 U2 V2 对于

  • 对于422来说,情况稍微复杂点,每两个Y共用一组UV分量

    其他的VYUY422,YUYV422,YVYU422只不过是数据矩阵中Y,U,V顺序差别:

    VYUY422: V1 Y1 U1 Y2 V2 Y3 U2 Y4 …

    YUYV422(YUY2): Y1 U1 Y2 V1 Y3 U2 Y4 V2 …

    YVYU422: Y1 V1 Y2 U1 Y3 V2 Y4 U2 …
    在这里插入图片描述

  • 对于420来说,每四个Y共用一组UV分量
    在这里插入图片描述

planar 和 SemiPlanar

422 planar
在这里插入图片描述
422 SemiPlanar
在这里插入图片描述
420 planar
在这里插入图片描述
420 SemiPlanar
在这里插入图片描述

其中YUV420P和YUV420SP根据U、V的顺序,又可分出2种格式。
YUV420P:U前V后即YUV420P,也叫I420,
V前U后,叫YV12(YV表示Y后面跟着V,12表示12bit)。
YUV420SP:U前V后叫NV12,
V前U后叫NV21。
数据排列如下:
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP

常见枚举

OpenNI

Astra SDK(奥比中光深度相机开发包)

typedef enum

{

// Depth

ONI_PIXEL_FORMAT_DEPTH_1_MM = 100,

ONI_PIXEL_FORMAT_DEPTH_100_UM = 101,

ONI_PIXEL_FORMAT_SHIFT_9_2 = 102,

ONI_PIXEL_FORMAT_SHIFT_9_3 = 103,

// Color

ONI_PIXEL_FORMAT_RGB888 = 200,

ONI_PIXEL_FORMAT_YUV422 = 201,

ONI_PIXEL_FORMAT_GRAY8 = 202,

ONI_PIXEL_FORMAT_GRAY16 = 203,

ONI_PIXEL_FORMAT_JPEG = 204,

ONI_PIXEL_FORMAT_YUYV = 205,

} OniPixelFormat;

LINUX_VIDEODEV2


#define V4L2_PIX_FMT_YUYV    v4l2_fourcc('Y','U','Y','V') /* 16  YUV 4:2:2     */

#define V4L2_PIX_FMT_UYVY    v4l2_fourcc('U','Y','V','Y') /* 16  YUV 4:2:2     */

#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4','2','2','P') /* 16  YVU422 planar */

#define V4L2_PIX_FMT_NV12    v4l2_fourcc('N','V','1','2') /* 12  Y/CbCr 4:2:0  */

#define V4L2_PIX_FMT_NV21    v4l2_fourcc('N','V','2','1') /* 12  Y/CrCb 4:2:0  */

#define V4L2_PIX_FMT_YVU420  v4l2_fourcc('Y','V','1','2') /* 12  YVU 4:2:0     */

#define V4L2_PIX_FMT_YUV420  v4l2_fourcc('Y','U','1','2') /* 12  YUV 4:2:0     */

微软 YUV格式定义

GUID Format Sampling Packed or planar Bits per channel
MEDIASUBTYPE_AYUV AYUV 4:4:4 Packed 8
MEDIASUBTYPE_YUY2 YUY2 4:2:2 Packed 8
MEDIASUBTYPE_UYVY UYVY 4:2:2 Packed 8
MEDIASUBTYPE_IMC1 IMC1 4:2:0 Planar 8
MEDIASUBTYPE_IMC3 IMC2 4:2:0 Planar 8
MEDIASUBTYPE_IMC2 IMC3 4:2:0 Planar 8
MEDIASUBTYPE_IMC4 IMC4 4:2:0 Planar 8
MEDIASUBTYPE_YV12 YV12 4:2:0 Planar 8
MEDIASUBTYPE_NV12 NV12 4:2:0 Planar 8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章