车牌灰度化的一小段代码(参考)

  最近在做一个小小的项目,用到了灰度化的相关知识,下面将灰度化的算法写在下面,以供大家学习!

 1 #include <windows.h>    
 2 #include <stdio.h>    
 3 #include <stdlib.h>    
 4 #include <ctype.h>    
 5 #include <string.h>    
 6 #include <malloc.h>    
 7 
 8 int main()    
 9 {   
10     BITMAPFILEHEADER bf; //BMP文件头结构体  
11     BITMAPINFOHEADER bi; //BMP信息头结构体  
12     
13     FILE* fp;           //指向文件的指针  
14     RGBQUAD *ipRGB; //
15     DWORD LineByte,ImgSize;       
16     unsigned char * * Imgdata;    
17     int i,j;    
18     char fileName[256];    
19     
20     //打开文件  
21     printf("please enter filename:");    
22     scanf("%s",fileName);    
23     fp=fopen(fileName,"rb");    
24     if(fp == NULL){   
25         printf("Open file error!");   
26         exit(0);   
27     }   
28     
29     //读取信息头、文件头  
30     fread(&bf,sizeof(BITMAPFILEHEADER),1,fp); //把指针fp所指向的文件的头信息写入bf(地址)  
31     fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);    
32     LineByte=bi.biSizeImage / bi.biHeight; //计算位图的实际宽度并确保它为的倍数  
33     ImgSize=(DWORD)LineByte*bi.biHeight;               
34     Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组  
35     if(bi.biBitCount==24){    
36         
37         for ( i=0;i<bi.biHeight;i++)    
38             Imgdata[i]=new unsigned char[(bi.biWidth*3+3)/4*4]; //每个数组元素也是一个指针数组  
39         for ( i=0;i<bi.biHeight;i++ )    
40             for(j=0;j<(bi.biWidth*3+3)/4*4;j++)    
41                 fread(&Imgdata[i][j],1,1,fp);//每次只读取一个字节,存入数组   
42     } 
43     
44     fclose(fp);    
45     //写入另一个文件  
46     fp=fopen("mybmp.bmp","wb");    
47     //以下定义中带“2”的都是新图像信息。
48     BITMAPFILEHEADER bf2;
49     BITMAPINFOHEADER bi2;
50     int nBytesPerLine2 = ( (bi.biWidth+3)/4 ) * 4;       
51     int nImageSize2 = nBytesPerLine2 * bi.biHeight; 
52     memcpy( &bi2, &bi, sizeof(BITMAPINFOHEADER) );
53     bi2.biBitCount=8;
54     bi2.biSizeImage=nImageSize2;
55     bf2.bfType = 0x4d42;
56     bf2.bfReserved1 = bf2.bfReserved2 = 0;
57     bf2.bfOffBits = sizeof(bf2)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
58     bf2.bfSize = bf2.bfOffBits + nImageSize2;
59     fwrite(&bf2,sizeof(BITMAPFILEHEADER),1,fp);  
60     fwrite(&bi2,sizeof(BITMAPINFOHEADER),1,fp);  
61     RGBQUAD *ipRGB2 = (RGBQUAD *)malloc(256*sizeof(RGBQUAD));
62     for ( i = 0; i < 256; i++ )
63         ipRGB2[i].rgbRed = ipRGB2[i].rgbGreen = ipRGB2[i].rgbBlue = i;
64     fwrite(ipRGB2,sizeof(RGBQUAD),256,fp);  
65     unsigned char *ImgData2 = new unsigned char[nImageSize2];
66     int nLineStart2;
67     for ( i=0;i<bi.biHeight;i++ )
68     {
69         nLineStart2 = nBytesPerLine2 * i;
70         for ( int j = 0; j<nBytesPerLine2;j++ )
71             ImgData2[nLineStart2+j]= int( (float)Imgdata[i][3 * j] * 0.114 + \
72             (float)Imgdata[i][3 * j + 1] * 0.587 + \
73             (float)Imgdata[i][3 * j + 2] * 0.299 );
74     }
75     fwrite(ImgData2,nImageSize2,1,fp);   
76     free(Imgdata);    
77     fclose(fp);    
78     return 0;    
79 }
posted @ 2012-09-26 23:15  qyindelong  阅读(536)  评论(0编辑  收藏  举报