目录
一、实验目的
- 将给定的实验数据用该程序转换为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=