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

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

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

这个算法的原理来自于文章《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 block

nNumberofPixels = (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)/128
            nSquaredOut = 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 ?rst divide an input image into four rectangular regions. We then de?ne 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-speci?ed 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

****************************基本上我不提供源代码,但是我会尽量用文字把对应的算法描述清楚或提供参考文档************************

*************************************因为靠自己的努力和实践写出来的效果才真正是自己的东西,人一定要靠自己*******************

****************************作者: laviewpbt   时间: 2014.8.20    联系QQ:  33184777 转载请保留本行信息**********************

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

时间: 2024-08-04 18:40:19

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

用于图像去雾的优化对比度增强算法

图像去雾哪家强?之前我们已经讨论过了著名的基于暗通道先验的图像去雾(Kaiming He, 2009)算法,如果你用兴趣可以参考: 暗通道优先的图像去雾算法(上) 暗通道优先的图像去雾算法(下) 此外,网上也有很多同道推荐了一篇由韩国学者所发表的研究论文<Optimized contrast enhancement for real-time image and video dehazing>(你也可以从文末参考文献[1]给出的链接中下载到这篇经典论文),其中原作者就提出了一个效果相当不错的图

静态频繁子图挖掘算法用于动态网络——gSpan算法研究

摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的和人工智能领域内的研究热点.数据集中的频繁模式作为一种有价值的信息,受到了人们的广泛关注,成为了数据挖掘技术研究领域内的热门话题和研究重点. 传统的频繁模式挖掘技术被用来在事务数据集中发现频繁项集,然而随着数据挖掘技术应用到非传统领域,单纯的事务数据结构很难对新的领域的数据进行有效的建模.因此,频繁

[blogs 算法原理 ]局部标准差实现对比度增强

基于“局部标准差”的图像增强(原理.算法.代码) 一.理论 图像增强算法的基本原则是“降低低频区域,突出高频区域”,以此强化边缘,达到增强的目的.最简单的例子就是通过原始图像减去高斯模糊处理后的图像,就能够将边缘强化出来. 直方图均衡化也是一种非常常见的增强方法.但是为了避免背景的干扰,更倾向于采用“局部”方法进行处理.我们这里着重研究自适应对比度增强(ACE)的相关内容. ACE的定义和原理(TODO) ACE算法的相关内容: 计算低频成分: 对于具体的像素,一般可以通过计算以该像素为中心的局

opencv----彩色图像对比度增强

图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法. 直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法. 直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现; 直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强. 1.直方图拉伸 就是扩大将图像灰度的域值的一个过程,但是经常是基于灰度图像进行处理,以前在MATlab上对比度增强调用直方图函数就几

算法复杂度,及三种主要排序算法的研究

一.时间复杂度 1.时间频度  T(n),n为问题的规模 即--算法中语句的执行次数.又叫语句频度. 2.时间复杂度 记作 O( f(n) ),这里的f(n)是一个T(n)的同数量级函数. 如O(1)表示算法的语句执行次数为一个常数,不随规模n的增长而增长: 又如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同, 但时间复杂度相同,都为O(n^2). 3.算法的性能 主要用算法的 时间复杂度 的数量级来评价一个算法的时间性能. 二.空间复杂度 S(n),包括3方面: 1.算

视觉SLAM之RANSAC算法用于消除图像误匹配的原理

在基于特征点的视觉SLAM中,通常情况下,在特征匹配过程中往往会存在误匹配信息,使得计算获取的位姿精度低,易产生位姿估计失败的问题,因此,剔除这些错配点有很大的必要性.常会用到RANSAC算法进行消除两两匹配图像的误匹配点,如果只停留在应用的层面上很简单,直接调用opencv函数就行,看到效果时,感觉好神奇,到底怎么实现的啊,以前一直也没弄太明白,与图像结合的博客也比较少,在查阅了一些资料后,笔者似乎明白了一点,希望笔者的总结会对您的理解有帮助. 首先先介绍一下RANSAC算法(RANdom S

利用图像的直方图进行对比度增强的方法

一般情况下,二值图像的灰度值等级是21 =2(0\1),灰度图像的灰度值等级是28=256(0-255), 对于灰度图像来说,灰度值集中在较低的级别时,图像较暗,反之,则较亮,且灰度值分布较均匀时,图像的对比度也会比较明显. 1.图像直方图的计算方法 对于灰度图像,图像的灰度值等级为256,将从0到255的每一个灰度等级对应在图像中的像素点的个数统计出来,然后,通过计算统计个数与整幅图像对应像素点的总个数的比值得到每一个灰度值等级在图像中出现的概率密度值,将灰度等级作为自变量,在图像中出现的概率

Partition算法及Partition算法用于快速排序

JavaScript简单方便,所以用JavaScript实现,可以在Chrome控制台下观察运行结果.主要实现Partition算法,比如输入为   var array = [4, 2, 1, 3, 6, 8, 9, 7, 5];   partition(array, 0, 8); 那么按照array[0]即4进行划分,结果为 [3, 2, 1, 4, 6, 8, 9, 7, 5] ?1. [代码][JavaScript]代码 // 先来看Partition算法,Partition算法是快速排序

用于字符串拼接,字符串重合度以及偏移量算法

为了解决DNA序列的拼接以及检错,特写一下算法 package my.dna; /** * * @author mabixiang * */ public class Util2 { public static void main(String[] args) { String a = "lkjhgfasd"; String b = "sd5sflk"; resemble(a,b); } public static void resemble(String one,