直方图均衡化公式推导

来源:互联网 发布:赢富数据 编辑:程序博客网 时间:2024/05/01 12:31

直方图可以表示一幅图像中不同颜色值(对于灰度图就是灰度级,对于彩色图是不同通道组成的数对表示的颜色)的像素个数,或者这种颜色值的像素占总像素个数的比例。对一幅图像进行直方图均衡化,就是让图中的像素的颜色值分布尽量均匀,通过不同颜色的对比使人看得更清楚。

以灰度图来说明,把均衡化之前和之后的图中的像素灰度级分布看成F(x)F(y),随机变量xy是灰度取值,且这两个随机变量之间存在函数转换关系y=T(x)
所以问题相当于已知概率密度函数f(x)f(y)T(x)
f(x)=nkMN,即灰度为nk的像素占所有像素的比例,MN是图像的行列数;f(y)=1L1,因为均衡化的目标就是让图像中的各个灰度级的像素个数能够分配均匀,L是灰度级的个数】

解决上述问题:

F(y)=P(Yy)=P(T(X)y)=P(XT1(y))=F(x)|x=T1(y)
【这里的T1(y)T(x)的反函数,之所以不等号不需要变号(一直都是≤号串下来)是因为T(x)是增函数,之所以是增函数是因为,如果把每个像素的灰度值当作每个考生的成绩的话,均衡化之后考生之间的分差变明显,但考试名次是保持不变的。】


对上式两边同时对y求导,得到f(y)=f[T1(y)]d[T1(y)]dy=f(x)dxdy


把已知和要求的部分套入上式,1L1=nkMNdxd[T(x)]
整理为d[T(x)]=(L1)nkMNdx
两边同时对x积分(因为是离散的数字图像,所以是求和),
得到T(x)=L1MNkj=0nj

推导过程参考冈萨雷斯的数字图像处理。

C++实现:

void HistEqual(Mat &src){    int width = src.cols, height = src.rows;    uchar *pCur, *pEnd = src.data + width*height;    int histogram[256];    int A, g;    int LUT[256];    memset(histogram, 0, sizeof(int)* 256);    for (pCur = src.data; pCur<pEnd;) histogram[*(pCur++)]++;    for (LUT[0] = 0, A = histogram[0], g = 1; g<256; g++)    {        A = A + histogram[g];        LUT[g] = 255 * A / (width*height);    }    for (pCur = src.data; pCur<pEnd;)*(pCur++) = LUT[*pCur];}
原创粉丝点击