基于导向滤波的暗通道先验去雾算法(Python语言,可直接运行)
1 编译环境
编程语言:Python
IDE:PyCharm 2017
2 原理介绍
2.1 暗通道先验
2.1.1 暗通道先验理论与去雾模型
暗通道先验的去雾算法是由何凯明在2009年的CVPR会议上的最佳论文,译文见译文_Single Image Haze Removal Using Dark Channel Prior,何恺明的暗通道先验(dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single Image Haze Removal Using Dark Channel Prior"一举获得2009年CVPR最佳论文。作者统计了大量的无雾图像,发现一条规律:每一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几乎趋向于0。基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法。
作者首先介绍去雾模型如下:
式中I(x)为原图,待去雾图像;J(x)为要恢复的无雾图像;A是大气光成分,t(x)为图像的透光率
。
2.1.2 处理步骤
对成像模型归一化,两边同时除以每个通道的大气光值,得到如下:
准,因此图像恢复的最终公式为:
2.2 导向滤波求t(x)
在原文中,作者提出的为Soft Matting方法求解透射率图t(x),但该方法的致命失误在于计算效率低,速度慢。因此,在2011年,作者又发表论文提出利用导向滤波的方式来求透射率图t(x)。导向滤波步骤如下图:
3 代码
代码如下:
import cv2 as cv
import numpy as np
def zmMinFilterGray(src, r=5):
'''最小值滤波,r是滤波器半径'''
return cv.erode(src, np.ones((2 * r + 1, 2 * r + 1)))
def darkchannel(Image): #计算每个通道中的最小值,输入Image图像,输出最小值img_min
rows,cols,channels=Image.shape
img=np.array(Image)
for i in range(0,rows-1):
for j in range(0,cols-1):
min_rgb = Image[i][j][0]
if min_rgb > Image[i][j][1]:
min_rgb = Image[i][j][1]
elif min_rgb > Image[i][j][2]:
min_rgb = Image[i][j][2