实验2.1C语言实现YUV文件与RGB文件互换格式

本文档详细介绍了使用C语言进行YUV到RGB以及RGB到YUV格式转换的实验过程,包括转换公式、实验思路、具体步骤及结果分析。实验结果显示,格式转换可能导致图像清晰度下降。
摘要由CSDN通过智能技术生成

前言

在这里插入图片描述

如图,本次实验的要求和所用rgb文件和yuv文件(4:2:0)的命名,格式,大小如上图所示。

4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方
向和垂直方向上的取样点数均为Y的一半。

课上老师已讲解如何从RGB转到YUV格式,并给出了程序,阅读理解后自己写出从YUV转到RGB格式的程序。

实验内容

转换公式

本次实验中Y,U,V与R,G,B的值域都是0~255

在这里插入图片描述

实验思路

yuv2rgb的实验思路
在这里插入图片描述

实验步骤

RGB2YUV

命令参数的设置

1.项目-属性-调试-命令参数(4个值分别为要处理的文件名,要生成的文件名,文件的高,文件的宽)
2工作目录改为项目位置
在这里插入图片描述

查找表

static float RGBYUV02990[256], RGBYUV05870[256], RGBYUV01140[256];
static float RGBYUV01684[256], RGBYUV03316[256];
static float RGBYUV04187[256], RGBYUV00813[256];

void InitLookupTable()
{
   
	int i;

	for (i = 0; i < 256; i++) RGBYUV02990[i] = (float)0.2990 * i;
	for (i = 0; i < 256; i++) RGBYUV05870[i] = (float)0.5870 * i;
	for (i = 0; i < 256; i++) RGBYUV01140[i] = (float)0.1140 * i;
	for (i = 0; i < 256; i++) RGBYUV01684[i] = (float)0.1684 * i;
	for (i = 0; i < 256; i++) RGBYUV03316[i] = (float)0.3316 * i;
	for (i = 0; i < 256; i++) RGBYUV04187[i] = (float)0.4187 * i;
	for (i = 0; i < 256; i++) RGBYUV00813[i] = (float)0.0813 * i;
}

头文件

int RGB2YUV (int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip);

void InitLookupTable();

转换函数

int RGB2YUV (int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip)
{
   
	static int init_done = 0;

	long i, j, size;
	unsigned char *r, *g, *b;
	unsigned char *y, *u, *v;
	unsigned char *pu1, *pu2, *pv1, *pv2, *psu, *psv;
	unsigned char *y_buffer, *u_buffer, *v_buffer;
	unsigned char *sub_u_buf, *sub_v_buf;

	if (init_done == 0)
	{
   
		InitLookupTable();
		init_done = 1;
	}

	// 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;

	// allocate memory
	y_buffer = (unsigned char *)y_out;
	sub_u_buf = (unsigned char *)u_out;
	sub_v_buf = (unsigned char *)v_out;
	u_buffer = (unsigned char *)malloc(size * sizeof(unsigned char));
	v_buffer = (unsigned char *)malloc(size * sizeof(unsigned char));
	if (!(u_buffer && v_buffer))
	{
   
		if (u_buffer) free(u_buffer);
		if (v_buffer) free(v_buffer);
		return 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值