1.简介。
严格的来说,去雾也是对比度增强的一种。但是用常见的对比度增强以及直方图均衡的算法根本达不到良好的效果。这方面最近比较好的工作就是He kaiming等提出的Dark Channel方法。这篇论文也获得了2009的CVPR最佳论文奖。
文章标题: single Image Haze Removal Using Dark Channel Prior。
2. 暗通道先验的理解
从论文的公式1可以看出,去雾模型和图像抠图在代数方程上是一致的。
简单的说,有雾气的图像I是由清晰图像J与大气光幕A的alpha混合,混合方程如下:
I = alpha * J + A * (1 - alpha)
从上述方程看出,我们在仅仅知道I的前提下,要得到J,这是一个有无穷多个解的问题。
事实上,图像处理的很多问题都是这样,当被规约为简单代数方程之后,都有无穷多个解。
如果我们找到一些对方程中变量的先验分布,则可能得出方程的唯一解。He kaiming等
通过对大量清晰无雾图像的统计发现这样一个事实:
在图像的一个小的区域,至少有一个通道的最小值趋向于零。
而图像中有雾的区域,并不满足这一规律。这个规律就是暗通道先验。
根据这一规律,He kaiming等推导了求解透射率的公式。
简单的说,透射率,其实就是上述方程中的 1- alpha,这个分量。
3. 优化透射率。
作者采用暗通道求反,得到透射率的初步估计。然后,作者根据抠图模型的一篇经典文献:
A Closed Form solution to Nature Image Matting
中采用的方法,逐步求精,优化透射率,消除了透射率的块效应。而对大气光幕的估计,
作者也给出了简单的思路,即直接取暗通道的最大值的99.5%。
事实上,网上已经有matlab代码,但是在求取透射率的时候,没有优化透射率,
所以网上的matlab代码去雾效果与作者的效果相差甚远。
4. 时间复杂度。
算法的效果虽然比以往的算法好很多,但是计算时间很慢。尤其是在优化透射率这一步,
对于640x480的图像,其报道的时间是需要2-3秒的时间。由于去雾是基于快的,其patch
大小为15x15.所以其时间复杂度为O(15*15*M*N)。
5. 其它基于暗通道先验DCP的改进算法。
5.1 基于中值滤波的改进算法(MDCP)
算法效果一般,时间复杂度为O(log(N)),分块并行处理之后可以达到实时。
5.2 基于半求反semi-inverse的快速去雾算法, SIGGRAPH ASIA2010
算法非常简单,能够有效监测雾的区域并有效去雾,已达到实时的要求。
5.3 基于双边滤波的改进算法
这类算法基本上是咱们大陆的同胞搞的,网上有好几篇这方面的文献。由于双边滤波有O(1)时间的快速算法,所以理论上
这类算法比He kaiming的要快很多倍。但是文献中基于双边滤波的算法都要执行两次双边滤波,所以实际上没没有想象中的快。
6. 我的改进方案。
根据其他人改进方案的思路都在优化透射率这一步上使用快速算法,我的改进也是在这一步。我采用一种快速的边缘保持滤波算法,而这种算法只需要执行一次就可以了。当然,这种边缘保持滤波器完全可以用任意一种边缘保持滤波器取代,例如双边滤波。
经过上述改进之后,计算时间的瓶颈在最小值滤波求取暗通道这一步之上,而我经过参数选取,图像patch的大小为3x3而不在是15x15的快。这样最小值滤波的时间小了很多,而基于快的统计指标计算可以把时间复杂度由平方项降为线性时间复杂度。
经过上述两项的算法优化,我的浮点代码在普通PC I3机器上处理一张640x480的彩色图像的时间小于50ms。
7. 实测图片效果