数据压缩【实验一】C++实现YUV与RGB色彩空间的相互转换

一、实验目的

  • 将给定的实验数据用该程序转换为RGB文件。
  • 并与原RGB文件进行比较,如果有误差,分析误差来自何处。
  • 总结 RGB 和 YUV。
  • 彩色空间转换的转换公式及编程实现的算法。 写成实验报告。

二、实验原理

Y=0.2990R+0.5870G+0.1140B
R-Y=0.7010R-0.5870G-0.1140B
B-Y=-0.2990R-0.5870G+0.8860B

(1)RGB2YUV

Y=0.299R+0.587G+0.114B
U=-0.1684R-0.3316G+0.5B+128
V=0.5R-0.4187G-0.0813B+128

(2)YUV2RGB

R=1.0753Y+1.5075(V−128)
G =1.0753Y-0.3441( U −128)-0.6084(V−128)
B = 1.0753Y-0.3441(U-128)-0.6084(V-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

(5)量化

量化过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、实验思路

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的数据量。

YUV2RGB

在这里插入图片描述

四、实验过程

命令行参数设置
在这里插入图片描述

RGB2YUV

(1)代码

程序对于变量数据类型的选择、内存的占用.使得在处理24bits(8B8G8R)的RGB图像时,为其每个像素单个分量开辟的空间都为8bits,几乎不会有任何的浪费,十分精确。


#define u_int8_t	unsigned __int8
#define u_int		unsigned __int32
#define u_int32_t	unsigned __int32
#define FALSE		false
#define TRUE		true

查找表


static float r0299[256],g0587[256],b0114[256],r01684[256],g03316[256],b05[256],r05[256],g04187[256],b00813[256];
void Table()
{
   
	for(int i=0;i<256;i++) r0299[i]=0.299*i;
	for(int i=0;i<256;i++) g0587[i]=0.587*i;
	for(int i=0;i<256;i++) b0114[i]=0.114*i;
	for(int i=0;i<256;i++) r01684[i]=0.1684*i;
	for(int i=0;i<256;i++) g03316[i]=0.3316*i;
	for(int i=0;i<256;i++) b05[i]=0.5*i;
	for(int i=0;i<256;i++) r05[i]=0.5*i;
	for(int i=0;i<256;i++) g04187[i]=0.4187*i;
	for(int i=0;i<256;i++) b00813[i]=0.0813*i;
}

主函数

int main(int argc,char** argv)
{
   	
	int height,width;
	char *filename_yuv,*filename_rgb;
	unsigned char *RGB_buffer=NULL;
	unsigned char *YUV_buffer=NULL;
	unsigned char *RGB_buffer_del,*YUV_buffer_del;
	
	filename_yuv=argv[2];
	filename_rgb=argv[1];
	height=atoi(argv[3]);
	width=atoi(argv[4]);
	//读入
	RGB_buffer=new unsigned char[height*width*3];
	YUV_buffer=new unsigned char[height*width*3/2];
	RGB_buffer_del=RGB_buffer;
	YUV_buffer_del=YUV_buffer;
	FILE *fp_yuv=NULL,*fp_rgb=NULL;
	fp_yuv=fopen(filename_yuv,"wb");
	fp_rgb=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值