您的位置:首页 > 运维架构

基于暗通道去雾算法的实现与优化(以)opencv在pc上的实现

2018-03-07 06:57 190 查看
注:这一系列的文章是我大四时写的,现在回顾,发现当时的布局和公式实在是太难看了,读者可移步至这里查看舒服的排版github同步博客。点我查看测试样例经过老师推荐,拜读了何恺明博士的暗通道去雾论文《Single Image Haze Removal Using Dark Channel Prior》,这是何发表的第一篇论文,令人惊艳的是该论文一举获得了2009年CVPR的Best Paper奖,三个审稿人都给了何最高分!何的这篇论文以简单,效果近乎完美而出名,主要问题是比较费时,后续有很多人提出了加速的改进,把时间控制在了ms级,从而实现视频去雾;废话不多说了,先来欣赏一下何的论文讲了些啥吧!一 Single Image Haze Removal Using Dark Channel Prior (一) 摘要大意:仔细想想我们可以确定有这样一个统计规律:对于大多数没有雾的图像来说,它的任意一个像素点中的R,G,B值至少有一个是非常低的;(这个挺好理解的,如果R,G,B值都偏高,那么该像素显然有向白色过度的趋势)把每个像素中“偏暗”的值(通道)以一定的方式集合起来就构成了一幅图片的暗通道图;正式基于这样的一个想法和统计的规律(可以把这个统计规律当作一条定理),何等人提出了去雾的算法,该算法在大量的户外有雾图片的应用中得以验证其准确性;并且在去雾的过程中,他们也同时得到了原图的景深图片,因为雾的厚度一定程度上代表了景深。             为了验证上述提到的统计规律,作者对5000张无雾图的暗通道的强度进行了统计,可以发现暗通道图中大部分像素都是0,而且全部像素都集中于0-50之间,可以说暗通道图是稀疏的,这一点对于我们下边的公式推导至关重要。

 (二)去雾过程           首先,在计算机视觉和计算机图形学领域中有一个应用广泛的有雾图片表达公式,如下:

①          其中,I(x)代表待处理的图(雾图),J(X)代表真实的图(无雾图)也就是我们想要得到的图片,t(X)代表透射率,A代表了全局大气光值(global atmospheric light)         接下来我们的整体思路就是求解式①,得到J(X),但是在式①里t(X)和A都是未知的,这可如何是好呀?         别急,我们先看看暗通道的数学定义吧~如下:

②        其中,等式左边即为暗通道图,等式右边:C代表R,G,B中的某一通道,x代表图中某一像素点,Ω(X)代表像素点X周围的小区域;        这个公式的意思可以这样理解:首先取原图每一个像素点中最小的通道值,这样就可以得到一副灰色的图了,然后对这个灰色的图进行最小值滤波(滤波窗口代表了Ω(X))就得到了暗通道图。       下面我们来看看究竟是如何从公式①推出J(X) 的:      首先对①两边进行“取最小”的操作,得:

③    然后等式两边同时除以大气光值A,得:                                         ④      等式两边再次进行“取最小”操作,得:

⑤      在第一部分我们知道:暗通道图是稀疏的,绝大多数元素为零或者趋向于零,好,有了这个认识,我们可以近似的得到如下式子:

⑥      因此,式⑤中t(X)的系数项为零(近似),于是整理可得:

⑦        有了式⑦我们只要求得大气光值A 就可以得到t(X) 了,而得到t(X)之后我们根据式①不救求出J(X)了吗?看似无解的问题就这样解决啦!多亏了暗通道的先验知识。       作者进一步进行了限制,如下:

       与式⑦相比作者增加了参数w,作者认为为了保持图像的真实感需要保留少量的“雾气”,因此w接近于1,论文中w=0.95;       最终的J表达式为:

        作者又进行了一项限制:t(X)不能太小了,因为过小之后图片会出现亮的区域特别亮,暗淡的区域特变暗的情况;论文中的t0=0.1;       到此这篇论文的精髓就介绍完啦,下一篇从opencv c++代码实现的角度进行一些介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: