赞
踩
OpenCV中如果是单通道或者三通道一样的大的图像,直接使用 copyTo()
函数即可。对于yuv420的图像则不是适用。
定义色彩空间时,通常使用 CIELAB 或者 CIEXYZ 色彩空间作为参考标准。这两个色彩空间在设计时便要求包含普通人眼可见的所有颜色。
由于“色彩空间”有着固定的色彩模型和映射函数组合,非正式场合下,色彩空间也被用来指代色彩模型,这样的用法严格意义上是错误的。
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 的设备依赖性,人们又定义了一种不依赖上设备的sRGB,添加了光强与颜色分量数值之间的分线性γ映射。从RGB转换到sRGB,就是在色彩向量上乘以一个设备相关的红、绿、蓝光谱特性的3x3矩阵。这个变换由标定决定。
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。
一般人们所讲的YUV大多是指YCbCr。对于YCbCr,其中Y与YUV 中的Y含义一致,Cb , Cr 同样都指色彩,,只是在表示方法上有所不同,Cb、Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写)Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。
YCrCb颜色空间是由YUV颜色空间派生的一种颜色空间。YCbCr是在世界数字组织视频标准研制过程中作为ITU-R BT.601建议的一部分,其实是YUV经过缩放和偏移的翻版。YCrCb中的Y与YUV中的Y含义一致,Cb、Cr同样都指色彩,只是在表示方法上不同。在YUV家族中,YCbCr是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。
无压缩,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
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]
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]
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
。
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存储格式如下:
RGB、YUV420p、YUV420sp之间的互相转换(C++)
使用cvtColor函数,在imgproc模块的types_c.h中查看转换代码:
CV_BGR2YCrCb =36,
CV_RGB2YCrCb =37,
CV_YCrCb2BGR =38,
CV_YCrCb2RGB =39,
CV_RGB2YUV_I420 = 127,
CV_BGR2YUV_I420 = 128,
CV_RGB2YUV_IYUV = CV_RGB2YUV_I420,
CV_BGR2YUV_IYUV = CV_BGR2YUV_I420,
CV_RGB2YUV_YV12 = 131,
CV_BGR2YUV_YV12 = 132,
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,
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,
OpenCV没有RGB直接转YUV420sp的函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。