C语言处理图片二值化程序代码[亲测能用]

Posted 小魏的马仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言处理图片二值化程序代码[亲测能用]相关的知识,希望对你有一定的参考价值。

#include <stdio.h>  #include <stdlib.h> #include <conio.h>
#pragma pack(1)
#define R 30 #define G 59 #define B 11
#define ONE 255  #define ZERO 0 
typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG; typedef unsigned char BYTE;
typedef struct tagBITMAPFILEHEADER // bmfh   WORD bfType; // 位图文件的类型,必须为BM  DWORD bfSize; // 位图文件的大小,以字节为单位  WORD bfReserved1; // 位图文件保留字,必须为0  WORD bfReserved2; // 位图文件保留字,必须为0  DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位 BITMAPFILEHEADER; 
typedef struct tagBITMAPINFOHEADER // bmih   DWORD biSize; // 本结构所占用字节数  LONG biWidth; // 位图的宽度,以像素为单位  LONG biHeight; // 位图的高度,以像素为单位  WORD biPlanes; // 目标设备的级别,必须为1  WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一  DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一  DWORD biSizeImage; // 位图的大小,以字节为单位  LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数  LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数  DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数  DWORD biClrImportant;// 位图显示过程中重要的颜色数 BITMAPINFOHEADER; 
typedef struct tagPOINT  BYTE b;  BYTE g;  BYTE r; POINT;
int quit();
int quit()  puts("File's format wrong");  exit(0);
void main (int argc,char *argv[])     FILE *fi,*fo;//I/O file   char fin[80],fon[80];//I/O file name   BYTE buff,o=0;  BITMAPFILEHEADER bf;  BITMAPINFOHEADER bi;  POINT **p;  int i,j,t;   if(argc<3)       printf("orginfile name:");    scanf("%s",fin);    printf("resultfile name:");    scanf("%s",fon);   else    sscanf(argv[1],"%s",fin);    sscanf(argv[2],"%s",fon);      if(argc==4)    sscanf(argv[4],"%d",&t);   else    printf("theshold [0,255]:");    scanf("%d",&t);    
 if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL))       puts("\\nfile open failed");    return;    
 fread(&bf,sizeof(bf),1,fi);  fread(&bi,sizeof(bi),1,fi);
 if(bf.bfType!=0x4d42) quit();  if(bf.bfReserved1!=0x0000) quit();  if(bf.bfReserved2!=0x0000) quit();
 if(bi.biClrImportant!=0) quit();  if(bi.biBitCount!=0x18) quit();  if(bi.biCompression!=0) quit();  if(bi.biPlanes!=1) quit();
 bf.bfSize=54+1024+bi.biWidth*bi.biHeight;  bf.bfOffBits=54+1024;    if(bi.biWidth%4==0)   bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8;  else   bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8;  bi.biBitCount=8;
 p=(POINT **)malloc(sizeof(POINT *)*bi.biHeight);  for (i=0;i<bi.biHeight;i++)  *(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth);  //分配失败后果自负!
 fwrite(&bf,sizeof(bf),1,fo);  fwrite(&bi,sizeof(bi),1,fo);
 for (i=0;i<bi.biHeight;i++)    for (j=0;j<bi.biWidth;j++)    fread(*(p+i)+j,sizeof(POINT),1,fi);
 for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)     fwrite(&buff,sizeof(buff),1,fo);   fwrite(&buff,sizeof(buff),1,fo);   fwrite(&buff,sizeof(buff),1,fo);   fwrite(&o,sizeof(o),1,fo);  
 for (i=0;i<bi.biHeight;i++)    for (j=0;j<bi.biWidth;j++)       buff=((*(p+i)+j)->r*R+(*(p+i)+j)->g*G+(*(p+i)+j)->b*B)/100;    buff=(buff>=t?ONE:ZERO)    fwrite(&buff,sizeof(buff),1,fo);    fclose(fo);   

以上是关于C语言处理图片二值化程序代码[亲测能用]的主要内容,如果未能解决你的问题,请参考以下文章

安卓手机号码自动添加空格效果-终极解决方案-亲测能用

安卓手机号码自动添加空格效果-终极解决方案-亲测能用

如何用matlab计算二值化图中白色区域的像素点个数

Linux安装vsftpd总结,亲测能用

对图像进行二值化的处理方法,求源代码,最好是C++/C或者OPENCV

MATLAB二值化数据怎么保存为AWL文件?