#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#include"math.h"
/*宏定义*/
#define height 400 //矩阵的行
#define wide 318 //矩阵的列
#define L 256 //灰度级
/*全局变量*/
int graymatrix[height][wide];
double grayrate[L];
int index[height*wide]; //记录分割后的索引
int aopt;
int copt; //记录最优的模糊参数
double Topt; //记录最优阈值
/*子函数部分*/
/*读入图像的灰度值*/
void readgray()
{
int i,j;
FILE *fp1=fopen("mydata.txt","r"); //读入文件中要处理的数据
if(fp1==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<height;i++)
{ for(j=0;j<wide;j++)
{
fscanf(fp1,"%d",&graymatrix[i][j]);
// printf("%d ",graymatrix[i][j]);
}
}
fclose(fp1);
}
/*图像的灰度直方图*/
void grayzhifang()
{
int i,j,p;
double sum=0;
int num[L]={0};
//double grayrate[L]={0};
for(i=0;i<height;i++)
{
for(j=0;j<wide;j++)
{
for(p=0;p<L;p++)
{
if(graymatrix[i][j]==p)
num[p]++;
}
}
}
for(i=0;i<L;i++)
{ grayrate[i]=num[i]/double(height*wide); //求出每个灰度的比例及灰度直方图
sum+=grayrate[i];
//printf("%lf ",grayrate[i]);
}
printf("sum=%lf \n",sum);
}
/*求出递归函数Ra*/
/*double R_a(int n)
{
double Ra=0;
if(n==0)
Ra=grayrate[0];
else
{
Ra=R_a(n-1)+grayrate[n]; //递归公式
}
return Ra;
}*/
/*求出递归函数Qac*/
/*double Q_ac(int m,int n)
{
double Qac=0;
if(m==n)
Qac=0;
else
{
Qac=Q_ac(m-1,n)-grayrate[m]*(m-n); //递归公式
}
return Qac;
}*/
/*计算模糊熵,求出使得模糊熵最大时的最优模糊参数aopt和copt,并求出最优阈值*/
/*void fuzzyentropy()
{
int a,c;
double P0_ac=0; //记录背景概率
double H_ac=0,H_acmax=-1000; //记录模糊熵的值
for(c=2;c<256;c++)
{
for(a=1;a<c;a++)
{
P0_ac=R_a(a-1)+Q_ac(a-1,c)/(a-c); //求得背景概率
H_ac=-P0_ac*log(P0_ac)-(1-P0_ac)*log(1-P0_ac); //求得模糊熵
if(H_acmax<H_ac)
{
H_acmax=H_ac; //记录最大的模糊熵值
aopt=a;
copt=c; //记录最大的模糊熵参数
}
}
}
Topt=(aopt+copt)/2; //求出最优阈值
}*/
void fuzzyentropy()
{
int a,c,k;
double P0_ac=0; //记录背景概率
double H_ac=0,H_acmax=-1000; //记录模糊熵的值
double p=0,q=0;
for(c=1;c<256;c++)
{
for(a=0;a<c;a++)
{
p=0,q=0;
for(k=0;k<a+1;k++)
p+=grayrate[k];
//printf("%lf ",p);
for(k=a+1;k<c;k++)
q+=grayrate[k]*(k-c)/(a-c);
//printf("%lf ",q);
P0_ac=p+q;
if(P0_ac==1)
H_ac=0;
else
H_ac=-P0_ac*log(P0_ac)-(1-P0_ac)*log(1-P0_ac); //求得模糊熵
//printf("%lf ",H_ac);
if(H_acmax<H_ac)
{
H_acmax=H_ac; //记录最大的模糊熵值
aopt=a;
copt=c; //记录最大的模糊熵参数
}
// printf("%lf ",H_acmax);
}
}
Topt=(aopt+copt)/2; //求出最优阈值
}
/*根据最优阈值对图像进行分割,并记录分割结果*/
void segmentationres()
{
int i,j;
for(i=0;i<height;i++)
for(j=0;j<wide;j++)
{
if(graymatrix[i][j]<=Topt)
index[i*wide+j]=0;
else
index[i*wide+j]=1;
}
}
/*将最终结果存放到文件中*/
void result()
{
int i,j;
FILE* fp2=fopen("outdata.txt","w");
if(fp2==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<height;i++)
{
for(j=0;j<wide;j++)
fprintf(fp2,"%d ",index[i*wide+j]);
fprintf(fp2,"\n");
}
fclose(fp2);
}
/*主函数,使用模糊熵阈值法对图像进行分割*/
void main()
{
clock_t begin,end; //计算程序运行的时间
double cost;
begin=clock(); //开始计时
readgray(); /*读入图像的灰度值*/
grayzhifang(); /*图像的灰度直方图*/
fuzzyentropy(); /*计算模糊熵,求出使得模糊熵最大时的最优模糊参数aopt和copt,并求出最优阈值*/
segmentationres(); /*根据最优阈值对图像进行分割,并记录分割结果*/
result(); /*将最终结果存放到文件中*/
end=clock();
cost=(double)(end-begin); //程序所运行的时间
printf("该程序一共运行了%lf毫秒\n",cost);
}
- 1
- 2
前往页