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 }

结果:

明天考四级了,考完再写剩下的

posted @ 2015-06-12 16:00  雪原寸草  阅读(3514)  评论(1编辑  收藏  举报