目录
有的人,错过了,一生再也找寻不到。
本文详细分析各种图像格式(raw、rgb、yuv)的分类、内存分布。一篇文章让你看懂。
一、通用属性
1. packed/unpacked
一个像素点占n个bit,如果n不是8的倍数,那么就有packed、unpacked的概念。试想某格式一个像素10bit(比如raw10),如果unpacked,那么实际一个像素要占2byte=16bit,其中前10bit才有图像数据,后6bit占位(一般是0)。如果是packed,那么就没有占位。
2. 压缩/非压缩
为方便大尺寸图像存储、传输,常用压缩的方法进行。
对于isp而言,常见压缩算法有flc(fixed length compression)、afbc(arm frame buffer compression),jpeg等。
下文所讲内存分布均指非压缩格式,因为压缩后的内存分布由算法决定。
二、raw
raw的含义是“未经处理加工”。
raw图像是ccd/cmos等sensor直接采集到的图像,是光信号转化为电信号时的电平高低的原始记录。
1. bayer格式
raw一般采用bayer格式(单个像素为r/g/b光强信息)进行排列,由于人眼对绿色更加敏感,因此增加对绿光的采样。主要有四种排序:
- rggb
- bggr
- grbg
- gbrg
举例一个像素是8*8的sensor,bggr格式的raw图像:
要么你可能会问,一个像素只有一种颜色r/g/b,那我们看到的图像比如第一个像素不一定是只有b。因为后面会插值计算出每个pixel的其他分量!以降低功耗。
2. 分类
- raw8:1 pixel 8 bits
- raw10unpacked:1 pixel 2 bytes(16bits,有6bit没用)
- raw10packed:1 pixel 10 bits
- raw12unpacked/raw12packed
- raw14unpacked/raw14packed
- raw16
- ......
raw格式很大,往往需要压缩处理存入ddr。
3. mipi raw
mipi raw要按照mipi raw的存储规则来存储。举例来说,对于mipi raw10,5个byte(40bits)就可以存4个像素的数据(4*10bits)。
三、rgb
每个像素由三原色r/g/b组成,注意和raw的区别,raw每个像素只有一个三原色。
分类
- rgb565:1 pixel 16 bits(r 5bits、g 6bits、b 5bits)
- rgb555:1 pixel 16 bits(有1bit不用)
- rgb24:1 pixel 24 bits(rgb各8bits)
- rgb32:1 pixel 32 bits(rgb各8bits,有8bits不用)
- argb32:1 pixel 32 bits(rgb各8bits,还有alpha透明度8bits)
四、yuv
yuv是用一个亮度分量y和两个色度分量u,v来描述一个颜色。只有y的话就是灰度图像。
1. yuv与rgb转换
yuv转rgb
r = y + 1.13983 * v
g = y - 0.39465 * u - 0.58060 * v
b = y + 2.03211 * u
rgb转yuv
y = 0.299 * r + 0.587 * g + 0.114 * b
u = -0.14713 * r - 0.28886 * g + 0.436 * b
v = 0.615 * r - 0.51499 * g - 0.10001 * b
2. 分类
由于人眼对y的敏感度远超对u、v的敏感度,所以有时可用多个y共用一组u、v,既节省了空间又保证了质量。
常用格式分类:
- yuv420,4个y共用一套uv,数据个数1.5*w*h
- yuv422,2个y共用一套uv,数据个数2*w*h
- yuv444,不共用,1个y一套uv,数据个数3*w*h
如果一个像素是8bit,那么存储占用对于yuv420就是1.5*w*h*8 bits=1.5*w*h bytes 。
yuv的内存分布按y、u、v三个分量的排列顺序,可分为
- planar,三个分量分开存放
- semi-planar,y分量单独存放,uv分量交错一起存放
- packed/interleaved,三个分量交错一起存放
注意:这里的packed和图像的packed是两个概念!这里的packed指的是所有像素分量交错;图像的packed是一个像素点n bits无空位排列。
i420(也叫yu12,属于yuv420 planar)
总数据个数w*h+0.25*w*h+0.25*w*h=1.5*w*h
yyyy
yyyy
uu
vv
当然,对于计算机内存来说,只是从某个addr开始一直存储,先存y再存u再存v
yv12(属于yuv420 planar)
总数据个数w*h+0.25*w*h+0.25*w*h=1.5*w*h
yyyy
yyyy
vv
uu
nv12(属于yuv420 semi-planar)
总数据个数w*h+0.5*w*h=1.5*w*h
yyyy
yyyy
uvuv
nv21(属于yuv420 semi-planar)
总数据个数w*h+0.5*w*h=1.5*w*h
yyyy
yyyy
vuvu
i422(属于yuv422 planar)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
yyyy
yyyy
uuuu
vvvv
yv16(属于yuv422 planar)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
yyyy
yyyy
vvvv
uuuu
nv16(属于yuv422 semi-planar)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
yyyy
yyyy
uvuv
uvuv
nv61(属于yuv422 semi-planar)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
yyyy
yyyy
vuvu
vuvu
yuvy(属于yuv422 interleaved)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
yuvy yuvy
yuvy yuvy
vyuy(属于yuv422 interleaved)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
vyuy vyuy
vyuy vyuy
uyvy(属于yuv422 interleaved)
总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h
uyvy uyvy
uyvy uyvy
i444(属于yuv444 planar)
总数据个数w*h*3
yyyy
yyyy
uuuu
uuuu
vvvv
vvvv
yv24(属于yuv444 planar)
总数据个数w*h*3
yyyy
yyyy
vvvv
vvvv
uuuu
uuuu
nv24(属于yuv444 semi-planar)
总数据个数w*h*3
yyyy
yyyy
uvuvuvuv
uvuvuvuv
nv42(属于yuv444 semi-planar)
总数据个数w*h*3
yyyy
yyyy
vuvuvuvu
vuvuvuvu
yuv 444 packed
总数据个数w*h*3
yuv yuv
yuv yuv
3. 内存计算
有了上面的基础,内存计算就超级简单。比如:
yuv420sp8,内存占用即为1.5*w*h bytes
yuv420sp10 unpacked,内存占用即为1.5*w*h*2 bytes,因为unpacked时10bit要占2bytes,有6bits的空位。
yuv420sp10 packed,内存占用即为1.5*w*h*10/8 bytes。没用空位。
1920*1080的nv12 8bit图像,占内存为1.5*1920*1080 = 3,110,400 bytes ≈ 3mb,这就是3mb图像的由来,内存占用还是挺大的。
五、压缩格式
jpeg,png,gif,bmp,tiff,tga等等。
不断更新,还在路上......
发表评论