车牌灰度化的一小段代码(参考)
最近在做一个小小的项目,用到了灰度化的相关知识,下面将灰度化的算法写在下面,以供大家学习!
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 }
创造改变价值,编程改变人生