以下论述来自https://blog.csdn.net/weixin_39830846/article/details/89314413
是由 KIM 提出的.
是一种基于图象均值来分割输入图像,得到两幅子图,一幅是像素值小于或等于均值的样本集,另一幅是像素值大于均值的样本集。分别独立的进行直方图均衡化。
作用:增强图像对比度的同时,保持输入图像的平均亮度。
参考文献:Brightness Preserving Bi-Histogram Equalization,BBHE
提取了一下该增强算法的主要原理:
----------------------------------------------------------------------分割线-------------------------------------------------------
百度的都是matlab版本的,故自己写了个c++版本
先上效果图:
可以看到还是有一个提升的,但由于图像问题,提升不是这么明显
未经修改的核心代码如下:
void bbhe(uint8 *img, int width, int height)
{
int Xm, Xmin = 1e9, Xmax=0;
int len = width * height;
int sl[256] = { 0 }, su[256] = { 0 };
double pl[256] = { 0 }, pu[256] = { 0 };
double cl[256] = { 0 }, cu[256] = { 0 };
int nl, nu;
nl = nu = 0;
getInfo(img,width,height,&Xm,&Xmin,&Xmax);
for (int i = 0; i < len; ++i)
{
if (img[i] <= Xm)
{
sl[img[i]]++;
nl++;
}
else su[img[i]]++,nu++;
}
for (int i = 0; i < 256; ++i)
{
pl[i] = 1.0*sl[i] / nl;
pu[i] = 1.0*su[i] / nu;
}
for (int i = 0; i < 256; ++i)
{
if (i == 0) {
cl[i] = pl[i];
cu[i] = pu[i];
}
else {
cl[i] = pl[i] + cl[i - 1];
cu[i] = pu[i] + cu[i - 1];
}
}
for (int i = 0; i < Xm; ++i)
cl[i] = Xmin + cl[i]*(Xm - Xmin);
for (int i = Xm; i < 256; ++i)
cu[i] = Xm+1 + cu[i]*(Xmax - Xm - 1);
for (int i = 0; i < len; ++i)
{
if (img[i] <= Xm)img[i] = cl[img[i]];
else img[i] = cu[img[i]];
}
}