图像格式基础整理
图像格式基础整理
工作与图像打交道的场景比较多,写一篇博客梳理一下
主要是关于 RAW、YUV、RGB格式图像的介绍和整理
一些基础概念
ColorDepth(色深)与 BitDepth(位深)
与同事口头交流时,经常提到“位深”这个概念。这表示一个像素所用的位数,还是一个颜色分量所用的位数?如果是后者,那YUV420这样的格式(不像RGB那样有明确的三个颜色分量)又怎么应用这个概念?
经过工作交流、查阅网上资料、以及翻阅项目代码,我发现大家对“位深”这个词具体概念没有明确的指代。它是指像素位数还是颜色通道位数,可能需要我们自己通过上下文推导判断。这对当时还是初学者的我来说产生了不小的困扰,尤其是在计算理论图像大小的时候。所以先在这里明确一下这个概念,并且本文之后的内容都以这一节的概念阐述为准,避免不必要的歧义。
查阅wikipedia的定义可知:
颜色深度(color depth),也称为位深度(bit depth),是用于指示单个像素颜色的位数,或用于单个像素每个颜色分量的位数。 1. 该概念可以定义为每像素比特数(bpp, bits per pixel)2. 也可以定义为每个分量的比特、每个通道的比特、每种颜色的比特(bpc, bits per component, bits per channel, bits per color),以及每个像素分量的比特,每个颜色通道的比特或每个样本的比特。现代标准里倾向于使用bpc这个定义,但历史上较低深度的系统更频繁地使用bbp这个概念。
也就是说,位深、色深在不明确使用哪种定义的情况下,确实带有两种截然不同的含义。本文为了方便计算图像的理论大小,使用 bpp(bits per pixel) 这个概念。应用在YUV420这种图像时,bpp 则延申成了一种类似于平均值概念(见下文)
image stride(图像跨度) 和 image width(图像宽度)
stride(也叫做pitch),一般大于width。如下图所stride大于width,才有了右边的padding内容。为什么有stride的概念?
这与内存对齐的原因相同,都是为了适配和加快硬件的存取速度。比如一些显卡只能以32、64或128bit的大小存取内存,那么width的大小就要向上对齐32、64或者128,得到stride。

图像大小的计算
如果知道了bpp(每个像素占用的位数)、图像跨度(或者宽度)、图像高度, 图像大小的计算就比较直观了:
imagesize = image stride * image height * bpp
如果是很常见的图像size比如1920 *1080或者1280 * 720,他们的width 等于stride,那么图像大小计算就是:
imagesize = image width * image height * bpp
RAW
简介
Normal Bayer Raw
Raw图片是Sensor直接获取的图像数据,没有经过任何图像处理或者色彩编码。
RAW的具体像素排布方式与sensor的感光方式有关:如下图所示,感光区上盖了一层滤光膜,使得每个像素上方的滤光膜透过红、绿、蓝三种颜色中的一种,因此raw格式的每个像素仅表示一种颜色。

可以通过差值的方式,计算出每个像素的其他两种颜色的值,这样RGB图像的三通道颜色均已得出,这个过程叫做 DeBayering \DeMosaic

使用类似于上图滤光膜布局产生的raw图像也叫做NormalBayerRaw (不少资料也会写成normal raw、bayerraw,应该都是同一种意思)。“normal”是为了与下述的 Quad Bayer Raw作区分。
Quad Bayer Raw
随着科技的发展,sensor的像素越来越多,但是受到硬件的面积限制,像素越多也意味着像素越小,这导致单个像素的感光度下降,暗光条件下的成像效果可能并不理想。为了缓解这个问题,可选择使用QuadBayerraw。如下图所示,QuadBayerRaw的相邻4个像素都记录同一种颜色。在暗光环境下,可将4个像素叠加成1个像素,这样的做法叫做 “binning”。 这样的做法可以提高整体亮度,但显然牺牲了分辨率。

Packd/Unpacked Raw
Raw格式每个像素的存储位数通常为8、10、12、14、16等,但为了方便硬件的取值和寻址,每个像素的存储位数通常向上取整为8的倍数。比如Raw10Unpack格式,10表示每个像素以10bit表示,但实际使用16bit存储每个像素,其余16bit作为padding不存储实际数据。相对的,如果每个像素之间不存在padding,这样的格式就是PackedRaw。
Mipi Raw
MipiRaw是为了高效传输数据而设计的格式,与UnpackRaw不同,MIPIRaw尽最大可能地消除padding,从而在提升带宽传输效率。
常见的RAW命名及其位深
- RAW8: 每个像素用8个bit表示,bpp = 8
- RAW10:每个像素用10个bit表示,bpp = 10
- RAW10Unpacked,每个像素用 10 +6个bit存储,后面6个bit用作padding
- RAW16:每个像素16个像素表示
- ......
YUV
简介
YVU格式的优势
- 彩色电视信号兼容黑白电视:彩色电视将YUV图像的亮度信息与色度信息叠加,还原成RGB格式;黑白电视忽略YUV图像的色度信息,将其显示为灰度图像
- 人眼对色调变化的敏感度低于对亮度变化的敏感度。因此,图像可以包含比亮度信息更少的 色度信息,而不会牺牲图像的感知质量。因此,图像的存储、传输、处理效率得到提升
YUV采样
如上所述,相比于色度信息,人眼对亮度信息更加敏感,因此为了节省带宽又不知显著降低人的对图像的感官质量,可以降低UV分量相对于Y分量的采样频率。使用“A:B:C” 这类的记号描述U、Y分量相对于Y的采样频率,A表示Y的采样频率:
- 4:4:4 -- 色度分量没有进行下采样
- 4:2:2 -- 水平方向进行2:1的下采样,垂直方向不做下采样,2个Y分量共用一个U分量和1个V分量
- 4:2:0 -- 水平和垂直方向都进行2:1采样。4个Y分量共用1个U分量和1个V分量
YUV的BPP
由于YUV格式特殊的下采样做法,个人认为YUV格式的bpp是一个平均值的概念,比如4:2:0的方式“8 bit YUV格式”的位深为12bit:一个像素平均由1个Y分量 + 1/4个U分量和1/4个V分量组成, bpp = 8 + (8 + 8)/ 4
YUV 存储格式
YUV格式名词的后缀表明了各种YUV格式的存储方式
- “packed”: YUV三个分量相当于以单一数组的形式存储,相互交织
- 注意这里的“packed”可能更适合叫做“interleaved”,与上文所述的“packed mode”不是一个概念。
- “planar”: YUV三个分量分成三个部分单独存储
- “semi-planar”: Y分量单独存放,U V分量相互交织存放于另一个平面(plane)
- UV分量的存储顺序也有区别,UVUV... 或者 VUVU...
三种存储方式的示意图如下:

常见命名及其位深
下面最后两种命名是经常会听到的口头表达,为了不混淆,单独列了出来
- YUV420SP8NV12
- “420”表示采样方式
- “SP”表示存储形式为semi-plannar
- "8"表示bps = 8bit
- bpp = 8 + (8 + 8)/ 4 = 12
- “NV12”表示U分量在前,V分量在后,即按照 UVUV... 的形式存储
- YUV420SP8NV21
- 除了按照 VUVU...形式存储外,其他与YUV420SP8NV12相同
- bpp = 12
- YUV420SP10NV12Unpacked
- “10”表示bps = 10
- “unpacked”是指每个分量有6bit的padding,以方便硬件取址
- bpp = 16 + (16 + 16)/ 4 = 24
- YCbCr_420_888
- Cb等价于U,Cr等价于V
- 等价于YUV420SP8NV12
- bpp = 12
- YCbCr420P010
- "P010",涉及到FOURCC Codes概念,最早由微软定义。其中”P“表示存储形式为 semi plannar, 第一个0表示采样方式为4:2:0, 后两位的“10“表示bps = 10, 每个颜色分量的存储之间存在padding。具体可参考这篇文档
- 与YUV420SP10NV12Unpacked等价
- bpp = 24
- “8 bit YUV”
- 8bit表示bps = 8
- 采样方式默认 4:2:0
- 所以这样的说法等价于YUV420SP8NV12或者YUV420SP8NV21
- bpp = 12 bit
- “10 bit YUV”
- 8bit表示bps = 10
- 采样方式默认 4:2:0
- 且通常默认为Unpacked模式,所以这样的说法等价于YUV420SP10NV12Unpacked格式
- bpp = 24
YUV格式总结
YUV格式的名字还有很多种,以上只是例举了其中一部分,很多名称其实是等价的。
如果只是为了计算图像大小,只需要知道bpp以及图像的宽高即可。
其中bpp由三个因素决定:
- 采样方式,通常使用4:2:0的采样方式
- bps,通常为8或者10
- 像素分量存储之间是否有padding,通常是有的,比如bps=10时,实际上每个分量的占用bit为16
RGB
简介
如RAW一节所示,RGB格式由R、G、B三个分通道组合表示一个像素。
一种由RGB格式衍生的格式:
- RGBA,其中"A"表示该格式在RGB格式的的基础上增加了Alpha通道,表示图像的不透明度
常见命名及其位深
- RGB16:每个像素用16bit表示,bpp = 16,包括
- RGB565,G分量占用6bit,R和B分量分别占用5bit
- RGB555,三个分量分别占用5bit,最高位不用
- RGB24:每个像素用24bit表示,bpp = 24,每个分量占用8bit
- RGB888:相当于RGB24,bpp = 24
- RGB8:相当于RGB888,bpp = 24
- RGBA8888:bpp = 32,4个分量分别占用8bit
其他特殊格式(TUDO)
压缩
tile
参考
图像跨度-MicrosoftMediaTypeFoundation
An Introduction to Compression - Imran Nazar

浙公网安备 33010602011771号