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)

代码解释

  1. zmMinFilterGray函数: 实现最小值滤波,对输入图像进行滤波处理,用于获取暗通道图像。
  2. guidedfilter函数: 实现引导滤波,对输入图像进行滤波处理,用于优化暗通道图像。
  3. getV1函数: 计算大气遮罩图像 V1 和光照值 A。
    • 首先通过计算暗通道图像,然后使用引导滤波优化。
    • 接着通过直方图计算光照值 A。
  4. deHaze函数: 根据得到的遮罩图像和光照值对输入图像进行颜色校正,并进行可选的 gamma 校正。
  5. DarkChannel函数: 主函数,通过读取输入图像,调用 deHaze 函数进行去雾处理,并保存结果。

算法步骤

  1. 计算暗通道图像: 对图像的每个像素点,取其三个颜色通道的最小值,得到暗通道图像。
  2. 引导滤波优化: 使用引导滤波对暗通道图像进行优化,去除噪声和细节,得到更加准确的暗通道图像。
  3. 计算大气光照: 使用暗通道图像的直方图,找到最大累积概率对应的值作为大气光照值。
  4. 计算大气遮罩图像: 使用暗通道图像和大气光照值,计算大气遮罩图像,表示每个像素点受到大气散射的影响程度。
  5. 颜色校正: 使用大气遮罩图像和大气光照值,对图像进行颜色校正,去除大气散射的影响。
  6. 可选的 gamma 校正: 可选的 gamma 校正可以进一步调整图像的亮度和对比度。

代码使用

  1. 将代码保存为 DarkChannel.py 文件。
  2. 将需要去雾的图像放在 figure 文件夹下。
  3. 运行 DarkChannel.py 文件。
  4. 去雾后的图像将保存在 DarkChannel 文件夹下。

这段代码提供了一个简单的图像去雾算法实现,可供参考和学习。你可以根据实际需求进行调整和优化。

Python 图像去雾算法 - DarkChannel.py 实现

原文地址: https://www.cveoy.top/t/topic/bzPJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录