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语言处理图片二值化程序代码[亲测能用]的主要内容,如果未能解决你的问题,请参考以下文章