资源描述:
《BMP图像由彩图变为灰度图.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Date:6月21日任务:BMP真彩图像转为灰度图一,算法及公式:1,什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:浮点算法:Gray=R*0.3+G*0.59+B*0.11整数方法:Gray=(R*30+G*59+B*11)/100移位方法:Gray=(R*28+G*151+B*77)>>8;平均值法:Gray=(R+G+B)/3;仅取绿色:Gray=G;通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用
2、Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。2,改变象素矩阵的RGB值,来达到彩色图转变为灰度图加权平均值算法:根据光的亮度特性,其实正确的灰度公式应当是R=G=B=R*0.299+G*0.587+B0.144为了提高速度我们做一个完全可以接受的近似,公式变形如下:R=G=B=(R*3+G*6+B)/103,真正的24位真彩图与8位的灰度图的区别就在于,真彩图文件中没有调色板,灰度图有调色板,真彩图中的象素矩阵是RGB值,灰度图中的象素矩阵是调色板索引值。源代码1只简单的
3、改变象素矩阵的RGB值,来达到彩色图转为灰度图,并没有添加调色板。源代码2添加了调色板。二,源代码1,//可以输入文件名的源代码,有些变量定义进行了完善#include"stdio.h"#include"stdlib.h"#include"string.h"#include"windows.h"#include"conio.h"typedefstruct{unsignedcharb;unsignedcharr;unsignedcharg;}pixel;pixela[640][480];unsignedcharaa[640][480];voi
4、dmain(){BITMAPFILEHEADERFILEH;BITMAPINFOHEADERINFOH;RGBQUADRGBH[256];charname[11];char*fname[11];printf("输入需要转换的图片名:");scanf("%s",&name);*fname=name;strcat(*fname,".bmp");printf("%s",*fname);FILE*fp;if((fp=fopen(*fname,"rb"))==NULL){//if((fp=fopen(*fname,"wb"))==NULL)//防止首
5、次进入时初始化失败//{printf("打开文件%s失败!按任意键返回主菜单!",fname);getch();exit(1);//}}printf("%s",*fname);intLEN1=sizeof(BITMAPFILEHEADER);intLEN2=sizeof(BITMAPINFOHEADER);intX,Y;printf("len=%d,%d",LEN1,LEN2);fread(&FILEH,sizeof(BITMAPFILEHEADER),1,fp);fread(&INFOH,sizeof(BITMAPINFOHEAD
6、ER),1,fp);X=INFOH.biWidth;Y=INFOH.biHeight;//printf("%d*%d",X,Y);if(FILEH.bfType!=0x4d42){fclose(fp);printf("文件头不正确,不是bmp!");exit(1);}if(INFOH.biBitCount!=24&&INFOH.biBitCount!=8){fclose(fp);printf("信息头不正确,不是bmp!");exit(1);}//*RGBH=A;unsignedcharblue,green,red,color;intj,k
7、;if(INFOH.biBitCount==8){fread(&RGBH,sizeof(RGBQUAD),256,fp);for(j=0;j8、(INFOH.biBitCount==24){for(j=0;j