当前位置:   article > 正文

RGB&YUV图像视频格式_opencv rgb转yuv

opencv rgb转yuv

一、参考资料

对于YUV420sp格式图像的copy and paste

RGB 与YUV颜色模型及存储格式

二、相关介绍

2.1 问题引入

OpenCV中如果是单通道或者三通道一样的大的图像,直接使用 copyTo()函数即可。对于yuv420的图像则不是适用。

2.2 色彩空间

定义色彩空间时,通常使用 CIELAB 或者 CIEXYZ 色彩空间作为参考标准。这两个色彩空间在设计时便要求包含普通人眼可见的所有颜色。

由于“色彩空间”有着固定的色彩模型映射函数组合,非正式场合下,色彩空间也被用来指代色彩模型,这样的用法严格意义上是错误的

三、RGB色彩空间

RGB色彩空间中的一种颜色是由红、绿、蓝光构成。由R、G、B三个分量组成。RGB颜色分量是跟设备相关的,不论是采集还是显示

摄像头采集中,每个像素的颜色分量不仅取决于场景的颜色和光照,还取决于测量红、绿蓝分量的滤波器的光谱效应。

屏幕显示中,实际显示出来的颜色取决于显示器中红、绿、蓝光源的光谱。(所以,根据所使用的波长不同,可以有许多不同的RGB色彩空间。)

标准的RGB是24bit的,即每个分量8bit。考虑到带宽限制,也有16bit的RGB,R和B用5bit表示,G用6bit表示(因为人眼对绿色更敏感)。从16bit转到24bitRGB,不是添加0,而是添加2位(G)或3位(R、B)最高有效位。

常见的RGB格式有RGB888,RGB565,RGB555,RGB24,RGB32(每个分量8比特,剩余8位空着),ARGB32(每个分量8比特,Alpha通道值8bit)等。

  • RGB的存储格式通常为BGRBGRBGR的顺序。
  • Bitmap就是在RGB像素数据上加上数据头形成的文件格式。

sRGB

为了克服RGB 的设备依赖性,人们又定义了一种不依赖上设备的sRGB,添加了光强与颜色分量数值之间的分线性γ映射。从RGB转换到sRGB,就是在色彩向量上乘以一个设备相关的红、绿、蓝光谱特性的3x3矩阵。这个变换由标定决定。

四、YUV

YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL,Phase Alternation Line)。(YIQ用于NTSC彩色电视制式,YUV用于PAL制和SECAM彩色电视制式,而YCrCb用于计算机用的显示器。)

Y代表亮度(Luma,Luminance),也即灰度值;UV代表色度(Chroma,Chrominance),作用是描述影像色彩饱和度,用于指定像素的颜色。YUV完全由RGB推导而来,亮度分量Y是RGB分量的组合,颜色分量由差分B-Y,R-Y提供。

严格来说,YUV是一种模拟表示,相应的数字表示为YCbCr。

4.1 YUV与YCbCr

一般人们所讲的YUV大多是指YCbCr。对于YCbCr,其中Y与YUV 中的Y含义一致,Cb , Cr 同样都指色彩,,只是在表示方法上有所不同,Cb、Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写)Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。

4.2 RGB与YUV互相转换

在这里插入图片描述

4.3 YCrCb与YCbCr

YCrCb颜色空间是由YUV颜色空间派生的一种颜色空间。YCbCr是在世界数字组织视频标准研制过程中作为ITU-R BT.601建议的一部分,其实是YUV经过缩放和偏移的翻版。YCrCb中的Y与YUV中的Y含义一致,Cb、Cr同样都指色彩,只是在表示方法上不同。在YUV家族中,YCbCr是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。

4.4 YUV特点

  • YUV一种颜色编码方法,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容性问题
  • YUV不像RGB那样要求三个独立的视频信号同时传 输,所以用YUV方式传送占用极少的频宽

4.5 YUV(YCbCr)优点

  • 减少通道之间的相关性。可以方便的对色彩进行阈值处理
  • 简化了彩色图像的增强,例如对比度增强只需要在图像的Y分量上执行;
  • 可以对亮度和色彩进行不同策略的噪声去除等。

4.6 YUV缺点

  • 转化是RGB坐标系的旋转,需要浮点或者定点乘法来执行;
  • 缩放系数的选择必须保证每个RGB组合具有一个有效的YCbCr表示,可是逆变换是非真的,有些YCbCr组合落在RGB的有效范围之外,如果需要计算逆变换,那么意味着YCbCr需要更多位表示。

4.7 YUV采样格式

YUV444

无压缩,YUV三个信道的采样率相同,三个分量信息完整(通常为8bit)。每个Y独享一对UV分量。每个像素3字节。

原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2]

码流:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

YUV422

2:1的水平取样,垂直完全采样。每两个Y共用一组UV分量。每个像素2字节。

原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2]

码流:Y0 U0 Y1 V1 Y2 U2 Y3 V3

得到的像素:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

YUV411

4:1的水平取样,垂直完全采样。每四个Y共用一组UV分量。每个像素

8+(8/4)+(8/4)=12bits,1.5个字节。

原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2]

码流:Y0 U0 Y1 Y2 V2 Y3

得到的像素:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

YUV420

2:1的水平取样,垂直2:1采样。每四个Y共用一组UV分量。每个像素12bit,采样方式不一样了。

原始像素:

[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]

码流:

Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8

得到的像素:

[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]

下图中,以黑点表示采样该像素点的Y分量,以空心圆圈表示采样该像素点的UV分量
在这里插入图片描述

YUV420比较常用U = Y / 4 V = Y / 4,所以YUV420 数据在内存中的长度是 width * height * 3 / 2

4.8 YUV存储格式

YUV存储格式与YUV采样的方式密切相关,主流的采样方式有三 种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

打包格式(packed formats):每个像素点的Y,U,V是连续交叉存储的。将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel),和RGB的存放方式类似,在这种格式下每个像素点的YUV数据混合放在一个矩阵中。

平面格式(planar formats):先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。其中Y为width*height,而U、V合占Y的一半。

YUV420中,一些特殊的存储格式:

YUV420p,planer模式,Y、U、V分别位于不同平面。按U、V存储顺序不同,可以分为

YV12:YYYYVVVUUU

YU12:YYYYUUUVVV,又叫****I420

YUV420p的YU12存储格式如下:
在这里插入图片描述

YUV420sp,bi-planer或者two-planer双平面,Y在一个平面,UV在同一个平面交叉存储。

NV12:YYYYUVUVUV

NV21**:**YYYYVUVUVU,安卓相机标准图片格式

YUV420sp的NV12存储格式如下:

在这里插入图片描述

4.9 RGB与YUV互相转换(OpenCV)

RGB、YUV420p、YUV420sp之间的互相转换(C++)

使用cvtColor函数,在imgproc模块的types_c.h中查看转换代码:

RGB与YUV444互转

CV_BGR2YCrCb   =36,
CV_RGB2YCrCb   =37,
CV_YCrCb2BGR   =38,
CV_YCrCb2RGB   =39,
  • 1
  • 2
  • 3
  • 4

RGB转YUV420p的YU12

CV_RGB2YUV_I420 = 127,
CV_BGR2YUV_I420 = 128,
CV_RGB2YUV_IYUV = CV_RGB2YUV_I420,
CV_BGR2YUV_IYUV = CV_BGR2YUV_I420,
  • 1
  • 2
  • 3
  • 4

RGB转YUV420p的YV12

CV_RGB2YUV_YV12  = 131,
CV_BGR2YUV_YV12  = 132,
  • 1
  • 2

YUV420p转RGB

CV_YUV2RGB_YV12 = 98,
CV_YUV2BGR_YV12 = 99,
CV_YUV2RGB_IYUV = 100,
CV_YUV2BGR_IYUV = 101,
CV_YUV2RGB_I420 = CV_YUV2RGB_IYUV,
CV_YUV2BGR_I420 = CV_YUV2BGR_IYUV,
CV_YUV420p2RGB = CV_YUV2RGB_YV12,
CV_YUV420p2BGR = CV_YUV2BGR_YV12,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

YUV420sp转RGB

CV_YUV2RGB_NV12 = 90,
CV_YUV2BGR_NV12 = 91,
CV_YUV2RGB_NV21 = 92,
CV_YUV2BGR_NV21 = 93,
CV_YUV420sp2RGB = CV_YUV2RGB_NV21,
CV_YUV420sp2BGR = CV_YUV2BGR_NV21,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

RGB转YUV420sp

OpenCV没有RGB直接转YUV420sp的函数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/670280
推荐阅读
相关标签
  

闽ICP备14008679号