文档介绍:直方图.
if(())
return;
int h=();
int w=();
int count[256];
OnGray();
memset(count,0,sizeof(int)*256);//数组初始化
for (int i=0;i<h;i++)//统计数据
{
for (int j=0;j<w;j++)
{
(count[[0][i][j]])++;
}
}
double p[256]={}; //统计概率
for (int i=0;i<256;i++)
{
p[i]=(double)count[i]/a; //*****很重要,先转换,后赋值。
}
/////////////上面为直方图,加上下面为均衡化///////////////////
double s[256]={}; //变换函数
for(int i=0;i<256;i++)
{
if (i==0)
s[i]=p[i];
else
{
s[i]=s[i-1]+p[i];
}
}
int b=0; //变换灰度等级
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
int c=[0][i][j];
b=256*s[c];
[0][i][j]=b;
[1][i][j]=b;
[2][i][j]=b;
}
}
Invalidate(1);
直方图规格化
int h=();
int w=();
size=w*h;
int count[256]={0};//统计灰度值
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
(count[[0][i][j]])++;
}
}
double p0[256]={};//统计每个灰度级概率
for (int i=0;i<256;i++)
{
p0[i]=(double)count[i]/(size);
}
double s0[256]={};//均衡概率和
for(int i=0;i<256;i++)
{
if (i==0)
{
s0[i]=p0[i];
}
else
{
s0[i]=s0[i-1]+p0[i];
}
}
double p1[256]={}; //规定灰度级概率
for(int i=0;i<256;i++)
{
p1[i]=(double)(i+128)/(256*256);
}
double s1[256]={};
for(int i=0;i<256;i++) //规定灰度级概率和
{
if (i==0)
{
s1[i]=p1[i];
}
else
{
s1[i]=s1[i-1]+p1[i];
}
}
double count0[256]={};
for (int i=0;i<256;i++)//找最小的规定灰度级与原灰度级对应
{
double min0=2,minj=0;
for (int j=0;j<256;j++)
{
if (abs(s0[i]-s1[j])<min0)
{
min0=abs(s0[i]-s1[j]);
minj=j;
}
}
count0[i]=minj;
}
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
[0][i][j]=count0[[0][i][j]];
[1][i][j]=count0[[0][i][j]];
[2][i][j]=count0[[0][i][j]];
}
Invalidate(1);
}
自适应均值滤波
int max_