常见的图片颜色编码
阅读量
0
阅读人次
0
常见的颜色编码有 RGB 和 YUV。
RGB
我们平时接触最多的颜色编码就是 RGB。上学的时候就学过三原色,所有的颜色可以通过三原色产生,这三原色就是 Red (红),Green(绿),Blue(蓝)。
常见的RGB格式有:
- RGB888:即R占8bit,G占8bit,B占8Bit。所以一个像素需要3个字节来表示。一般根基R、G、B的排列顺序,还有:BGR888等。
- RGB565:即R占5bit,G占6bit,B占5Bit。这种像素表示在 TFT 屏幕驱动中,尤为常见。
由于 RGB 比较通俗易懂,这里不在叙述,等以后碰到疑问再继续追加。
YUV
YUV 空间用于编码和存储比较好。在存储和编码之前,一般将 RGB 图像要转换为 YUV 图像,而 YUV 图像在显示之前通常有必要转换回 RGB。
YUV 本身有好多种变种,名称也各种各样,这里记录一下YUV 的各种格式:
分类标准
首先,我们可以将 YUV 格式按照数据大小分为三个格式:YUV420,YUV422,YUV444。由于人眼对 Y 的敏感度远超于对 U 和 V 的敏感,所以有时候可以多个 Y 分量共用一组 UV,这样既可以极大得节省空间,又可以不太损失质量。这三种格式就是按照人眼的特性制定的。
- YUV420,由4个 Y 分量共用一套 UV 分量
- YUV422,由2个 Y 分量共用一套 UV 分量
- YUV444,不共用,一个 Y 分量使用一套 UV 分量
按照多个 Y 分量共用一个 UV 的方式,我们可以把 YUV 分为 420,422,444 三种类型,而在这三种类型之下,我们又可以按照 YUV 的排列储存顺序,将其细分为好多种格式,这些格式数量繁多,又不好记忆,这为我们学习过程中造成了不少困难。下面我就为大家一一介绍。
首先,我们将可以按照 YUV 的排列方式,再次将 YUV 分成三个大类,Planar,Semi-Planar 和 Packed。
- Planar:YUV 三个分量分开存放
- Semi-Planar:Y 分量单独存放,UV 分量交错存放
- Packed:YUV 三个分量全部交错存放
按照这三种方式,我们就可以将 YUV 格式进行比较细致的分类了。
I420
I420 是 YUV 420 Planar 的一种,YUV 分量分别存放,先是 w * h 长度的 Y,后面跟 w * h * 0.25 长度的 U, 最后是 w * h * 0.25 长度的 V,总长度为 w * h * 1.5。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U
U U U
U U U
V V V
V V V
V V V
NV12
NV12 是 YUV 420 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放,UV 在排列的时候,从 U 开始。总长度为 w * h * 1.5。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V
U V U V U V
U V U V U V
NV21
NV21 是 YUV 420 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放,与 NV12 不同的是,UV 在排列的时候,从 V 开始。总长度为 w * h * 1.5。
NV21一般在摄像头图像处理比较常见,很多 Sensor 或者 VPSS(视频处理子系统)输出的图像格式都为 NV21。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U
V U V U V U
V U V U V U
I422
I422 是 YUV 422 Planar 的一种,YUV 分量分别存放,先是 w * h 长度的 Y,后面跟 w * h * 0.5 长度的 U, 最后是 w * h * 0.5 长度的 V,总长度为 w * h * 2。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U U U U
U U U U U U
U U U U U U
V V V V V V
V V V V V V
V V V V V V
YUVY
YUVY 属于 YUV 422 Interleaved 的一种。事实上,Interleaved 是属于 Packed 的,但是在 422 中,用 Interleaved 更加形象一些。在 Packed 内部,YUV 的排列顺序是 Y U V Y,两个 Y 共用一组 UV。
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
YUV 444 Packed
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
其它编码格式
其它的颜色编码方式还有:CYMK、HSV、HSB。这些目前在应用开发中用的不多,也不做记录了。
相关工具和库
yuvplayer
yuvplayer 是一个很小巧的 YUV 格式的图片查看工具,调试的时候,使用它很方便。
libyuv
libyuv 是Google开源的 yuv 图像处理库,实现对各种 yuv 数据之间的转换,包括数据转换,裁剪,缩放,旋转。
FFmpeg
使用 ffmpeg
命令将图片转换为特定编码格式裸数据文件:
ffmpeg -i test.jpg -s 1920*1080 -pix_fmt nv21 test.yuv
FFmpeg 所支持的像素格式可以通过 ffmpeg -pix_fmts
帮助指令得到。
ffmpeg 将图片格式也当作 Demuxer、Muxer 来看待。
帮助命令
ffmpeg.exe -muxers
、ffmpeg -demuxers
都能看到 image2 这个封装格式。