Lab1 RGB与YUV彩色空间的转换

您所在的位置:网站首页 c语言格式转化 Lab1 RGB与YUV彩色空间的转换

Lab1 RGB与YUV彩色空间的转换

2024-07-11 02:15| 来源: 网络整理| 查看: 265

Lab1 RGB与YUV彩色空间的转换——C语言代码实现 一、实验内容

1、理解并调试老师所给的RGB2YUV的转换过程,掌握关键代码的实现思路。 2、仿照所给示例,自己编写RGB2YUV的转换代码,并使用YUVviewerPlus进行验证。 3、自行完成YUV2RGB的转换过程,并进行误差分析。

已知:

down.rgb和down.yuv分辨率为256*256yuv为4:2:0采样空间存储格式为:rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放 二、实验基础 1、RGB—>YUV

由电视原理知识可知,亮度Y和色差信号R-Y、B-Y的计算公式为: Y=0.2990R+0.5870G+0.1140B R-Y=0.7010R-0.5870G-0.1140B B-Y=-0.2990R-0.5870G+0.8860B

为了使色差信号的动态范围控制在0.5之间,对色差信号进行归一化,引入压缩系数,即: U=-0.1684R-0.3316G+0.5B V=0.5R-0.4187G-0.0813B

量化过程

Y量化公式 Cr量化公式 Cb量化公式

图片源于现代电视原理课件

其中,为使色差零电平对应码电平128,故引入128的偏置。

综上,最后得到Y、U、V三者计算公式为:

Y=0.2990R+0.5870G+0.1140B ​U=-0.1684R-0.3316G+0.5B+128 V=0.5R-0.4187G-0.0813B+128

2、YUV—>RGB

已知R、G、B计算Y、U、V的公式,反推利用Y、U、V计算R、G、B的公式如下: R=Y+1.4075(V-128) G=Y-0.3455(U-128)-0.7169(V-128) B=Y+1.7790(U-128)

3、RGB文件分析 文件中的数据为BGRBGRBGR……R、G、B分别有256*256=65536个数值R、G、B分别据自己前一个数据的偏移量都是3 4、YUV文件分析 先存放256*256个像素的Y再存放128*128的U最后存放128*128的V 三、参考RGB2YUV程序的分析 1、实现思路 首先,定义相关指针,开辟地址空间,进行文件读取。(准备工作)其次,编写RGB2YUV转换函数,并进行调用。(核心环节)最后,判断数据范围,写入文件,释放指针。(收尾工作)

RGB2YUV转换函数实现步骤: int RGB2YUV (int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip); x_dim为图像宽度,y_dim为图像高度。 bmp为RGB文件读取数据的指针。 y_out、u_out、v_out为转换后存放Y、U、V数据的输出指针。 flip为是否对图像进行上下颠倒的参数。

通过循环,依次读取每个像素的B、G、R值,并代入公式计算Y、U、V。对U、V数据进行下采样(取四个点数据均值),以实现128*128的数据量。 2、程序亮点 程序对于变量数据类型的选择、内存的占用 #define u_int8_t unsigned __int8 #define u_int unsigned __int32 #define u_int32_t unsigned __int32 #define FALSE false #define TRUE true

这样的处理,使得在处理24bits(8B8G8R)的RGB图像时,为其每个像素单个分量开辟的空间都为8bits,几乎不会有任何的浪费,十分精确。

程序对于图像宽高的判断 // check to see if x_dim and y_dim are divisible by 2 if ((x_dim % 2) || (y_dim % 2)) return 1; size = x_dim * y_dim;

由于采用4:2:0的采样空间,需要对U、V进行下采样,这就必须保证x_dim和y_dim均为偶数。

程序采用查找表 void InitLookupTable() { int i; for (i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3