直方图均衡化
目的:使原图像的灰度级更加丰富且动态范围变大,使原来对比度不好的图像的对比度得到改善
原理及算法:
r——原图像的灰度级,假设被归一化到区间[0, 1]。0代表黑色,1代表白色。
即:若灰度级k=0,1,2,...,255,则rk=k/255。
s——输出图像的灰度级,则有:
s=T(r)
直方图均衡化变换式: sk=T(rk)=
nj——每级灰度所占像素个数
n——分辨率,即总的像素个数
例:分辨率64*64,灰度级为8级。
求Ps(sk)的方法:将老的索引值对应的概率合并,作为对应的新的索引值的概率。
由表中数可得:原灰度值——新灰度值
0——1,1——3,2——5,3——6,4——6,5——7,6——7,7——7。
即:
P(sk=0)=0; P(sk=1)=P(rk=0)=0.19; ……P(sk=7)=P(rk=5,6,7)=0.11
unsigned char* lpSrc;//指向原图像的指针
long lTemp;//
BYTE bMap[256];//灰度映射表
long lCount[256];//源图像灰度级统计个数
long lLineBytes;//每行的字节数
//-------------------------
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*i+j;
lCount[*lpSrc]++;//统计每级灰度的个数
}//for_j
}//for_i
for(i=0;i<256;i++)
{
lTemp=0;
for(j=0;j<=i;j++)
{
lTemp+=lCount[j];//累计概率相加
}//for_j
bMap[i]=(BYTE)(lTemp*255/lWidth/lHeight);//计算当前概率下映射的新灰度值
}//for_i
for(i=0;i<lHeight;i++)
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
*lpSrc=bMap[*lpSrc];//原灰度映射成新灰度
}//for_j