HE

Posted on 2025-07-10 13:54  KobeBLN  阅读(16)  评论(0)    收藏  举报

一、why HE

基于gamma进行对比度拉伸也改改善图像对比度,?线性灰度映射的非线性调整

资料显示仅适用于低对比度图像,不适用于高动态图像,如果场景复杂灰度直方图跨度已经很大,拉伸方法对对比度的提升有限

分析,这里可能指的是场景动态范围的高低,

 

HE实现底层具体方法容易遗忘,所以整理到这里

HE原理,(根据图像灰度直方图统计信息如累积分布函数调整图像灰度分布使得其不同灰度级的概率分布函数相同)

调整方法,理解,手动计算,(待补充)

缺点1,局部表现力不足

解决1,分块处理后融合,难点,融合的边界效应,

缺点2,灰区强行将灰度分布拓展导致噪点和artfacts,尤其引入解决1后

解决,引入对比度限制,每个bin的频数作限制,超过部分如何处理?,可以先参考

 artifacts包括分色异常,分析可参考

 

参考:https://zhuanlan.zhihu.com/p/150381937

 

 

Q:构建归一化的0-255范围的cdf后,为何return cdf[image]可以返回he后的img?

A:归一化后cdf范围0-255,min-max 0-255,实现索引映射

 原始灰度等级到新灰度等级的映射方式,原始灰度级下像素数 与总像素数的比值 . 为保证新cdf从0开始归一化减去min的cdf值,

HE后每一级灰度等级的像素占比应为像素范围均匀分布,所以HE后每个灰度级下像素数均为 PX总数 / ( L - 1 )

上述式进一步的理解为,某一灰度等级原始像素

减min目的:保证HE后图像亮度输出从0开始,保障对比度

*关键需要理解点:前后cdf是一致的,如原始中间亮的灰度级he后必定也是中间即128

 当前灰度等级映射后的值=当前亮度比重位置*新的灰度范围(255)

 

cdf[image]基于索引操作利用查找表直接寻找新灰度级,计算高效,计算优化方面后续补充

    void HistormBanlance() {
        for (int bin_idy = 0; bin_idy < ver_div_nums_; ++bin_idy) {
            for (int bin_idx = 0; bin_idx < hor_div_nums_; ++bin_idx) {
                float alpha = ALPHA_A * (1 - exp(-(max_sd_ - sd_bins_[bin_idx][bin_idy])));
                div_img_historm_bins_[bin_idx][bin_idy][0] /= bin_pixel_nums_;
                div_img_map_lut_[bin_idx][bin_idy][0] = alpha * (div_img_historm_bins_[bin_idx][bin_idy][0]  * out_max_) \
                                + (1 - alpha) * (0 * out_max_ / in_max_);
                for (int i = 1; i < in_max_; ++i) {
                    div_img_historm_bins_[bin_idx][bin_idy][i] = div_img_historm_bins_[bin_idx][bin_idy][i] / bin_pixel_nums_\
                                                             + div_img_historm_bins_[bin_idx][bin_idy][i - 1];
                    //if (bin_idy == 0 && bin_idx == 0) {
                    //    printf("%d %f\r\n", i, div_img_historm_bins_[bin_idx][bin_idy][i]);
                    //}
                    div_img_map_lut_[bin_idx][bin_idy][i] = alpha * (div_img_historm_bins_[bin_idx][bin_idy][i]  * out_max_) \
                                + (1 - alpha) * (i * out_max_ / in_max_);
                }
            }
        }
    }