多媒体信息处理课程设计报告YUV文件转换为BMP文件_课程设计文件实验报告
多媒体信息处理课程设计报告YUV文件转换为BMP文件由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“课程设计文件实验报告”。
目录
摘要...........................................................................................................................................1 1 引言.......................................................................................................................................1 2 颜色空间概述.......................................................................................................................2 2.1 RGB颜色空间.................................................................................................................2 2.2 YUV颜色空间.................................................................................................................2 3 YUV 420采样格式及其存储方式......................................................................................3 4 YUV 转换为RGB 以BMP位图文件保存............................................................................3 4.1 YUV与RGB转换关系....................................................................................................3 4.2 BMP图像保存................................................................................................................4 5 结语.......................................................................................................................................6 参考文献...................................................................................................................................6 附录...........................................................................................................................................7
YUV文件转换为BMP文件
xxx
摘要
本文首先对RGB、YUV颜色空间作了简要的介绍,介绍了YUV 420采样格式及其存储方式。简述了YUV 与RGB 的关系, 并且给出了换算公式。最后对YUV文件进行RGB转换,以BMP位图格式把结果保存。
关键词:颜色空间;BMP;YUV;RGB 1 引言
颜色是人的视觉系统对光谱中可见区域的感知效果。它仅存在于人的眼睛和大脑中。为了准确地描述颜色, 必须引入色彩空间的概念。正如几何上用坐标空间来描述坐标集合, 色彩空间用数学方式来描述颜色集合。常见的3 个基本色彩模型是RGB, CMYK 和YUV。
RGB(Red, Green, Blue)是计算机中最常见的色彩空间。它通过红、绿、蓝3 基色的相加来产生其他的颜色。由于其设备的独立性, 它被广泛应用于计算机图形、成像系统和彩色电视之中。而CMYK(Cyan, Magenta, Yellow, Black)色彩空间,则是通过颜色相减来产生其他的颜色, 实现方便,它被广泛应用于印刷工业。而YUV 或YIQ 或YCb-Cr 色彩空间则描述灰度和色差的概念, 由于易于实现压缩, 方便传输和处理, 它被广泛应用于广播和电视系统。正是由于这一点, 它也被广泛应用于计算机视频和图像处理之中, 如JPEG 图像和MPEG 均使用YUV 作为存储像素的格式。在获得显示硬件支持的情况下, 使用YUV 还可以减少和消 除色彩变换处理, 极大地加快图像的显示速度。颜色空间概述
2.1 RGB颜色空间
在色度学中,为了确切表示某一种彩色,采用亮度、色调和色饱和度三个基本参量。彩 色视觉是人眼对这个三个参量的总体感觉[1]。亮度是光作用于人眼所引起的明亮程度的感 觉。色调是反映了彩色的类别。也就是通常所说的红,绿,蓝等就指的是色调。色和度是指彩 色光所呈现彩色的深浅程度。对于同一中颜色的彩色光,彩色越浓,色饱和度越高。根据色度学的介绍,不同波长的单色光会引起不同的彩色感觉,但相同的彩色感觉却可
以来源于不同的光谱成分组合。自然界中几乎所有的颜色都能用三种基本彩色混合配出,在 彩色电视技术中选择红色、绿色、和蓝色作为三基色。其他的颜色都可以用红色、绿色和蓝 色按照不同的比例混合而成。所选取的红色、绿色和蓝色三基色空间。简称为RGB颜色空 间。
2.2 YUV颜色空间
YUV 是一种基本色彩空间, 被欧洲的电视系统所采用。它被PAL(Phase Alternat ion Line), NTSC(Nat ional Television System Committee)和SECAM(Sequent ielCouleur Avec Memoire or Sequential Colorwith Memory)用作复合色彩视频标准。其中Y 指颜色的明视度(Luminance), 即亮度(Brightne), 其实Y 就是图像的灰度值(Gray value), 而U 和V 则是指色调(Chrominance), 即描述图像色彩及饱和度的属性。黑白系统只使用Y 信息, 因为U 和V 是附加上去的, 所以黑白系统仍能正常显示。YUV 420采样格式及其存储方式YUV 转换为RGB 以BMP位图文件保存
4.1 YUV与RGB转换关系
RGB在计算机领域有着举足轻重的地位, 由于色彩显示器使用红、绿、蓝3 色来产生需要的颜色, 所以被广泛用于计算机图形和成像之中。
然而, 在处理现实世界的图像时, RGB并非很有效, 因为它对所有颜色都用等长像素点的R、G、B 3色加以合成。这就使得每个像素在R、G、B 3个成分上拥有相同的像素深度和显示分辨率。而且处理RGB颜色空间的图像也不是最有效的。由于上述原因,很多地方采用YUV颜色空间。可以说在计算机领域, YUV 颜色空间同样占据着重要地位。
RGB与YUV之间可以相互转化。由RGB转化的公式如下: Y=INT(16.5+(0.257R+0.504G+0.098B))Cb=INT(128.5+(-0.148R-0.291G+0.439B))Cr=INT(128.5+(0.439R-0.368G-0.071B))由上述公式可推导出YUV转换为RGB公式如下:
R=1.1665*(Y-16.5)-0.0483*(Cb-128.5)+1.6455*(Cr-128.5)G=1.1665*(Y-16.5)-0.3922*(Cb-128.5)-0.8151*(Cr-128.5)B=1.1665*(Y-16.5)+2.0218*(Cb-128.5)-0.0013*(Cr-128.5)
4.2 BMP图像保存
数字图像在计算机中都是以文件的形式存储和记录的,一般的图像文件主要包含文件头、文件体、文件尾三部分。BMP图像文件格式是Miscrosoft公司为其Windows环境设置的标准图像文件格式。BMP图像文件主要由位图文件头、位图信息头、位图调色板和位图数据四部分组成,其数据结构定义如下: 1.位图文件头: typedefstruct {
WORD bfType;DWORD bfSize;
//文件大小 WORD bfReserved1;
//保留字,不考虑 bfReserved2;
//保留字,同上 WORD DWORD bfOffBits;
//实际位图数据的偏移字节数,即前三个部分长度之和
}HEAD;
2.位图信息头: typedefstruct {
DWORD
biSize;
//指定此结构体的长度,为40
LONG
biWidth;
//位图宽 LONG
biHeight;
//位图高
WORD
biPlanes;
//平面数,为1
WORD
biBitCount;
//采用颜色位数,可以是1,2,4,8,16,24,新的可以是32
DWORD
biCompreion
//压缩方式,可以是0,1,2,其中0表示不压缩 DWORD
biSizeImage;
//实际位图数据占用的字节数 LONG
biXPelsPerMeter;
//X方向分辨率 LONG
biYPelsPerMeter;
//Y方向分辨率
DWORD
biClrUsed;
//使用的颜色数,如果为0,则表示默认值(2^颜色
位数)
DWORD
biClrImportant;
//重要颜色数,如果为0,则表示所有颜色都是重要的}INFO;
3.位图调色板:
typedefstruct {
BYTE rgbBlue;//该颜色的蓝色分量 BYTE rgbGreen;//该颜色的绿色分量 BYTE rgbRed;//该颜色的红色分量 BYTE rgbReserved;//保留值
}RGBQUAD;BMP文件保存的详细实现详见附录。转换后BMP文件如下:
bmp2.bmp
bmp5.bmp 结语
这次课程设计实现了最基本的YUV文件转换为BMP文件,对YUV 420的采样格式及其存储有了进一步的认识,对多媒体信息处理有了进一步的了解,对以后的学习有一定的帮助。这次课程设计有很大的收获,在学习多媒体的道路上还要更加努力。
参考文献
[1]卢官明,焦良葆.多媒体信息处理技术[M].人民邮电出版社,2011.[2] R.C.Conzalez编,阮秋琦等译.数字图像处理[M].电子工业出版社,2003.[3] 黎洪松.数字视频处理[M].北京邮电大学出版社,2006.[4] 谭浩强.C语言程序设计[M].清华大学出版社,2006 [5] 周长发.精通Visual C++图像编程[M].电子工业出版社,2000.附录
附录清单:
1.2.//bmp.h
#include #include #define
WIDTHBYTES(bits)(((bits)+31)/32*4)typedef unsigned int
DWORD;typedef unsigned char
uchar;typedef unsigned char
BYTE;typedef unsigned short
WORD;typedef long #pragma pack(2)typedefstruct {
WORD DWORD WORD WORD DWORD bfType;bfSize;
//文件大小 bfReserved1;
//保留字,不考虑 bfReserved2;
//保留字gf,同上
bfOffBits;
//实际位图数据的偏移字节数,即前三个部分长度之和
LONG;bmp.h cjw.cpp }HEAD;#pragma pack()#pragma pack(2)typedefstruct { DWORD
biSize;
//指定此结构体的长度,为40
LONG
biWidth;
//位图宽 LONG
biHeight;
//位图高
WORD
biPlanes;
//平面数,为1
WORD
biBitCount;
//采用颜色位数,可以是1,2,4,8,16,24,新的可以是32
DWORD
biCompreion;
//压缩方式,可以是0,1,2,其中0表示不压缩 DWORD
biSizeImage;
//实际位图数据占用的字节数 LONG
biXPelsPerMeter;
//X方向分辨率 LONG
biYPelsPerMeter;
//Y方向分辨率
DWORD
biClrUsed;
//使用的颜色数,如果为0,则表示默认值(2^颜色位数)
DWORD
biClrImportant;
//重要颜色数,如果为0,则表示所有颜色都是重要的}INFO;#pragma pack()typedefstruct {
BYTE rgbBlue;//该颜色的蓝色分量 BYTE rgbGreen;//该颜色的绿色分量 BYTE rgbRed;//该颜色的红色分量 BYTE rgbReserved;//保留值
}RGBQUAD;intBMPwrite(const char*filename,uchar* buffer,intwidth,int height){
intLineByte = WIDTHBYTES(width*24);uchar* image =(uchar*)malloc(height*LineByte);for(int i=0;i
for(int j=0;j
} image[i*LineByte+3*j+2]=buffer[(height-i-1)*width*3+3*j];image[i*LineByte+3*j+1]=buffer[(height-i-1)*width*3+3*j+1];image[i*LineByte+3*j+0]=buffer[(height-i-1)*width*3+3*j+2];
unsigned char header[54] ={
0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0,54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0
};
longfile_size = width * LineByte + 54;header[2] =(uchar)(file_size&0x000000ff);header[3] =(uchar)(file_size>> 8)& 0x000000ff;header[4] =(uchar)(file_size>> 16)& 0x000000ff;header[5] =(uchar)(file_size>> 24)& 0x000000ff;header[18] = width & 0x000000ff;header[19] =(width >> 8)&0x000000ff;header[20] =(width >> 16)&0x000000ff;header[21] =(width >> 24)&0x000000ff;header[22] = height &0x000000ff;header[23] =(height >> 8)&0x000000ff;header[24] =(height >> 16)&0x000000ff;header[25] =(height >> 24)&0x000000ff;
FILE *fp;if(!(fp = fopen(filename, “wb”)))return-1;fwrite(header, sizeof(unsigned char), 54, fp);fwrite(image, sizeof(unsigned char), LineByte*height, fp);fclose(fp);
} free(image);return 0;
//cjw.cpp #include #include #include #include #include “bmp.h”
#define WIDTH 176 #define HEIGHT 144 //转换矩阵
doubleYuvToRgb[3][3] = {1,0, 1.4022,1,-0.3456,-0.7145,1,1.771,0};//转换函数
int Convert(char *file, int width, int height, int n)
{
//变量声明
int temp = 0;
int x = 0;
int y = 0;
intfReadSize = 0;
intImgSize = width*height;
FILE *fp = NULL;
unsigned char* yuv = NULL;
unsigned char* cTemp[6];
char *BmpFileName=(char*)malloc(256*sizeof(char));intFrameSize = ImgSize +(ImgSize>> 1);
yuv =(unsigned char *)malloc(FrameSize*sizeof(uchar));
//读取指定文件中的指定帧 if((fp = fopen(file, “rb”))== NULL)
return 0;
//申请空间 //4:2:0 , 1.5倍长度
}
fseek(fp, FrameSize*(n-1), SEEK_CUR);
//SEEK_CUR=1,对应当前位置 fReadSize = fread(yuv, 1, FrameSize, fp);
if(fReadSize
{ printf(“已超出文件中的帧数!”);return 0;
} else {
//转换指定帧
cTemp[0] = yuv;
//y分量地址 cTemp[1] = yuv + ImgSize;
//u分量地址 cTemp[2] = cTemp[1] +(ImgSize>>2);
//v分量地址 uchar *imgdata =(uchar *)malloc(height*width*3*sizeof(uchar));for(y=0;y
for(x=0;x
{
//r分量,根据公式转换
temp = cTemp[0][y*width+x] +(cTemp[2][(y/2)*(width/2)+x/2]-128)* YuvToRgb[0][2];
imgdata[y*width*3+x*3] = temp255 ? 255 : temp);//条件判断,像素值应该在0-255之间 //g分量
temp = cTemp[0][y*width+x] +(cTemp[1][(y/2)*(width/2)+x/2]-128)* YuvToRgb[1][1]
+(cTemp[2][(y/2)*(width/2)+x/2]-128)* YuvToRgb[1][2];
imgdata[y*width*3+x*3+1] = temp255 ? 255 : temp);
//b分量
temp = cTemp[0][y*width+x] +(cTemp[1][(y/2)*(width/2)+x/2]-128)* YuvToRgb[2][1];
imgdata[y*width*3+x*3+2] = temp255 ? 255 : temp);
sprintf(BmpFileName, “%s%d%s”,“bmp”, n,“.bmp”);BMPwrite(BmpFileName,imgdata,width, height);free(yuv);
fclose(fp);
return n;
}
} void main()
{ char m[100];int n;printf(“选择所要转换的文件:”);scanf(“%s”,&m);printf(“请输入要转换的帧数:”);scanf(“%d”,&n);Convert(m, WIDTH, HEIGHT, n);//调用上面的Convert,获取文件的第i帧 ,Convert(“foreman_qcif.yuv”, WIDTH, HEIGHT, i);strcat(m,n)连接2个字符串
} printf(“图像转换完成!n”);