一种消除局部自适应对比度增强算法方块效应的方法 - 爱鱼

mightycode 2021-11-17 原文


一种消除局部自适应对比度增强算法方块效应的方法


一种基于腐蚀膨胀运算实现的局部自适应对比度增强算法中,提出了一种可以分开自适应的调整局部亮部和暗部对比度的方法。但是就象在评论中提到的,这种方法会产生方块效应。特别是在对比度已经比较大的边缘附近,这种方块效应会比较明显。这是因为在边缘附近,对比度本来就是比较大的,偏均方差也就相应的比较大。那么调整的时候给出自适应的调整量就会相应地变小。一旦离开边缘附近,领域不包括边缘,对比度就会相对陡然变小,那么自适应的调整量就会相应变大。那么在边缘同一侧就可能会比较明显地出现不均匀的变化,也就是我们所说的方块效应。不均匀变化的位置离边缘的位置之间的距离就是所使用的高光半径或者暗影半径大小。

看一下示例。这里为了明显显示方块效应,选择了一张前景和背景反差比较大的图片。同时这里我特意把高光半径和暗影半径选的不一样,这样我们就可以看到在不同半径的地方有两个明显的不均匀变化。

原始图片  

                                      原始图片(1024×701)                           高光半径100,高光数量30,暗影半径50,暗影数量30,产生方块效应

消除方块效应的办法,一个是在做完对比度调整后,再做一个高斯模糊之类的低通滤波平滑这种不均匀。这种方法不可避免地会减小图像整体清晰度。另一个简单的应对方法是,扩大所使用的领域。领域越大,包含像素越多,那么移动领域时对比度变化幅度就不会特别剧烈(即使在边缘附近),这样使得调整量的变化幅度也会大幅减少,极大地减少了方块效应。但同时,领域的扩大,也使得不同像素的领域不管是腐蚀还是膨胀结果都更加趋同,失去了所谓的局部自适应的效果。极限情况我们想象一下,如果领域半径接近甚至超过图像大小,那么所有像素的腐蚀或者膨胀结果都是一样的了。那么自适应调整量也就都一样了,那就是一个全局的调整量了。

那么有没有一种方法既能减小方块效应,又避免这些副作用呢?方块效应产生的根源是在图像边缘附近对比度的变化过大导致的。那是否能过滤这种变化呢?这让我想到了有保边效果的选择性平滑所使用的方法。比如选择性均值平滑,不是把领域内的所有像素一起求平均值,而是选择领域内和中心像素的差值小于一定阈值的所有像素求平均值。假设在领域内有一个边缘,如果设定合适的阈值,就能把和中心像素在边缘另一侧的像素都排除掉,只使用和中心像素同侧的像素参与计算,结果既保留了边缘,也起到了平滑效果。如果应用这种思想,在计算自适应调整量时,具体就是在计算膨胀或腐蚀结果的偏方差的时候,只选择和膨胀或腐蚀结果像素差值小于一定阈值的像素参与计算偏方差,理论上应该就能消除方块效应了。

原理上来说和原始方法没有大的区别,就是需要多设置一个阈值

  • 膨胀腐蚀计算时也是选择性的,选择领域内和中心像素差值小于阈值的所有像素中的最大值(膨胀)和最小值(腐蚀)。
  • 计算偏方差也是选择性的,选择领域内和中心像素差值小于阈值的所有像素参与计算。公式是一样的,只是求和不是所有像素总数n。

剩下的其他步骤都是一样的。

如何计算选择性膨胀腐蚀,还有选择性偏方差的方法也是一个问题。其中需要计算领域极值,均值和平方均值。原始算法是用积分图来计算领域平方和和领域和,现在选择性求和,积分图不再适用了。在选择性平滑方法中经常使用的是O(1)复杂度的领域直方图更新算法,原始论文可以在Median Filtering in Constant Time找到。我们在这里也可以用它,它的计算量基本和领域半径无关。而且使用领域直方图更新算法,可以计算多种选择性领域值,比如平均值,中值,极值,平方和均值,还可以应用表面模糊算法,局部直方图均衡等等。领域直方图更新算法的主要思想是,计算领域内所有像素直方图。当我们从左到右,从上到下移动时,每次移动更新一次领域直方图。更新时减去移出领域的所有像素的直方图,加上新进入领域的所有像素的直方图,这只需要较少的计算量。具体的为加快计算,还保持更新和领域高度相同的所有列的直方图,这样更新领域直方图时,只需加减相应的列直方图即可。具体算法这里不多做讨论了。

有了领域直方图,就可以很简单地计算选择性平均值和平方和均值。如下代码计算选择性均值。选择性平方和均值,还有极值也很简单。

{
    /* int cen: 中心像素
    * int threshold: 阈值
    * Hist[]: 领域直方图
    */
    int l;
    unsigned long weight = 0, sum = 0;
    int low, high;
    low = cen - threshold;
    if (low < 0) low = 0;
    high = cen + threshold;
    if (high > 255) high = 255;
    for (l = low; l <= high; l++)
    {
        sum += Hist[l] * l;
        weight += Hist[l];
    }
    return sum / weight;
}

选择性计算领域均值

 对于高光调整计算,一次直方图更新算法可以得到选择性平方和均值,均值和最小值。再做一次直方图更新算法可以得到暗影调整所需的值。如果高光和暗影半径是一样的话,只需要一次直方图更新算法就可以得到高光暗影调整所有需要的结果。再遍历一次图像,应用到所有像素即可。

看一下效果。无阈值相当于领域内所有像素都参与计算,如前所述会产生方块效应。保持高光和暗影半径不变,随着阈值减小,方块效应也会减小,达到我们希望的结果了。

原始图片   

                                        原始图片(1024×701)                                高光半径100,高光数量30,暗影半径50,暗影数量30,无阈值

  

高光半径100,高光数量30,暗影半径50,暗影数量30,阈值50        高光半径100,高光数量30,暗影半径50,暗影数量30,阈值10

分享一个测试程序https://files.cnblogs.com/files/mightycode/edcontrast.7z,需要安装vc++ 2015-2019 redistributable。

posted on
2021-01-06 11:16 
爱鱼 
阅读(461
评论(1
编辑 
收藏 
举报

 

版权声明:本文为mightycode原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mightycode/p/14009987.html

一种消除局部自适应对比度增强算法方块效应的方法 - 爱鱼的更多相关文章

  1. session的工作原理(转载) – CodeShark

    session的工作原理(转载) session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也 […]...

  2. 使用Aspose.Words组件给word加水印 – itjeff

    使用Aspose.Words组件给word加水印 使用Aspose.Words组件给word加水印 1 2 3 […]...

  3. “三合一”Web应用App.bg:Instagram + Foursquare + Twitter

    “三合一”Web应用App.bg:Instagram + Foursquare + Twitter 2011- […]...

  4. 单因素方差分析 – YUANya

    单因素方差分析 单因素方差分析: 5个不同品种猪的育肥试验,采用完全随机设计。后期30天增重(kg)如下表所示 […]...

  5. Redis 6.0 新增功能 – ACL

    Redis 6.0 ACL 期待已久的ACL终于来了,大家知道在redis集群中只有一个db,在多项目操作时可 […]...

  6. Linux + .net core 开发升讯威在线客服系统:首个经过实际验证的高性能版本

    我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享,后来我 […]...

  7. IPv6地址测试宏 – soldierback

    IPv6地址测试宏 发表于 2019-04-22 07:41  soldierback  阅读(443)  评 […]...

  8. Android 性能优化 —- 内存优化

    1、Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存 […]...

随机推荐

  1. 大数据主导的七大领域,看看你是否身处其中 – 金色小蜜蜂

    大数据主导的七大领域,看看你是否身处其中   大数据主导的七大领域,看看你是否身处其中   在《大数据:一场改 […]...

  2. Twitter分布式自增ID算法snowflake原理解析

    以JAVA为例   Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Lon […]...

  3. 教你如何隐藏磁盘分区?

    方案一: .右键单击”我的电脑”。 2.打开:管理-磁盘管理。 3.在右边出现的磁盘分 […]...

  4. 以Python角度学习Javascript(一) 五句话搞定JavaScript作用域:http://www.cnblogs.com/wupeiqi/p/5649402.html

    记忆如沙指尖过,叹如果,何为如,何为果? 花季,风碾过,零落一地寂寞,谁明身该如何,土也湮没,雨坐,重刷遗地的 […]...

  5. 微服务之分布式文件系统

    背景 传统Web应用中所有的功能部署在一起,图片、文件也在一台服务器;应用微服务架构后,服务之间的图片共享通过 […]...

  6. 机器视觉开源代码集合[转]

    转自:http://www.ihalcon.com/read-3733.html   一、特征提取Featur […]...

  7. js上传图片

    前端上传图片的原理是:运用input type=“file”的标签获取图片,再使用FileReader这个对象 […]...

  8. 同一台机器配置多个tomcat服务器

    前提,目前有2个tomcat,tomcat、tomcat11。 1.先在环境变量中增加CATALINA-HOM […]...

展开目录

目录导航