优化的对比度增强算法用于有雾图像的清晰化处理(算法效果是我目前看到最为稳定的,且对天空具有天然的免疫力,极力推荐有需要的朋友研究)

本文主要是介绍优化的对比度增强算法用于有雾图像的清晰化处理(算法效果是我目前看到最为稳定的,且对天空具有天然的免疫力,极力推荐有需要的朋友研究),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop。

转载自:https://www.cnblogs.com/Imageshop/p/3925461.html    侵删

   在未谈及具体的算法流程前,先贴几幅用该算法处理的效果。

  不知道各位对这个算法的效果第一印象如何。

      这个算法的原理来自于文章《Optimized contrast enhancement for real-time image and video dehazing》,作者是韩国人。

      这个算法也是基于大气散射模型:

          

   和现在一些常见的去雾文章有明显的不同的是,这篇文章的并不是基于暗通道原理的,也不是把重点强调在透射率图的细化上,而是提出了一种新的得到粗透射率图的方法。并且文章分别讲到了静态图像和视频图像的去雾,这里我只研究了静态图的去雾。

      对于透射率图,文章提出了一个cost function,这个cost function是基于以下两点考虑的:

      1、对于有雾图像,其整体的对比比较低,因此去雾后的对比度要尽量的高,文中给出了三种测评一幅图像对比度的方式,这里选用的是第一种:

                    

    公式具体的意义可见论文。注意上面的公式都是对去雾图进行的处理。

  2、 由于对比度得到增强,可能会导致部分像素的调整值超出了0和255的范围,这样就会造成信息的损失以及视觉上的瑕疵。因此提出了一个信息量损失的计算公式:

                                                

     一个好的透射率图应该使得总的损失最小:

                                      

       其中Lamda值用于控制对比度和信息损失之间的重要性。

            进行上述过程还有一个重要的前提就是:对于一小块图像,我们认为他的透射率是一样的,以下作者提供的代码表面了这一点:

复制代码

for(nY=0; nY<nHei; nY+=m_nTBlockSize)
{for(nX=0; nX<nWid; nX+=m_nTBlockSize){fTrans = NFTrsEstimationPColor(pnImageR, pnImageG, pnImageB, pnImageRP, pnImageGP, pnImageBP, pfTransmissionP, __max(nX, 0), __max(nY, 0), nWid, nHei);for(nYstep=nY; nYstep<nY+m_nTBlockSize; nYstep++){for(nXstep=nX; nXstep<nX+m_nTBlockSize; nXstep++){pfTransmission[nYstep*nWid+nXstep] = fTrans;}}}
}

复制代码

  其中的NFTrsEstimationPColor是用来估计一个块的最佳透射率值,作者在编程时,是将透射率按照0.1的间距进行取样,然后找到使得上式最小值得那个透射率作为这个块的透射率。

复制代码

nEndX = __min(nStartX+m_nTBlockSize, nWid); // End point of the block
nEndY = __min(nStartY+m_nTBlockSize, nHei); // End point of the blocknNumberofPixels = (nEndY-nStartY)*(nEndX-nStartX);    fTrans = 0.3f;    // Init trans is started from 0.3
nTrans = 427;    // Convert transmission to integer for(nCounter=0; nCounter<7; nCounter++)
{nSumofSLoss = 0;nLossCount = 0;nSumofSquaredOuts = 0;nSumofOuts = 0;for(nY=nStartY; nY<nEndY; nY++){for(nX=nStartX; nX<nEndX; nX++){nOut = ((pnImageY[nY*nWid+nX] - m_nAirlight)*nTrans + 128*m_nAirlight)>>7; // (I-A)/t + A --> ((I-A)*k*128 + A*128)/128nSquaredOut = nOut * nOut;if(nOut>255){nSumofSLoss += (nOut - 255)*(nOut - 255);nLossCount++;}else if(nOut < 0){nSumofSLoss += nSquaredOut;nLossCount++;}nSumofSquaredOuts += nSquaredOut;nSumofOuts += nOut;}}fMean = (float)(nSumofOuts)/(float)(nNumberofPixels);  fCost = m_fLambda1 * (float)nSumofSLoss/(float)(nNumberofPixels) - ((float)nSumofSquaredOuts/(float)nNumberofPixels - fMean*fMean); if(nCounter==0 || fMinCost > fCost){fMinCost = fCost;fOptTrs = fTrans;}fTrans += 0.1f;nTrans = (int)(1.0f/fTrans*128.0f);
}

复制代码

  朋友们有没有看到上面的代码中的最小透射率是0.3,我个人认为这个只能够有效的避免天空部位被过增强。

      文中提到了这个方法也可以看成是何凯明的暗通道去雾算法的一个更广义的定义。

     在这个文章,还提出了另外一个和其他算法不同的东西,就是全局大气光A的获取,其主要原理是: the variance of pixel values is generally low in hazy regions, e.g. sky. 具体的操作流程是:

       we first divide an input image into four rectangular regions. We then define the score of each region as the average pixel value subtracted by the standard deviation of the pixel values within the region. Then, we select the region with the highest score and divide it further into four smaller regions.We repeat this process until the size of the selected region is smaller than a pre-specified threshold. Within the selected region, we choose the color vector, which minimizes the distance ||(R,G,B) -(255,255,255)||as the atmospheric light. By minimizing the distance from the pure white vector(255,255,255), we attempt to choose the atmospheric light that is as bright as possible.

  结合上述描述以及论文配套的代码可以很容易的理解这里的道理。论文的配套代码的实现也很好。

  具体的流程还是请各位仔细的阅读论文及其代码,经过我自己的优化和实践,这个算法确实能得到很不错的效果,在速度上也能够达到实时。

      在贴一些效果图(有的时候只有看到这些图,才很有成就感)。

 

效果测试程序:http://files.cnblogs.com/Imageshop/HazeRemovalBasedonContrastEnhancement.rar

 论文及原作者的代码下载地址:http://mcl.korea.ac.kr/projects/dehazing/#userconsent# (这个源代码是OPENCV写的,估计要配置很久才能顺利运行,我反正没有去弄,只是结合他的论文和代码在自己实现).

这篇关于优化的对比度增强算法用于有雾图像的清晰化处理(算法效果是我目前看到最为稳定的,且对天空具有天然的免疫力,极力推荐有需要的朋友研究)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341669

相关文章

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序