ps5 yuv422和rgb哪个好

rgb好。

yuv422和rgb(YUV422和RGB的区别)yuv422和rgb(YUV422和RGB的区别)


yuv422和rgb(YUV422和RGB的区别)


yuv422和rgb(YUV422和RGB的区别)


也就是相同屏幕下接HDMI2.1还是2.0有画面表现的异。

ps5主界面还没ps4pro通透,只有HDMI2.1的显示设备才能支持HDR+444RGB,同9000f因为没有hdmi2.1.所以无解了,想要的体验,肯定是要换电视了不过真正距多少。

如何将YUV422转RGB,YUV排列顺序U0Y0V0Y1U2Y2V2Y3.....

在系统中大多采用YUV的颜色空间,原因不说了,网上搜YUV转RGB各种介绍。

在TI的视频英语系列中(这里只测试了DVR、IPNC),

采用如下公式:

yCbCr<-->rgb

Y’ = 0.257R' + 0.504G' + 0.098B' + 16

Cb' = -0.148R' - 0.2G' + 0.439B' + 128

Cr' = 0.439R' - 0.368G' - 0.071B' + 128

R' = 1.164(Y’-16) + 1.596(Cr'-128)

G' = 1.164(Y’-16) - 0.813(Cr'-128) - 0.392(Cb'-128)

B' = 1.164(Y’-16) + 2.017(Cb'-128)

视频帧占用内存计算

如果想知道原理,请参看 Android Camera 采样和存储常见数据格式

以下计算都是基于分辨率为width hight

RGB采样格式

RGB_888 24位 内存暂用大小为width hight 3 字节

RGB_8888 32 位 内存暂用大小为width hight 4 字节

RGB_888 格式中 一个像素点对应R(占用1个字节),G(占用1个字节),B (占用1个字节),所以一个像素对应3个字节,RGB_8888多了一个透明度,一个像素多用一个字节

YUV422 格式

内存大小计算 1024 800 3/2 字节

在YUV420中,一个像素点对应一个Y,2个Y对应一个U和V。 width hight =Y(总和) U = Y / 2 V = Y / 2所以YUV420 数据在内存中的长度是 width hight (Y+Y/2+Y/2)=width hight 2

YUV420格式

内存大小计算 1024 800 3/2 字节

在YUV420中,一个像素点对应一个Y,4个Y对应一个U和V。 width hight =Y(总和) U = Y / 4 V = Y / 4所以YUV420 数据在内存中的长度是 width hight (Y+Y/4+Y/4)=width hight3/2

RGB与YUV

每个像素用1个bit表示,可表示的颜色范围为双色,即最传统的黑和白。1个bit只能表示0,1两种值。需要调色板,不过调色板只包含两种颜色。

每个像素用4个bit表示,4个bit所能够表示的索引范围是0-15,共16个。也就是可以表示16种颜色。即调色板中包含16中颜色。

每个像素用8个bit表示。8个bit所能够表示的索引范围是0-255,共256个。也就是可以表示256中颜色。即调色板中包含256中颜色。

RGB像素格式中的bit存储的是每一个像素点的R,G,B值

一个像素用16个bit = 2个byte表示 ,R=5 G=6 B=5

为什么绿色为6位?

一个像素用16个bit = 2个byte,但是位不用,R=5 G=5 B=5

RGB24图像每个像素用8个bit,共24个位表示,共3个字节,注意:在内存中RGB各分量的排列顺序为:BGR

RGB32图像每个像素用32个bit表示,占4个byte,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,8个字节保留。注意:在内存中RGB各分量的排列顺序为:BGR

RGB32图像每个像素用32个bit表示,占4个字节,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,8个为透明像素。注意:在内存中RGB各分量的排列顺序为:BGRA

注意:ja默认使用大端字节序,c/c++默认使用小端字节序,android平台下Bitmap.config.ARGB_8888的Bitmap默认是大端字节序,当需要把这个内存数据给小端语言使用的时候,就需要把大端字节序转换为小端字节序。例如:ja层的ARGB_565传递给jni层使用时,需要把ja层的ARGB_565的内存数据转换为BGRA565。

详细验证请看: Android Bitmap像素排列与JNI作

YUV有很多变种,我们常说的YUV指的是YCbCr,YUV三个字母中,其中”Y”表示明亮度(Lumina nce或Luma),也就是灰阶值;而”U”和”V”表示的则是色度(Chrominance或Chroma)作用是描述影像色彩及饱和度,用于指定像素的颜色。Cb指蓝度分量,而Cr指红度分量,是标准 YUV 的一个翻版(还有YPbPr等),此文中,我们就用 YUV 指代 YCbCr 了。

首先,YUV按照数据大小分为三个格式,YUV420,YUV422,YUV444。由于人眼对Y的敏感度远超于对U和V的敏感,所以可以多个Y分量共用一组UV,这样既可以极大的节省空间,又可以不太损失质量。

按照多个 Y 分量共用一个 UV 的方式,我们可以把 YUV 分为 420,422,444 三种类型,而在这三种类型之下,我们又可以按照 YUV 的排列储存顺序,将其细分为好多种格式,这些格式数量繁多,又不好记忆,这为我们学习过程中造成了不少困难。下面我就为大家一一介绍。

首先,我们将可以按照 YUV 的排列方式,再次将 YUV 分成三个大类,Planar,Semi-Planar 和 Packed。

Planar YUV 三个分量分开存放

Semi-Planar Y 分量单独存放,UV 分量交错存放

Packed YUV 三个分量全部交错存放

按照这三种方式,我们就可以将 YUV 格式进行比较细致的分类了。

YUV的所有格式列表

一张从上到下分别为原图、Y、U 和 V:

YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。

如下图所示:

其中,Y 分量用叉表示,UV 分量用圆圈表示。

举个例子 :

如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

可以看到这种采样方式的图像和 RGB 颜色模型的图像大小是一样,并没有达到节省带宽的目的,当将 RGB 图像转换为 YUV 图像时,也是先转换为 YUV 4:4:4 采样的图像。

YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。如果水平方向有 10 个像素点,那么采样了 10 个 Y 分量,而只采样了 5 个 UV 分量。

如下图所示:

举个例子 :

如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3] 那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3

其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。

映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3 其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。

映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

采样的码流映射为像素点,还是要满足每个像素点有 Y、U、V 三个分量。但是可以看到,和第二像素点公用了 U0、V1 分量,第三和第四个像素点公用了 U2、V3 分量,这样就节省了图像空间。

一张 1280 720 大小的,在 YUV 4:2:2 采样时的大小为:

可以看到 YUV 4:2:2 采样的图像比 RGB 模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。

YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。

如下图所示:

设行扫描了 U 分量,第二行扫描了 V 分量,那么需要扫描两行才能够组成完整的 UV 分量。

举个例子 :

设图像像素为:[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其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。

映射出的像素点为:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

设图像像素为:[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其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。

映射出的像素点为:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

从映射出的像素点中可以看到,四个 Y 分量是共用了一套 UV 分量,而且是按照 22 的小方格的形式分布的,相比 YUV 4:2:2 采样中两个 Y 分量共用一套 UV 分量,这样更能够节省空间。

一张 1280 720 大小的,在 YUV 4:2:0 采样时的大小为:

可以看到 YUV 4:2:0 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。

YUV 的存储格式,有两种:

YUYV 格式是采用打包格式进行存储的,指每个像素点都采用 Y 分量,但是每隔一个像素采样它的 UV 分量,排列顺序如下:

UYVY 格式也是采用打包格式进行存储,它的顺序和 YUYV 相反,先采用 U 分量再采样 Y 分量,排列顺序如下:

YUV 422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。

基于 YUV 4:2:0 采样的格式主要有 YUV 420P 和 YUV 420SP 两种类型,每个类型又对应其他具体格式。

I420 的单帧结构示意图如下(Planar 方式)

这幅图的上面一幅可以看出 Y1、Y2、Y7、Y8 共用 U1 和 V1。后面的线性数组为其存储顺序,可以看出 Y、U 和 V 都是顺序存储的,往外写的时候,先按顺序将 Y 分量写出,然后再根据 U、V 分别将它们依次写出即可。

NV12的单帧结构示意图如下(Planar 方式)

可以看出与 YV12 不同的时,它的 Y 虽然也是顺序存储,但 U、V 却是交错存储的,这种方式存储在往外写出时则先直接顺序写出 Y,然后对 UV 分别依次写出。

PS:Android的Camera Preview默认图像格式为NV21。

把RGB和YUV的范围都缩放到[0,255]

YUV转RGB

RGB转YUV

参考资料:

RGB数据格式

一文读懂 YUV 的采样与格式

视音频数据处理入门:RGB、YUV像素数据处理

Android Bitmap像素排列与JNI作

YUV420_SVG

详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)

YUV ( Y'CbCr )是一种像素格式,常见于视频编码与静态图像。与 RGB 格式(红-绿-蓝)相反,YUV 分别由一个称为 Y (相当于灰度)的“亮度”分量(Luminance or Luma)和两个称为 U (蓝色投影 Cb )和 V (红色投影 Cr )的“色度”分量(Chrominance or Chroma)表示,由此得名。

Y 分量而没有 UV 分量信息,一样可以显示完整的黑白(灰度)图像,解决了模拟信号电视黑白与彩色的兼容问题。

色度通道(UV)的采样率可以低于亮度通道(Y),而不会显着降低感知质量。一种称为 “A:B:C” 的表示法用于描述相对于 Y 采样, U 和 V 的频率:

下图显示了如何针对每个下采样率采样色度。亮度样本用十字表示,色度样本用圆圈表示。

YUV 在存储上通常分为平面格式( Planar ),半平面格式( Semi-Planar )以及打包格式( Packed )。

平面格式有时也称为三面格式( Triplanar ),即 Y, U, V 三个分量各自使用单独的数组保存,这种三平面分离的格式比较方便视频编码。

YU12 即 I420 ,也叫 IYUV ,属于 YUV420P 格式。三个平面,分别存储 Y U V 分量。每四个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 和 height 都是 Y 平面的一半,因此一个像素 12 bits,内存排列如下图所示:

从图中可看出,U、V 平面的每行字节数(strides)、高(height)都是 Y 平面的一半。

I420 是音视频开发中常用的一种格式。

YV12 与 I420 几乎一样,仅改变了 U, V 平面的顺序。内存排列如下图所示:

J420 与 I420 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)。色度(UV)分量与 I420 中的完全相同。

IMC1 与 I420 类似,U, V 平面的宽(width)、高(height)是 Y 平面的一半,但是每行字节数(strides)与 Y 平面一致,因此 U, V 平面在内存上会有留空(padding),因此一个像素 16 bits,如图所示:

IMC3 与 IMC1 几乎一样,仅改变了 U, V 平面的顺序。内存排列如下图所示:

I422 属于 YUV422P 格式。三个平面,分别存储 Y U V 分量。每两个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 是 Y 平面的一半,但 height 与 Y 平面一致,因此一个像素 16 bits,内存排列如下图所示:

从图中可看出,U、V 平面的每行字节数(strides)是 Y 平面的一半,高(height)与 Y 平面一致。

J422 与 I422 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)。色度(UV)分量与 I420 中的完全相同。

半平面格式具有两个平面而不是三个平面,一个平面存储亮度(Y)分量,另一个平面存储两个色度(UV)分量。有时也将它们称为双平面格式( BiPlanar )。

NV12 属于 YUV420SP 格式。两个平面,分别存储 Y 分量 和 UV 分量。其中 UV 分量共用一个平面并且以 U, V, U, V 的顺序交错排列。每四个 Y 分量共享一组 UV 分量。

UV 平面的 strides, width 与 Y 平面一样长,但 height 仅为 Y 平面的一半。因此一个像素 12 bits,内存排列如下图所示:

从图中可看出,UV 平面的每行字节数(strides)与 Y 平面一致,高(height)是 Y 平面的一半。

NV12 是 iOS 相机( AVCaptureOutput )可直接输出的两种视频帧格式之一,另外一种是 BGRA32 ( kCVPixelFormatType_32BGRA )。

在 iOS 上, NV12 还分为 Full Range (0-255, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ) 和 Video Range (16-240, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange ),区别仅为亮度(Y)分量的取值范围,一般而言,Full Range 适用于静态图像(拍照),Video Range 适用于视频采集(摄像)。

NV21 属于 YUV420SP ,与 NV12 几乎一致,区别是 UV 平面中 U 与 V 的排列顺序颠倒,以 V, U, V, U 的顺序交错排列,内存排列如图所示:

NV21 是 Android 相机( Camera )默认的输出格式。

打包格式通常只有一个平面,所有亮度(Y)和色度(UV)数据都交织在一起。有点类似于 RGB 格式,只是使用了不同的色彩空间。

打包格式在网络摄像头中较为常见。硬件设备使用多平面格式效率较低,因为每个像素需要多次内存访问。而打包格式由于仅一个平面,访问内存的开销较小。

AYUV 是 Packed 打包格式,其中每个像素编码为四个连续字节,每个像素在内存中按照 V, U, Y, A 的顺序排列(A 指 alpha 通道),如下图所示:

YUYV 通常也称作 V422 、 YUY2 、 YUNV

YUY2 是 Packed 打包格式,其中两个像素共用一组 UV 分量,内存中按照 Y U Y V 的顺序排列,如下图所示:

UYVY 通常也称作 Y422 、 UYNV

UYVY 与 YUYV 类似,只是亮度(Y)分量与色度(UV)分量排列顺序颠倒,如下图所示:

RGB和YUV色彩模式

常用的色彩模式型有RGB和YUV两大类,RGB相对来说比较简单也容易理解,R表示红色Red,G表示绿色Green,B表示蓝色Blue,三个颜色通道叠加后可以组成各种各样的颜色;YUV来源于RGB,Y表示亮度,UV表示色度,也就是像素的颜色,YUV细分的话有Y'UV,YUV,YCbCr,YPbPr等格式,目前在计算机上使用的主要是YCbCr,因此说起YUV时主要指的是YCbCr(本文后续均称YUV),Cb表示蓝色浓度偏移量,Cr表示红色浓度偏移量。

因此RGB比较好理解,因此我们来简单介绍几个RGB格式

YUV模式是利用人眼对亮度敏感而对色度相对不敏感的特点,通过缩减色度采样以减少数据量,并且图像质量不会明显下降的色彩模式,其在采样时会保留每个像素的Y分量,但会适当丢弃UV分量,数据量通常会比RGB要小,因此常用于视频传输。YUV按照采样方式通常分为YUV444、YUV422、YUV420、YUV411,按照存储方式可分为Planar、Packed、SemiPlanar,而Y、U、V每个通道变量通常可以为8位、10位、16位,不同的组合方式也使YUV出现了各种各样的类型。

采样模式

存储方式

PS:微软文档中只看到了Planar和Packed,Android中有见到SemiPlanar,出处暂时不得而知,这里暂时将其加入到存储模式分类表格中

由于经常会被YUV的各种格式名字搞混,因此整理了该表格,如有问题欢迎批评指正。