跳到主要内容

常见的图片颜色编码

阅读量

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 -muxersffmpeg -demuxers 都能看到 image2 这个封装格式。

OpenCV