c语言实现灰度图转换为二值图
将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置为255,为得到更好的效果不同图片应采用不同的值
1 /* 2 2015年6月2日11:16:22 3 灰度图转换为二值图 4 blog:http://www.cnblogs.com/wd1001/ 5 */ 6 #include<stdio.h> 7 #include<malloc.h> 8 #include<stdlib.h> 9 /* 10 位图头结构 11 */ 12 #pragma pack(1) 13 typedef struct tagBITMAPFILEHEADER 14 { 15 unsigned char bfType[2];//文件格式 16 unsigned long bfSize;//文件大小 17 unsigned short bfReserved1;//保留 18 unsigned short bfReserved2; 19 unsigned long bfOffBits; //DIB数据在文件中的偏移量 20 }fileHeader; 21 #pragma pack() 22 /* 23 位图数据信息结构 24 */ 25 #pragma pack(1) 26 typedef struct tagBITMAPINFOHEADER 27 { 28 unsigned long biSize;//该结构的大小 29 long biWidth;//文件宽度 30 long biHeight;//文件高度 31 unsigned short biPlanes;//平面数 32 unsigned short biBitCount;//颜色位数 33 unsigned long biCompression;//压缩类型 34 unsigned long biSizeImage;//DIB数据区大小 35 long biXPixPerMeter; 36 long biYPixPerMeter; 37 unsigned long biClrUsed;//多少颜色索引表 38 unsigned long biClrImporant;//多少重要颜色 39 }fileInfo; 40 #pragma pack() 41 /* 42 调色板结构 43 */ 44 #pragma pack(1) 45 typedef struct tagRGBQUAD 46 { 47 unsigned char rgbBlue; //蓝色分量亮度 48 unsigned char rgbGreen;//绿色分量亮度 49 unsigned char rgbRed;//红色分量亮度 50 unsigned char rgbReserved; 51 }rgbq; 52 #pragma pack() 53 54 int main() 55 { 56 int i,j; 57 unsigned char ImgData[1000]; 58 FILE * fpGray,* fpBin; 59 fileHeader * fh; 60 fileInfo * fi; 61 rgbq * fq; 62 63 if((fpGray=fopen("G:/vc6.0/work/22.bmp","rb"))==NULL) 64 { 65 printf("打开文件失败"); 66 exit(0); 67 } 68 69 if((fpBin=fopen("G:/vc6.0/work/33.bmp","wb"))==NULL) 70 { 71 printf("创建文件失败"); 72 exit(0); 73 } 74 //读取灰度图数据 75 fh=(fileHeader *)malloc(sizeof(fileHeader)); 76 fi=(fileInfo *)malloc(sizeof(fileInfo)); 77 fq=(rgbq *)malloc(256*sizeof(rgbq)); 78 fread(fh,sizeof(fileHeader),1,fpGray); 79 fread(fi,sizeof(fileInfo),1,fpGray); 80 fread(fq,sizeof(rgbq),256,fpGray); 81 //将头信息写入 82 fwrite(fh,sizeof(fileHeader),1,fpBin); 83 fwrite(fi,sizeof(fileInfo),1,fpBin); 84 fwrite(fq,sizeof(rgbq),256,fpBin); 85 //灰度值低于阈值则置0 86 for(i=0;i<(fi->biHeight);i++) 87 { 88 for(j=0;(j<(fi->biWidth+3)/4*4);j++) 89 { 90 fread(&ImgData[j],1,1,fpGray); 91 if(ImgData[j]>142) 92 ImgData[j]=255; 93 else 94 ImgData[j]=0; 95 } 96 fwrite(ImgData,1,j,fpBin); 97 } 98 free(fh); 99 free(fi); 100 free(fq); 101 fclose(fpBin); 102 fclose(fpGray); 103 printf("success\n"); 104 return 0; 105 }
结果:
明天考四级了,考完再写剩下的