[笔记]音视频学习之视音频数据处理入门《一》YUV、RGB(上)

简介: [笔记]音视频学习之视音频数据处理入门《一》YUV、RGB

雷神系列文章

[总结]视音频编解码技术零基础学习方法

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

RGB、YUV像素数据处理

YUV格式

YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

YUV原始格式

YUV、YCbCr、YPbPr

Y : 表示明亮度(Luminance或Luma),也就是灰度值;

U V: 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩,饱和度,用于指定像素的颜色。

YUV存储格式 planar、Packet

对于planar的YUV格式,即平面模式 先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。形如 YYYY UUUU VVVV 4个像素的YUV444P

对于packed的YUV格式,即数据包模式, 每个像素点的Y,U,V是连续交叉存储的。 形如 YUV YUV YUV YUV 四个像素。

YUV444,YUV422,YUV420,NV12,NV21

YUV444

YUV444,这种格式占用空间最大,每个像素点有一个Y分量+一个U分量+一个V分量所以和rgb一样每个像素点占用3个字节!

但是根据UV存储顺序不一样,又有两种不同的格式。

形如:

YYYY UUUU VVVV

YYYY VVVV UUUU

YUV422

YUV422 每两个Y分量公用一个UV分量,所以一个像素占用两个字节,根据存储顺序不同又分为四种不同的格式。

还有一种变态的V210格式,好像是苹果搞出来的。

YUV420

YUV420 每四个y分量公用一个UV分量,所以每个像素点占用1.5个字节空间,根据存储顺序不一样又分为四个不同的类型。

形如:

I420: YYYYYYYY UU VV =>YUV420P

YV12: YYYYYYYY VV UU =>YUV420P

NV12: YYYYYYYY UVUV =>YUV420SP

NV21: YYYYYYYY VUVU =>YUV420SP

YUV数据常见处理

(1) 分离YUV420P像素数据中的Y、U、V分量
主要思路

就是读取平面格式的yuv数据,

前widthheight 为Y分量数据;
从width
height,到widthheight5/4,是U分量数据;

从widthheight1/4,到widthheight3/2,是V分量数据;

分别存为三个文件output_420_y,output_420_u,output_420_v文件。

具体实现
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);
    //Y
    fwrite(pic,1,w*h,fp1);
    //U
    fwrite(pic+w*h,1,w*h/4,fp2);
    //V
    fwrite(pic+w*h*5/4,1,w*h/4,fp3);
  }
  free(pic);
  fclose(fp);
  fclose(fp1);
  fclose(fp2);
  fclose(fp3);
  return 0;
}
(2)分离YUV444P像素数据中的Y、U、V分量
主要思路

同理,yuv444p就是比例是1:1:1;

文件y,u,v区间分别是[0,widhei],[widhei,widhei2],[widhei2,widhei3].

(3) 将YUV420P像素数据去掉颜色(变成灰度图)
主要思路

去掉颜色uv,

如果想把YUV格式像素数据变成灰度图像,只需要将U、V分量设置成128。

(4) 将YUV420P像素数据的亮度减半
主要思路

可以通过将YUV数据中的亮度分量Y的数值减半的方法,降低图像的亮度。

如果打算将图像的亮度减半,只要将图像的每个像素的Y值取出来分别进行除以2的工作就可以了。图像的每个Y值占用1 Byte,取值范围是0至255,对应C语言中的unsigned char数据类型。

(5)将YUV420P像素数据的周围加上边框
主要思路

边框区域 设置为255, w在[0,border] && [w-border,w],h在[0,border]&&[h-border,h]区域为边框区域

(6) 生成YUV420P格式的灰阶测试图
主要思路

根据y的范围,和色带的数量,确定每个色带的亮度值,y = ymin+n*(ymax-ymin)/num

然后重新设置yuv图片值,uv=128,y根据色带设置y值。

(7)计算两个YUV420P像素数据的PSNR

PSNR通常用于质量评价,就是计算受损图像与原始图像之间的差别,以此来评价受损图像的质量。

主要思路

先算出mse sum+= pow(pic1[j]-pic2[j],2), mse = sum/M*N;

对于8bit量化的像素数据来说,PSNR的计算公式如下所示。

上述公式中mse的计算公式如下所示。

PSNR取值通常情况下都在20-50的范围内,取值越高,代表两张图像越接近,反映出受损图像质量越好。

相关文章
|
移动开发 JavaScript 前端开发
JavaScript的运行环境是什么?
【4月更文挑战第10天】JavaScript的运行环境是什么?
1145 2
|
传感器 API 开发工具
OpenCV视频读写模块(videoio)
OpenCV视频读写模块(videoio)
OpenCV视频读写模块(videoio)
|
Linux
海思MMZ内存分配
海思MMZ内存分配
588 0
|
机器学习/深度学习 算法 前端开发
【机器学习】Bagging和随机森林
【机器学习】Bagging和随机森林
|
Ubuntu Windows
双系统必备:Ubuntu自动挂载Windows分区
在双系统环境下,手动挂载Windows硬盘十分繁琐。本文介绍如何配置Ubuntu开机自动挂载Windows硬盘,包括硬盘识别、挂载点创建、fstab配置及验证步骤,帮助您节省时间,实现高效操作。
1098 1
|
存储 数据挖掘
YUV色彩空间
本文介绍 YUV存储格式,什么是色调?什么是色饱和度?人类视觉系统是如何感知YUV的?YUV比RGB好在哪里
989 0
html页面点击按钮实现页面跳转功能
html页面点击按钮实现页面跳转
3437 11
YUV 与 RGB的转换
RGB 转换成 YUV Y = (0.257 * R) + (0.504 * G) + (0.
6576 0
|
编解码 Ubuntu 应用服务中间件
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
本文介绍了在NVIDIA Jetson Nano上配置FFmpeg和Nginx的步骤,包括安装、配置和自启动设置。
1058 1
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
|
开发工具 git
GIT:如何合并已commit的信息并进行push操作
通过上述步骤,您可以有效地合并已提交的信息,并保持项目的提交历史整洁。记得在执行这些操作之前备份当前工作状态,以防万一。这样的做法不仅有助于项目维护,也能提升团队协作的效率。
1395 5

热门文章

最新文章