Python 图像去雾算法 - DarkChannel.py 实现
Python 图像去雾算法 - DarkChannel.py 实现
这段代码实现了一种基于 Dark Channel Prior 的图像去雾算法,通过计算图像的暗通道和光照值来得到图像的大气遮罩,并利用引导滤波和颜色校正对图像进行去雾处理。
import cv2
import numpy as np
# 最小值滤波,r是滤波器半径
def zmMinFilterGray(path, r):
zmMinFilterGray = cv2.erode(path, np.ones((2 * r + 1, 2 * r + 1)))
return zmMinFilterGray
# 引导滤波 - 制导图像:I(应为灰度/单通道图像)
# 过滤输入图像:p(应为灰度/单通道图像)
# 局部窗口半径:r
# 正则化参数:eps
def guidedfilter(I, p, r, eps):
height, width = I.shape
mean_I = cv2.boxFilter(I, -1, (r, r))
mean_p = cv2.boxFilter(p, -1, (r, r))
mean_Ip = cv2.boxFilter(I * p, -1, (r, r))
cov_Ip = mean_Ip - mean_I * mean_p
mean_II = cv2.boxFilter(I * I, -1, (r, r))
var_I = mean_II - mean_I * mean_I
a = cov_Ip / (var_I + eps)
b = mean_p - a * mean_I
mean_a = cv2.boxFilter(a, -1, (r, r))
mean_b = cv2.boxFilter(b, -1, (r, r))
q = mean_a * I + mean_b
return q
# 计算大气遮罩图像V1和光照值A, V1 = 1-t/A
# 输入rgb图像,值范围[0,1]
def getV1(m, r, eps, w, maxV1):
V1 = np.min(m, 2) # 得到暗通道图像
V1 = guidedfilter(V1, zmMinFilterGray(V1, 7), r, eps)
# 使用引导滤波优化
bins = 2000
ht = np.histogram(V1, bins) # 计算大气光照A
d = np.cumsum(ht[0]) / float(V1.size)
for lmax in range(bins - 1, 0, -1):
if d[lmax] <= 0.999:
break
A = np.mean(m, 2)[V1 >= ht[1][lmax]].max()
V1 = np.minimum(V1 * w, maxV1) # 对值范围进行限制
return V1, A
def deHaze(m, r=81, eps=0.001, w=0.95, maxV1=0.80, bGamma=False):
Y = np.zeros(m.shape)
# 得到遮罩图像和大气光照
V1, A = getV1(m, r, eps, w, maxV1)
# 颜色校正
for k in range(3):
Y[:, :, k] = (m[:, :, k] - V1) / (1 - V1 / A)
Y = np.clip(Y, 0, 1)
# gamma校正,默认不进行该操作
if bGamma:
Y = Y ** (np.log(0.5) / np.log(Y.mean()))
return Y
def DarkChannel(img):
path = 'figure\'
fn = path + img
m = deHaze(cv2.imread(fn) / 255.0) * 255
cv2.imwrite('DarkChannel/' + img, m)
代码解释
zmMinFilterGray函数: 实现最小值滤波,对输入图像进行滤波处理,用于获取暗通道图像。guidedfilter函数: 实现引导滤波,对输入图像进行滤波处理,用于优化暗通道图像。getV1函数: 计算大气遮罩图像 V1 和光照值 A。- 首先通过计算暗通道图像,然后使用引导滤波优化。
- 接着通过直方图计算光照值 A。
deHaze函数: 根据得到的遮罩图像和光照值对输入图像进行颜色校正,并进行可选的 gamma 校正。DarkChannel函数: 主函数,通过读取输入图像,调用deHaze函数进行去雾处理,并保存结果。
算法步骤
- 计算暗通道图像: 对图像的每个像素点,取其三个颜色通道的最小值,得到暗通道图像。
- 引导滤波优化: 使用引导滤波对暗通道图像进行优化,去除噪声和细节,得到更加准确的暗通道图像。
- 计算大气光照: 使用暗通道图像的直方图,找到最大累积概率对应的值作为大气光照值。
- 计算大气遮罩图像: 使用暗通道图像和大气光照值,计算大气遮罩图像,表示每个像素点受到大气散射的影响程度。
- 颜色校正: 使用大气遮罩图像和大气光照值,对图像进行颜色校正,去除大气散射的影响。
- 可选的 gamma 校正: 可选的 gamma 校正可以进一步调整图像的亮度和对比度。
代码使用
- 将代码保存为
DarkChannel.py文件。 - 将需要去雾的图像放在
figure文件夹下。 - 运行
DarkChannel.py文件。 - 去雾后的图像将保存在
DarkChannel文件夹下。
这段代码提供了一个简单的图像去雾算法实现,可供参考和学习。你可以根据实际需求进行调整和优化。
原文地址: https://www.cveoy.top/t/topic/bzPJ 著作权归作者所有。请勿转载和采集!