在最近的CCP测试中,需要使用YUV444的测试序列,而平时使用的全都是YUV420的序列,因此自己尝试用C写了一个YUV420转YUV444的程序。

1、YUV分三种采样方式:

YUV444:对于每一个像素都对应一个Y分量、一个U分量、一个V分量。

YUV422:对于一个像素都对应一个Y分量,但是每两个像素(或者说Y分量)对应一个U分量和一个V分量。

YUV420:对于一个像素都对应一个Y分量,但是每四个像素(或者说Y分量)对应一个U分量和一个V分量。

2、YUV的存储格式:

YUV在存储时是以数组的形式存储的,可以看做连续的三个数组。三个数组分别单独存储Y、U、V分量。

以一副1920*1080的YUV444图像为例,如图,YUV分量分别存储在大小为1920*1080的数组中,因此对于数据的操作十分简单。

同理对于YUV420和YUV422,只是U和V的数组大小的不同而已。

总数据量来看,YUV444需要存储1920*1080*3个值,YUV422需要存储1920*1080*2个值,YUV420需要存储1920*1080*3/2个值。

3、YUV420转YUV444主要思路:

YUV420转YUV444,实际就是对色度进行上采样,最为简单的实现思路是直接填充。

以U分量为例,其序列如下

对U进行插值,每个田字格四个位置使用一个U值。

在代码中,可以直接通过对数组循环赋值即可完成。

对V分量的操作相同。

填充方式实现简单,效果较差,可以通过插值来完成上采样。

4、代码实现

YUV420转YUV444函数:

#include "YUV.h"
#include<malloc.h>
#include<memory.h>typedef unsigned char   UINT8;
typedef signed short    INT16;
typedef signed int      INT32;#define Y_SIZE          (PIC_W*PIC_H)
#define YUV420_SIZE        (Y_SIZE*3/2)       //4:2:0格式
#define YUV422_SIZE        (Y_SIZE*2)       //4:2:2格式
#define YUV444_SIZE        (Y_SIZE*3)      //4:4:4格式int YUV2YUV(unsigned char *yuv_buff,unsigned char *yuv2_buff, int PIC_W, int PIC_H)
{UINT8 *y_buf=NULL;y_buf = (UINT8*)malloc(YUV444_SIZE);if(y_buf == NULL){printf("Error: malloc buf.\n");exit(1);}int h,v;//Y分量转换;for(v=0; v<PIC_H; v++){for(h=0; h<PIC_W; h++){y_buf[v*PIC_W+h] = yuv_buff[(v*PIC_W+h)];}}//UV分量转换for(v=0; v<PIC_H; v+=2){for(h=0; h<PIC_W; h+=2){y_buf[PIC_H*PIC_W+v*PIC_W+h] = yuv_buff[PIC_H*PIC_W+v/2*PIC_W/2+h/2];y_buf[PIC_H*PIC_W+v*PIC_W+h+1] = yuv_buff[PIC_H*PIC_W+v/2*PIC_W/2+h/2];y_buf[PIC_H*PIC_W+(v+1)*PIC_W+h] = yuv_buff[PIC_H*PIC_W+v/2*PIC_W/2+h/2];y_buf[PIC_H*PIC_W+(v+1)*PIC_W+h+1] = yuv_buff[PIC_H*PIC_W+v/2*PIC_W/2+h/2];y_buf[2*PIC_H*PIC_W+v*PIC_W+h] = yuv_buff[5*PIC_H*PIC_W/4+v/2*PIC_W/2+h/2];y_buf[2*PIC_H*PIC_W+v*PIC_W+h+1] = yuv_buff[5*PIC_H*PIC_W/4+v/2*PIC_W/2+h/2];y_buf[2*PIC_H*PIC_W+(v+1)*PIC_W+h] = yuv_buff[5*PIC_H*PIC_W/4+v/2*PIC_W/2+h/2];y_buf[2*PIC_H*PIC_W+(v+1)*PIC_W+h+1] = yuv_buff[5*PIC_H*PIC_W/4+v/2*PIC_W/2+h/2];}}memcpy(yuv2_buff,y_buf,YUV444_SIZE); free(y_buf);y_buf=NULL;return 1;     }

main函数如下,主要完成对YUV数据的读取和存储:

#include "YUV.h"#define _CRT_SECURE_NO_WARNINGS
#define IMAGEWIDTH 1024    //图像的宽
#define IMAGEHEIGHT 768    //高int main(int argc, char *argv[])
{//读入参数,共有3个参数if( argc != 3 ) {printf ("Please input infile and outfile!\n");exit(-1);}FILE * input_yuvfile;    //输入YUV420图像FILE * output_yuvfile;     //输出YUV444图像if(NULL == (input_yuvfile =  fopen(argv[1], "rb"))){printf("File input is can't open!\n");return -1;}if(NULL == (output_yuvfile = fopen(argv[2], "wb"))){printf("File output is can't open!\n");return -1;}int readsize;unsigned char *in_buff;in_buff =  (unsigned char *)malloc(IMAGEWIDTH*IMAGEHEIGHT*sizeof(unsigned char)*3/2); unsigned char *out_buff,*yuv_buff;out_buff=(unsigned char *)malloc(IMAGEWIDTH*IMAGEHEIGHT*sizeof(unsigned char)*3);memset (out_buff,0,IMAGEWIDTH*IMAGEHEIGHT*sizeof(unsigned char)*3);yuv_buff=(unsigned char *)malloc(IMAGEWIDTH*IMAGEHEIGHT*sizeof(unsigned char)*3/2);memset (yuv_buff,0,IMAGEWIDTH*IMAGEHEIGHT*sizeof(unsigned char)*3/2);while(1){readsize=fread(in_buff,1 , IMAGEWIDTH*IMAGEHEIGHT*3/2,input_yuvfile);if(readsize<IMAGEWIDTH*IMAGEHEIGHT*3/2) //读取的数据量少于IMAGEWIDTH*IMAGEHEIGHT*3/2时跳出break;memcpy(yuv_buff,in_buff,IMAGEWIDTH*IMAGEHEIGHT*sizeof(unsigned char)*3/2);YUV2YUV(yuv_buff, out_buff,IMAGEWIDTH,IMAGEHEIGHT);fwrite(out_buff,1,IMAGEWIDTH*IMAGEHEIGHT*3,output_yuvfile);}free(in_buff);in_buff=NULL;free(out_buff);out_buff=NULL;free(yuv_buff);yuv_buff=NULL;fclose(input_yuvfile);fclose(output_yuvfile);}

YUV420转YUV444相关推荐

  1. YUV420转YUV444 , YUV420转RGB

    我想大家应该知道了YUV的颜色表示原理即: Y = 0.299R + 0.587G + 0.114B  U = -0.147R - 0.289G + 0.436B  V = 0.615R - 0.51 ...

  2. yuv420 YUV422 YUV444格式及存储排列

    YUV420: YUV422: 另外,YUV422还有YUYV,YVYU,VYUY,UYVY四种排列(格式) YUV444:

  3. 图文详解YUV420数据格式YUV444数据格式YUV422数据格式

    转:https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed. 对于planar ...

  4. 视频压缩知识介绍(一)——评价标准及算法原理

    1.1   视频压缩评价标准               评价视频压缩算法的压缩效果,信噪比是一个非常有效的指标,它非常客观.一般来说,同等码率下,解码后图像与原始图像的信噪比高的那个码流,图像效果更 ...

  5. RAW,RGB,YUV简单理解

    RAW 未经isp处理的从感光原件获得的原始图像 采用bayer格式排列,bayer数据格式中包含1/2绿色,1/4的红和1/4的蓝(理解为RGGB) RGB 通过使用三原色R.G.B的不同的亮度值( ...

  6. H.265和H.264对比分析(VR视频传输)

    名 称 : H.265和H .264对比分析 姓 名 : 殷松 时 间 : 2017年6月14日 目 录 一. H.265(HEVC)与H.264对比 二.H.265关键技术分析 三.H.265与H. ...

  7. YUV数据格式与YUV_420_888

    最近在准备做Android Camera2相关应用,刚好也碰上了YUV格式相关的问题,所以还是写一篇博客理解YUV格式数据. 介绍 YUV是一种颜色空间,基于YUV的颜色编码是流媒体的常用编码方式. ...

  8. RK3588和RK3588S芯片介绍

    RK3588和RK3588S芯片介绍 文章目录 RK3588和RK3588S芯片介绍 RK3588芯片简介 RK3588S与RK3588的差异 视频编解码性能 解码 编码 NPU RK3588芯片简介 ...

  9. 音视频开发入门基础知识(视频入门篇)

    RTSP实时音视频开发实战课程:<RTSP实时音视频开发实战> 音视频开发入门基础知识(音频入门篇) 目录 一.前言 二.视频采集和显示 三.视频常见的格式 四.RGB转YUV和YUV转R ...

最新文章

  1. c++ 开方_刷屏时尚圈!The Story Shoulder稳坐风尚C位的背后究竟有什么奇妙魔力?...
  2. Python数据可视化教程之基础篇
  3. 从输入网址到显示网页的全过程分析【转】
  4. Mac电脑如何显示隐藏文件
  5. Python-按照list中dict的某个key进行排序
  6. 【拓扑排序】【DP】旅行计划(luogu 1137)
  7. JAVA取钱多线程实验_JAVA多线程----用--取钱问题2
  8. 菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)
  9. Python用format格式化字符串
  10. MySQL-快速入门(16)MySQL Cluster,集群技术
  11. win7系统下文件夹重命名提示找不到该项目:的解决!
  12. vi删除选中内容_Vim快速选中、删除、复制引号或括号中的内容
  13. 利用YYLabel 进行图文混排+高度计算
  14. google fonts 国内使用方案
  15. Premature end of Content-Length delimited message body解决方案
  16. exp和expdp的filesize参数的使用--导出多个文件
  17. pcntl_alarm()的示例
  18. Vscode 自动保存以及保存格式
  19. IDM下载器最新稳定版本6.33.2
  20. 计算机视觉用显卡,基于GPU加速的计算机视觉编程:使用OpenCV和CUDA实时处理复杂图像数据...

热门文章

  1. 卷积物理意义 几何意义
  2. Linux打开端口1521,Linux开放1521端口允许网络连接Oracle Listener
  3. Parallel Scavenge和Parallel Old垃圾回收器组合
  4. 如何真正理解好一个「设计模式」?
  5. PointNet介绍
  6. Mathematica 多个积分区间
  7. 轻松清理电脑中几十G大文件的操作方法
  8. HTML中动态图片的onclick事件参数传递
  9. 论文阅读《Bidirectional LSTM-CRF Models for Sequence Tagging》
  10. Dual-Path Deep Fusion Network for Face Image Hallucination