yuv简介

本文重点学习yuv的相关知识,包括420,422,这些,以及8bit,10bit的区别;因为yuv是视频编码的基础,也是最终展示到端上最终的结果;所以学习yuv的知识是至关主要的;包括sdr,hdr的区别等等;

一、首先看一下RGB
RGB就是三原色,红绿蓝不用多解释;但是为什么还要用这一句话去讲解一下,因为RGB涉及到和yuv的转换,以及为什么要转换,所以我们要先说清楚;
===============================================================
二、再看一下yuv
亮度信号经常被称作Y,色度信号是由两个互相独立的信号组成。视颜色系统和格式不同,两种色度信号经常被称作U和V或Pb和Pr或Cb和Cr。这些都是由不同的编码格式所产生的,但是实际上,他们的概念基本相同。在DVD中,色度信号被存储成Cb和Cr(C代表颜色,b代表蓝色,r代表红色)
===============================================================
三、再看看为什么会有4:4:4,4:2:2,4:2:0这些
在 最近十年中,视频工程师发现人眼对色度的敏感程度要低于对亮度的敏感程度。在生理学中,有一条规律,那就是人类视网膜上的视网膜杆细胞要多于视网膜锥细 胞,说得通俗一些,视网膜杆细胞的作用就是识别亮度,而视网膜锥细胞的作用就是识别色度。所以,你的眼睛对于亮和暗的分辨要比对颜色的分辨精细一些。正是 因为这个,在我们的视频存储中,没有必要存储全部颜色信号。既然眼睛看不见,那为什么要浪费存储空间(或者说是金钱)来存储它们呢?
像Beta或VHS之类的消费用录像带就得益于将录像带上的更多带宽留给黑—白信号(被称作“亮度”),将稍少的带宽留给彩色信号(被称作“色度”)。
在MPEG2(也就是DVD使用的压缩格式)当中,Y、Cb、Cr信号是分开储存的(这就是为什么分量视频传输需要三条电缆)。其中Y信号是黑白信号,是以全分辨率存储的。但是,由于人眼对于彩色信息的敏感度较低,色度信号并不是用全分辨率存储的。
色度信号分辨率最高的格式是4:4:4,也就是说,每4点Y采样,就有相对应的4点Cb和4点Cr。换句话说,在这种格式中,色度信号的分辨率和亮度信号的分辨率是相同的。这种格式主要应用在视频处理设备内部,避免画面质量在处理过程中降低。当图像被存储到Master Tape,比如D1或者D5,的时候,颜色信号通常被削减为4:2:2。
===================================================
简单的总结一下,其实图像最开始用到在电视上,所以我们在看设计的时候,一定要考虑一下当初电视的一些知识;比如电视传输是有三条电缆;所以对于planar模式,是yuv分开存储的;对于packed模式的话,那么就是交错存储;
还有电视的话,因为电视以前都是电子仪扫描,所以我们下面会看到,其实每一行都会有u,v;但是不是每一列都会有的
====================================================

image.png

在图中,你可以看到4:4:4格式的亮度、色度采样分布。就像图中所表示的,画面中每个象素都有与之对应的色度和亮度采样信息。
其次就是4:2:2,就是说,每4点Y采样,就有2点Cb和2点Cr。在这种格式中,色度信号的扫描线数量和亮度信号一样多,但是每条扫描线上的色度采样点 数却只有亮度信号的一半。当4:2:2信号被解码的时候,“缺失”的色度采样,通常由一定的内插补点算法通过它两侧的色度信息运算补充。
看4:2:2格式亮度、色度采样的分布情况。在这里,每个象素都有与之对应的亮度采样,同时一半的色度采样被丢弃,所以我们看到,色度采样信号每隔 一个采样点才有一个。当着张画面显示的时候,缺少的色度信息会由两侧的颜色通过内插补点的方式运算得到。就像上面提到的那样,人眼对色度的敏感程度不如亮 度,大多数人并不能分辨出4:2:2和4:4:4颜色构成的画面之间的不同。
色度信号分辨率最低的格式,也就是DVD所使用的 格式,就是4:2:0了。事实上4:2:0是一个混乱的称呼,按照字面上理解,4:2:0应该是每4点Y采样,就有2点Cb和0点Cr,但事实上完全不是 这样。事实上,4:2:0的意思是,色度采样在每条横向扫描线上只有亮度采样的一半,扫描线的条数上,也只有亮度的一半!换句话说,无论是横向还是纵向, 色度信号的分辨率都只有亮度信号的一半。举个例子,如果整张画面的尺寸是720480,那么亮度信号是720480,色度信号只有360*240。在 4:2:0中,“缺失”的色度采样不单单要由左右相邻的采样通过内插补点计算补充,整行的色度采样也要通过它上下两行的色度采样通过内插补点运算获得。这 样做的原因是为了最经济有效地利用DVD的存储空间。诚然,4:4:4的效果很棒,但是如果要用4:4:4存储一部电影,我们的DVD盘的直径至少要有两 英尺(六十多厘米)!
上图表示了概念上4:2:0颜色格式非交错画面中亮度、色度采样信号的排列情况。同4:2:2格式 一样,每条扫描线中,只有一半的色度采样信息。与4:2:2不同的是,不光是横向的色度信息被“扔掉”了一半,纵向的色度信息也被“扔掉”了一半,整个屏 幕中色度采样只有亮度采样的四分之一。请注意,在4:2:0颜色格式中,色度采样被放在了两条扫描线中间。为什么会这样呢?很简单:DVD盘上的颜色采样 是由其上下两条扫描线的颜色信息“平均”而来的。比如,图三中,第一行颜色采样(Line 1和Line 2中间夹着的那行)是由Line 1和Line 2“平均”得到的,第二行颜色采样(Line 3和Line 4中间夹着的那行)也是同样的道理,是由Line 3和Line 4得到的。
虽然文章中多次提到“平均”这个概念,但是这个“平均”可不是我们通常意义上的(a+B)/2的平均。颜色的处理有极其复杂的算法保证其最大限度地减少失真,接近原始质量。
yuv将数据分开,代码如下:

int simplest_yuv420_split(char *url, int w, int h,int num){  
    FILE *fp=fopen(url,"rb+");  
    FILE *fp1=fopen("output_420_y.y","wb+");  
    FILE *fp2=fopen("output_420_u.y","wb+");  
    FILE *fp3=fopen("output_420_v.y","wb+");  
    unsigned char *pic=(unsigned char *)malloc(w*h*3/2);  
    for(int i=0;i<num;i++){  
        fread(pic,1,w*h*3/2,fp);  
        fwrite(pic,1,w*h,fp1);  
        fwrite(pic+w*h,1,w*h/4,fp2);  
        fwrite(pic+w*h*5/4,1,w*h/4,fp3);  
    }  
    free(pic);  
    fclose(fp);  
    fclose(fp1);  
    fclose(fp2);  
    fclose(fp3);  
    return 0; 
}  

=====================================================
个人理解,最后的这个yuv420p,这个p代表的是表示是线性存储;所以我们那上面的图,都是yuv420,yuv422,这种交织存储的模式;但是如果带有p了以后,代表的就是线性存储的方式;
=====================================================
yuv10bit的存储方式
我们知道为了获得更好的动态范围,除了常见的8bit yuv外,还有10bit,16bit这样的yuv数据。8bit的yuv数据还好理解,每一个像素8bit,在内存中自然也就是一个字节一个字节的存储咯,16bit的也类似,每一个像素对应两个字节,在内存中存起来也非常方便,那么10bit呢?
每个像素依然占用16bit两个字节,但是其中6个bit是padding,补0


image.png

大端存储
这么看,在损失部分精度的话,8bit转10bit就是8bit的数据乘以4即可(损失最后两位数据,后面会学习tone mapping,来看一下如何做色彩转换);
=========================================================

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工作中经常会使用一些颜色空间,最主要的就是使用RGB空间和YUV空间,把两空间的一些知识记录在此。 1. 什么是R...
    秦枫桀阅读 5,289评论 0 1
  • 工作中经常会使用一些颜色空间,最主要的就是使用RGB空间和YUV空间,把两空间的一些知识记录在此。 1. 什么是R...
    miniminiming阅读 3,089评论 0 0
  • 前言 系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三...
    GenoChen阅读 12,457评论 6 21
  • RGB和YUV 多媒体编程 一、概念 1.什么是RGB? 对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用...
    流年易逝_李阅读 14,941评论 0 6
  • YUV数据格式 目录 YUV的原理 YUV的取值范围 YUV的存储格式 YUV的采样格式 存储方式 10bit Y...
    seymourchen阅读 5,670评论 0 0