计算机视觉:暗通道去雾算法的原理及python实现

这篇具有很好参考价值的文章主要介绍了计算机视觉:暗通道去雾算法的原理及python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机视觉:暗通道去雾算法的原理及python实现

1.原理

暗通道先验去雾算法是何恺明2009年发表在CVPR上的一篇论文,还获得了当年的CVPR最佳论文

原文链接:IEEE Xplore Full-Text PDF:

本篇论文提出了一种简单但是有效的图像先验条件——暗通道先验法从一幅输入图像中去雾。暗通道先验是一种对于大量户外有雾图像的统计结果,**它最重要的一个观察结果是户外无雾图像的绝大部分区域包含某些像素的亮度值至少在某一个通道上是非常低的。**结合这个先验条件与雾天图像模型,我们可以直接估计雾的厚度并且回复一幅高质量的无雾图像。基于各种各样的有雾图像的实验去雾结果证明了所提出先验条件的有效性。并且,一幅高质量的图像深度图可作为图像去雾的附带产品。

(1)雾图形成模型:

在计算机视觉和计算机图形学中,方程所描述的大气散射模型被广泛使用。参数解释如下:

​ x是图像的空间坐标

​ I(x)代表有雾图像(待去雾图像)

​ J(x)代表无雾图像(待恢复图像)

​ A代表全球大气光值

​ t(x)代表透射率

方程右边第一项为场景直接衰减项,第二项为环境光项。

计算机视觉:暗通道去雾算法的原理及python实现

(2)暗通道的定义

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:

计算机视觉:暗通道去雾算法的原理及python实现

其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

(3) 暗通道先验理论

暗通道先验理论指出:对于非天空区域的无雾图像J(x)的暗通道趋于0,即:

计算机视觉:暗通道去雾算法的原理及python实现

实际生活中造成暗原色中低通道值主要有三个因素:

  1. 汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;
  2. 色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);
  3. 颜色较暗的物体或者表面,例如灰暗色的树干和石头。

总之,自然景物中到处都是阴影或者彩色,这些景物的图像的暗原色总是很灰暗的,而有雾的图像较亮。因此,可以明显的看到暗通道先验理论的普遍性。

计算机视觉:暗通道去雾算法的原理及python实现

(4) 公式变形

根据大气散射模型,将公式稍变形为下式:

计算机视觉:暗通道去雾算法的原理及python实现

假设每一个窗口的透射率t(x)为常数,记为t’(x),并且A值已给定,对式两边同时进行两次最小值运算,可得:

计算机视觉:暗通道去雾算法的原理及python实现

其中,J(x)是要求的无雾图像,根据前述的暗通道先验理论可知:

计算机视觉:暗通道去雾算法的原理及python实现

因此可推导出:

计算机视觉:暗通道去雾算法的原理及python实现

(5) 透射率计算

将上式带入可得到透射率t’(x)的预估值,如下所示:

计算机视觉:暗通道去雾算法的原理及python实现

现实生活中,即便晴空万里,空气中也会存在一些颗粒,在眺望远处的景物时,人们还是能感觉到雾的存在。另外,雾的存在让人们感受到景深,因此在去雾的同时有必要保留一定程度的雾。可以通过引入一个0到1之 间 的 因 子 w(一 般取0.95)对预估透射率进行修正,如式所示:

计算机视觉:暗通道去雾算法的原理及python实现

以上的推导过程均假设大气光值A是已知的,在实际中,可以借助暗通道图从原始雾图中求取。具体步骤如下:

先求取暗通道图,在暗通道图中按照亮度的大小提取最亮的前0.1%的像素
在原始雾图I(x)中找对应位置上具有最高亮度的点的值,作为大气光值A
此外,由于透射率t偏小时,会造成J偏大,恢复的无雾图像整体向白场过度,因此有必要对透射率设置一个下限值t0(一般取值为0.1),当t值小于t0 时,取t=t0。将以上求得的透射率和大气光值代入公式,最终整理得到图像的恢复公式如下:

计算机视觉:暗通道去雾算法的原理及python实现文章来源地址https://www.toymoban.com/news/detail-470434.html

2.python实现

import cv2
import numpy as np
import os


#计算雾化图像的暗通道
def dark_channel(img, size = 15):
    r, g, b = cv2.split(img)
    min_img = cv2.min(r, cv2.min(g, b))#取最暗通道
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))
    dc_img = cv2.erode(min_img,kernel)
    return dc_img

#估计全局大气光值
def get_atmo(img, percent = 0.001):
    mean_perpix = np.mean(img, axis = 2).reshape(-1)
    mean_topper = mean_perpix[:int(img.shape[0] * img.shape[1] * percent)]
    return np.mean(mean_topper)

#估算透射率图
def get_trans(img, atom, w = 0.95):
    x = img / atom
    t = 1 - w * dark_channel(x, 15)
    return t

#引导滤波
def guided_filter(p, i, r, e):
    """
    :param p: input image
    :param i: guidance image
    :param r: radius
    :param e: regularization
    :return: filtering output q
    """
    #1
    mean_I = cv2.boxFilter(i, cv2.CV_64F, (r, r))
    mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r))
    corr_I = cv2.boxFilter(i * i, cv2.CV_64F, (r, r))
    corr_Ip = cv2.boxFilter(i * p, cv2.CV_64F, (r, r))
    #2
    var_I = corr_I - mean_I * mean_I
    cov_Ip = corr_Ip - mean_I * mean_p
    #3
    a = cov_Ip / (var_I + e)
    b = mean_p - a * mean_I
    #4
    mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r))
    mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r))
    #5
    q = mean_a * i + mean_b
    return q




def dehaze(im):

    img = im.astype('float64') / 255
    img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY).astype('float64') / 255
    atom = get_atmo(img)
    trans = get_trans(img, atom)
    trans_guided = guided_filter(trans, img_gray, 20, 0.0001)
    trans_guided = cv2.max(trans_guided, 0.25)
    result = np.empty_like(img)
    for i in range(3):
        result[:, :, i] = (img[:, :, i] - atom) / trans_guided + atom
    return result*255

def dehaze_V2(originPath,savePath):
    '''originaPath:文件夹的路径,图片上一级
       savePath:同理'''
    for image_name in os.listdir(originPath):
        image_path = os.path.join(originPath,image_name)
        im = cv2.imread(image_path)
        img = im.astype('float64') / 255
        img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY).astype('float64') / 255
        atom = get_atmo(img)
        trans = get_trans(img, atom)
        trans_guided = guided_filter(trans, img_gray, 20, 0.0001)
        trans_guided = cv2.max(trans_guided, 0.25)
        result = np.empty_like(img)
        for i in range(3):
            result[:, :, i] = (img[:, :, i] - atom) / trans_guided + atom
        oneSave = os.path.join(savePath,image_name)
        cv2.imwrite(oneSave, result*255)

    # cv2.imshow("source",img)
    # cv2.imshow("result", result)
    
    cv2.waitKey(0)       



if __name__ == '__main__':
    dehaze_V2(r'./input/set1','./output/set1')


到了这里,关于计算机视觉:暗通道去雾算法的原理及python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 计算机视觉 + Self-Supervised Learning 五种算法原理解析

    计算机视觉 + Self-Supervised Learning 五种算法原理解析

    自监督学习是一种机器学习方法,它利用未标记的数据来训练模型,而无需人工标注的标签。相反,自监督学习通过利用数据中的自动生成的标签或任务来训练模型。 现在,让我使用拟人化的方法来解释自监督学习的原理。假设你是一个学习者,而计算机视觉任务是你需要完

    2024年02月11日
    浏览(8)
  • 计算机毕设 python opencv 机器视觉图像拼接算法

    计算机毕设 python opencv 机器视觉图像拼接算法

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月07日
    浏览(13)
  • 计算机视觉教程2-2:详解图像滤波算法(附Python实战)

    图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter) ,其本质是数字窗口上的数学运算。一般用于图像平滑、图像锐化、特征提取(如纹理测量、边缘检测)等,邻域滤波使用邻域算子—— 利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Freque

    2024年02月06日
    浏览(15)
  • 计算机设计大赛 深度学习人脸表情识别算法 - opencv python 机器视觉

    计算机设计大赛 深度学习人脸表情识别算法 - opencv python 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/

    2024年02月21日
    浏览(273)
  • 毕业设计-计算机视觉:刨花板表面小目标缺陷检测系统 人工智能 算法 python

    毕业设计-计算机视觉:刨花板表面小目标缺陷检测系统 人工智能 算法 python

      目录  前言 设计思路 一、课题背景与意义 二、算法理论原理 2.1 自适应空间特征融合模块 2.2 Ghost 模块 三、检测的实现 3.1 数据集 3.2 实验环境搭建 3.3 实验及结果分析 实现效果图样例 最后        📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临

    2024年01月16日
    浏览(25)
  • 计算机竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

    计算机竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

    🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉opencv的手势检测 手势识别 算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 普通机器视觉手势检测的基本流程如下: 其中轮廓的提取,多边形

    2024年02月07日
    浏览(46)
  • 计算机视觉初探--LeNet原理与实践

    LeNet是卷积神经网络(Convolutional Neural Network, CNN)领域的先驱模型,由Yann LeCun等人在1998年提出,被广泛应用于手写数字识别和其他计算机视觉任务。本文将介绍LeNet模型的数学原理,使用PyTorch进行代码实现和实验验证。 卷积是CNN中最重要的操作之一,它可以从输入数据中提

    2024年02月22日
    浏览(10)
  • 计算机视觉之姿态识别(原理+代码实操)

    计算机视觉之姿态识别(原理+代码实操)

    •人体分割使用的方法可以大体分为人体骨骼关键点检测、语义分割等方式实现。这里主要分析与姿态相关的人体骨骼关键点检测。人体骨骼关键点检测输出是人体的骨架信息,一般主要作为人体姿态识别的基础部分,主要用于分割、对齐等。一般实现流程为: •主要检测人

    2023年04月16日
    浏览(9)
  • 图像处理与计算机视觉算法

    图像处理与计算机视觉算法是实现对图像和视频内容分析、理解和操作的一系列技术。这些算法可以分为多个类别,包括但不限于以下几个主要方面: 预处理 : 像素操作:灰度化、二值化、直方图均衡化等,用于改善图像的对比度和亮度分布。 去噪:高斯滤波、中值滤波、

    2024年02月22日
    浏览(12)
  • 计算机视觉--距离变换算法的实战应用

    计算机视觉--距离变换算法的实战应用

    前言: Hello大家好,我是Dream。 计算机视觉CV是人工智能一个非常重要的领域 。 在本次的距离变换任务中,我们将使用 D4距离度量方法 来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算机视觉和图像处理有了更深入的

    2024年02月15日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包