c语言实现灰度图转换为二值图

摘要:
将上一节中获得的灰度图像转换为二进制图像,读取像素数据,如果低于某个值,则将其设置为0,否则将其设置成255。为了获得更好的结果,不同的图像应使用不同的值1/*2,2015年6月2日,11:16:223,灰度图像转换成二进制图像4博客:http://www.cnblogs.com/wd1001/5*/6#包含 7#include<malloc。h˃ 8#include 9/*10位图头结构11*/1

将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置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
");
104     return 0;
105 }

结果:

c语言实现灰度图转换为二值图第1张

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

免责声明:文章转载自《c语言实现灰度图转换为二值图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高效的数据压缩编码方式 Protobuf对话框自带滚动条的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C语言如何进行攻击修改数据

本博客的例子在Windows下的vs2015版本进行的攻击测试,修改一段内存数据的地址的数据内容 1.首先,在VS2015中新建一个空项目,点击源文件进行添加target.c文件,编写具体的代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <Windows....

十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)

1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 13 INT1(上划线) 外部中断1 P3.4 14 T0 定时器/计数器0 外部输入端 P3.5 15 T1 定时器/计数器1...

c语言中的原子操作

参考文章:https://blog.csdn.net/yikai2009/article/details/8650221 1. 原子操作:原子操作指的是在执行过程中不会被别的代码所中断的操作.。分为 位 和 整型变量 两类原子操作。 typedef struct { volatile int counter; } atomic_t; 2. 原子操作函数 分...

Linux Socket学习(十二)

套接口选项在前面的几章中,我们讨论了使用套接口的基础内容。现在我们要来探讨一些可用的其他的特征。在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备。在这一章,我们将会专注于下列主题:如何使用getsockopt(2)函数获得套接口选项值如何使用setsockopt(2)函数设置套接口选项值如何使用这些常用的套接口选项得到套接口选项有时,...

iOS开发之—— 加密使用(MD5,base64,DES,AES)

基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm,安全散列算法)HMAC(Hash Message Authentication Code,散列消息鉴别码) MD5、SHA、HMAC这三种加密算法,可谓是非...

Java虚拟机14:Java对象大小、对象内存布局及锁状态变化

一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法。不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法。至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小。 不过有一点不同的...