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

来源:互联网 发布:js压缩成min.js 编辑:程序博客网 时间:2024/06/16 06:18
 

直方图均衡化

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

原理及算法:

                   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;//指向原图像的指针longlTemp;//BYTEbMap[256];//灰度映射表longlCount[256];//源图像灰度级统计个数longlLineBytes;//每行的字节数//-------------------------for(i=0;i<lHeight;i++){for(j=0;j<lWidth;j++){lpSrc=(unsigned char*)lpDIBBits+lLineBytes*i+j;lCount[*lpSrc]++;//统计每级灰度的个数}//for_j}//for_ifor(i=0;i<256;i++){lTemp=0;for(j=0;j<=i;j++){lTemp+=lCount[j];//累计概率相加}//for_jbMap[i]=(BYTE)(lTemp*255/lWidth/lHeight);//计算当前概率下映射的新灰度值}//for_ifor(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


0 0
原创粉丝点击