#include <iostream.h>
void main()
{
//存储图像个栅格单元的灰度值
int yuanTu[5][5]={{4,3,7,6,8},{2,4,8,9,9},{5,8,9,13,10},{7,9,12,15,11},{8,11,10,14,13}};
int canKao[5][5]={{2,1,5,4,7},{1,2,7,10,10},{3,7,10,14,11},{12,15,13,10,5},{14,14,11,12,7}};
int xinTu[5][5]={0};
//存储中间变量
int yuanZhiFang[16]={0},canZhiFang[16]={0},yuanLeiji[16]={0},canLeiji[16]={0},zhi[15]={0};
float yuanPin[16],canPin[16],zhongJianZhi[17];
//循环变量
int i,j,k;
//计算直方图
for(k=0;k<16;k++)
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
if(yuanTu[i][j]==k)
yuanZhiFang[k]+=1;
if(canKao[i][j]==k)
canZhiFang[k]+=1;
}
//计算累积直方图
yuanLeiji[0]=yuanZhiFang[0];
canLeiji[0]=canZhiFang[0];
for(k=1;k<16;k++)
{
yuanLeiji[k]=yuanLeiji[k-1]+yuanZhiFang[k];
canLeiji[k]=canLeiji[k-1]+canZhiFang[k];
}
//计算各灰度值出现的频率
for(k=0;k<16;k++)
{
yuanPin[k]=yuanLeiji[k]/(float)25;
canPin[k]=canLeiji[k]/(float)25;
}
//计算对比所需的中间变量
zhongJianZhi[0]=(0+canPin[0])/2;
for(k=1;k<16;k++)
{
zhongJianZhi[k]=(canPin[k]+canPin[k-1])/2;
}
zhongJianZhi[16]=(canPin[15]+1.1)/2;
//计算对应关系
for(i=0;i<16;i++)
for(j=0;j<17;j++)
{
if(yuanPin[i]>=zhongJianZhi[j]&&yuanPin[i]<zhongJianZhi[j+1])
{
zhi[i]=j;
break;
}
}
//计算新图,即结果图
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
xinTu[i][j]=zhi[yuanTu[i][j]];
cout<<xinTu[i][j]<<" ";
}
cout<<endl;
}
}
/****************************************************
计算结果
2 1 6 4 9
1 2 9 10 10
3 9 10 14 11
6 10 13 15 12
9 12 11 14 14
Press any key to continue
****************************************************/