实验目的
1.学会从计算和程序的角度分析问题通过完成本实验,理解计算思维,即从问题出发,通过逐步分析和分解,把原问题转化为可用程序方式解决的问题。在此过程中设计出一个解决方案。
2.进一步理解彩色空间的概念并掌握不同彩色空间转换的基本方程。
3.通过逐步设计程序,掌握编程细节:如查找表的设计,内存分配,对 U 和 V 信号进行下采样,文件读写过程等。掌握程序调试的基本方法
实验步骤
1.编写RGB转化为YUV程序,部分查找表的初始化和调用,缓冲区分配。将得到的RGB文件转换为YUV文件,用YUV Viewer播放器观看,验证是否正确。
rgb转化为yuv所采用的公式如下:
Y=0.299R+0.587G+0.114B
U=−0.1684R−0.3316G+0.5B+128
V=0.5R−0.4187G−0.0831B+128
2.编写将YUV转换为RGB的程序。将给定的实验数据用该程序转换为RGB文件。并与原RGB文件进行比较,如果有误差,分析误差来自何处。
yuv转化为rgb所采用的公式如下:
R=Y+1.402∗(V−128)
G=Y−0.34414∗(U−128)−0.71414∗(V−128)
B=Y+1.772(U−128)
实现的代码
rgb2yuv:
#include<stdio.h>
#include<stdlib.h>
const int width = 256;
const int height = 256;
int main(int argc,char *argv[])
{
unsigned char* buffer_rgb = new unsigned char[ 3 * width * height];
unsigned char* buffer_y = new unsigned char[width * height];
unsigned char* buffer_u = new unsigned char[width * height / 4];
unsigned char* buffer_v = new unsigned char[width * height / 4];
FILE* rgb=NULL;
FILE* yuv=NULL;
fopen_s(&rgb,argv[1], "rb");
if (rgb == NULL)
printf("cannot find rgb file\n");
fread(buffer_rgb, sizeof(unsigned char), 3 * width * height,rgb);
fopen_s(&yuv,argv[2], "wb+");
if (yuv == NULL)
printf("cannot find yuv file\n");
for (int i = 0; i < width * height; i++)
{
buffer_y[i] = 0.299 * buffer_rgb[3 * i + 2] + 0.587 * buffer_rgb[3 * i + 1] + 0.114 * buffer_rgb[3 * i];
if (buffer_y[i] > 235)
buffer_y[i] = 235;
else if (buffer_y[i] < 16)
buffer_y[i] = 16;
}//y
int u = 0 , v = 0;
for (int i = 0; i < height ; i++)
for (int j = 0; j < width; j++)
{
if (i %