基于C++的直方图均衡化

 

直方图均衡化

目的:使原图像的灰度级更加丰富且动态范围变大,使原来对比度不好的图像的对比度得到改善

原理及算法:

                   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级。


Pssk)的方法:将老的索引值对应的概率合并,作为对应的新的索引值的概率。

由表中数可得:原灰度值——新灰度值

0——1,1——3,2——5,3——6,4——6,5——76——7,7——7

即:

       Psk=0=0;   P(sk=1)=P(rk=0)=0.19; ……P(sk=7)=Prk=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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值