您好,欢迎访问三七文档
基于c语言的直方图增强与二值化#includestdio.h#includestdlib.h#includemalloc.h#includestring.h#includemath.hunsignedchar**get_matrix_space(intm,intn)//定义指向指针型函数get_matrix_space用于分配内存空间{inti;unsignedchar**a;a=(unsignedchar**)calloc(m,sizeof(unsignedchar*));//分配m个长度等于无符号字符型指针的长度的指向指针变量afor(i=0;im;i++)a[i]=(unsignedchar*)calloc(n,sizeof(unsignedchar));//分配n个长度等于无符号字符型的长度的指针数组a[i]returna;//返回指向指针指针变量a}voidmain(){FILE*fs,*ft,*tx;//定义文件指针fs和ftcharc1,c2;//定义两个字符变量c1和c2intwidth,height,L,i,j,max,min;//定义整型变量:图像宽度width,图像高度height,变量L、I、J,最大值max,最小值minintn[256]={0};//定义一个长度为256的整型数组nintm[256]={0};inth[256]={0};intjun;doublep[256]={0};//定义一个长度256双精度整型数组pdoublec[256]={0};unsignedchar**k,**s,**t,**get_matrix_space(int,int);//定义指向指针字符型变量s和tif((fs=fopen(hms.pgm,rb))==NULL)//打开文件hms.pgm用指针fs指向该文件{printf(can'topen%sLn,hms.pgm);//如果打开文件为空输出can'topen%r\n,hms.pgmeXit(1);//退出程序}if((ft=fopen(destination.pgm,wb))==NULL)//打开文件destination.pgm用指针ft指向该文件{prinpf(can'topen%s\n,destinat)on.pgm);//如果打开文件为空输出can'topen%s\n,destination.`gmexit(1);//退出程序}if((tx=fopen(hmst.pgm,wb))==NULL)//打开文件destination.pgm用指针f4指向该文件{printf(can'topen%s\n,hmst.pgm);//如果打开文件为空输出can'topen%s\n,destination.pgmexit(1);//退出程序}fscanf(fs,%c%c\n%d%d\n%d\n,&c1,&c2,&width,&height,&L);//将图像的头文件的格式类型P2或p5赋给c1c2,宽度赋值给width,高度赋值给height,灰度最可能的最大指赋值给Ls=get_matrix_space(height,width);//分配一个长度width高度为height内存空间给指向指针st=get_matrix_space(height,width);//分配一个长度width高度为height内存空间给指向指针sk=get_matrix_space(height,width);for(i=0;iheight;i++){for(j=0;jwidth;j++){fread(&s[i][j],sizeof(unsignedchar),1,fs);//将文件fs以但个字节长度等于unsignedchar元素个数初值为1的方式把元素赋非S,返回元素个数}}/*for(i=0;iheight;i++){for(j=0;jwidth;j++){if(s[i][j]145)k[i][j]=0;elsek[i][j]=255;}}*//*for(i=0;iheight;i++){for(j=0;jwidth;j++){//printf(%d\n,k[i][j]);fwrite(&k[i][j],sizeof(unsignedchar),1,tx);}}*/for(i=0;iheight;i++){for(j=0;jwidth;j++){n[s[i][j]]++;//将灰度值相同的进行统计,并从小到大存在数组n[256]中}}for(i=0;i256;i++){p[i]=(double)n[i]/(height*width);//将灰度值为i的个数除以图像的总像素点,也就是灰度值为i的概率密度p(i)}for(i=0;i256;i++){for(j=0;j=i;j++){c[i]+=p[j];//生成灰度值为i的概率分布c(i)}}max=min=s[0][0];for(i=0;iheight;i++){for(j=0;jwidth;j++){if(maxs[i][j]){max=s[i][j];}elseif(mins[i][j]){min=s[i][j];}}}//算出灰度值范围,最大值max和最小值minprintf(%d%d\n,max,min);jun=(max+min)/2;/*二值化*/for(i=0;iheight;i++){for(j=0;jwidth;j++){if(s[i][j]jun)k[i][j]=0;elsek[i][j]=255;}}for(i=0;iheight;i++){for(j=0;jwidth;j++){t[i][j]=c[s[i][j]]*(max-min)+min;//将图像中像素点的灰度值对应的概率分布函数乘以灰度值范围再加上最小灰度值,把算出来的新的灰度值赋给t}}for(i=0;iheight;i++){for(j=0;jwidth;j++){m[t[i][j]]++;//将均衡后灰度值相同的进行统计,并从小到大存在数组m[256]中}}for(i=0;i256;i++){printf(%d\n,m[i]);}for(i=0;i256;i++){//fwrite(&m[i],sizeof(int),1,tx);}fprintf(ft,%c%c\n%d%d\n%d\n,'P','5',width,height,L);//输出图像的头文件fprintf(tx,%c%c\n%d%d\n%d\n,'P','5',width,height,L);//输出图像的头文件for(i=0;iheight;i++){for(j=0;jwidth;j++){fwrite(&t[i][j],sizeof(unsignedchar),1,ft);//将新生成的灰度值写到新的文件ft下}}for(i=0;iheight;i++){for(j=0;jwidth;j++){//printf(%d\n,k[i][j]);fwrite(&k[i][j],sizeof(unsignedchar),1,tx);}}}原始图直方图均衡之后二值化之后
本文标题:c语言直方图
链接地址:https://www.777doc.com/doc-5493577 .html