点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

1.前言

今天为大家带来一篇之前看到的用于单幅图像去雾的算法,作者来自清华大学,论文原文见附录。

2.雾天退化模型

在计算机视觉领域,通常使用雾天图像退化模型来描述雾霾等恶劣天气条件对图像造成的影响,该模型是McCartney首先提出。该模型包括衰减模型和环境光模型两部分。模型表达式为:

其中,是图像像素的空间坐标,是观察到的有雾图像,是待恢复的无雾图像,表示大气散射系数,代表景物深度,是全局大气光,通常情况下假设为全局常量,与空间坐标无关。

公式(1)中的表示坐标空间处的透射率,我们使用来表示透射率,于是得到公式(2):

由此可见,图像去雾过程就是根据求解的过程。要求解出,还需要根据求解出透射率和全局大气光。实际上,所有基于雾天退化模型的去雾算法就是是根据已知的有雾图像求解出透射率和全局大气光。

对于暗通道去雾算法来说,先从暗原色通道中选取最亮的0.1%比例的像素点,然后选取原输入图像中这些像素具有的最大灰度值作为全局大气光值。RGB三通道中每一个通道都有一个大气光值。

然后根据公式(2)可以得出:

首先可以确定的是的范围是,的范围是,的范围是。和是已知的,可以根据的范围从而确定的范围。已知的条件有:

根据(4)和(5)推出:

因此初略估计透射率的计算公式:

最后为了保证图片的自然性,增加一个参数来调整透射率 :

好了,上面复习完了何凯明博士的暗通道去雾,我们一起来看看清华大学这篇论文。

3.算法流程

算法流程

实际上有了这个算法流程就可以写出代码了,不过为了加深理解可以看下面的一些推导。

4.一些推导

我们知道去雾的步骤主要就是估计全局大气光值和透射率,因此,本文就是根据输入图像估计和(这篇论文使用了来代替),然后根据雾天退化模型求取去雾后的图像。

4.1 估计透射率t(x)

从第二节的介绍我们知道

然后这篇论文使用了来代替,即:

我们取三个通道的最小值并记为:

所以公式2变换为

对公式(4)右边进行均值滤波:

其中代表均值滤波的窗口大小,表示像素的的邻域。

均值滤波后的结果可以反映的大致趋势,但与真实的还差一定的绝对值,因此,我们先得出透射率的粗略估计值:

其中,因此。

为了防止去雾后图像出现整体画面偏暗,这里根据图像的均值来调整,即:

其中是中所有元素的均值,是调节因子。

因此可以得到透射率的计算公式:

结合公式(1)推出:

4.2 估计全球大气光值

公式(5)中第一个等式左侧的表达式取值范围为,由此得出

一般情况下又存在

(KaiMing He的暗通道先验理论)。这样就初步确定了全局大气光的范围,为了能快速获取全局大气光,文章直接取两者的平均值作为全局大气光值,即:

...(9)。

然后大气光值和都搞定了,那么带入算法流程中的最后一个公式就可以获取最后的图像了。

5.代码实现

下面是代码实现。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace cv;
using namespace std;int getMax(Mat src) {int row = src.rows;int col = src.cols;int temp = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {temp = max((int)src.at<uchar>(i, j), temp);}if (temp == 255) return temp;}return temp;
}Mat dehaze(Mat src) {double eps;int row = src.rows;int col = src.cols;Mat M = Mat::zeros(row, col, CV_8UC1);Mat M_max = Mat::zeros(row, col, CV_8UC1);Mat M_ave = Mat::zeros(row, col, CV_8UC1);Mat L = Mat::zeros(row, col, CV_8UC1);Mat dst = Mat::zeros(row, col, CV_8UC3);double m_av, A;//get Mdouble sum = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {uchar r, g, b, temp1, temp2;b = src.at<Vec3b>(i, j)[0];g = src.at<Vec3b>(i, j)[1];r = src.at<Vec3b>(i, j)[2];temp1 = min(min(r, g), b);temp2 = max(max(r, g), b);M.at<uchar>(i, j) = temp1;M_max.at<uchar>(i, j) = temp2;sum += temp1;}}m_av = sum / (row * col * 255);eps = 0.85 / m_av;boxFilter(M, M_ave, CV_8UC1, Size(51, 51));double delta = min(0.9, eps*m_av);for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {L.at<uchar>(i, j) = min((int)(delta * M_ave.at<uchar>(i, j)), (int)M.at<uchar>(i, j));}}A = (getMax(M_max) + getMax(M_ave)) * 0.5;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {int temp = L.at<uchar>(i, j);for (int k = 0; k < 3; k++) {int val = A * (src.at<Vec3b>(i, j)[k] - temp) / (A - temp);if (val > 255) val = 255;if (val < 0) val = 0;dst.at<Vec3b>(i, j)[k] = val;}}}return dst;
}int main() {Mat src = imread("F:\\fog\\1.jpg");Mat dst = dehaze(src);cv::imshow("origin", src);cv::imshow("result", dst);cv::imwrite("F:\\fog\\res.jpg", dst);waitKey(0);return 0;
}

6.结果

原图1

结果图1

原图2

结果图2

原图3

结果图3

原图4

结果图4

原图5

结果图5

7.结论

算法里面有2个参数可以自己调节,滤波的半径和。具体如何调节?我就不放在这里说了,这个算法后面会在我的新专题里面进行一遍优化,到时候再来回答这个问题。如果你迫切需要这个算法的实现或者对它感兴趣,可以自己尝试调整这两个参数获得想要的效果。这里的均值滤波也可以换成我们之前讲的Side Window Filter说不定可以获得更好的效果。

8.参考

  • https://blog.csdn.net/u013684730/article/details/76640321

  • https://www.cnblogs.com/Imageshop/p/3410279.html

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

《基于单幅图像的快速去雾》原理与C++复现(有一定工程意义)相关推荐

  1. 【论文阅读】基于单幅图像的快速去雾

    基于单幅图像的快速去雾 刘倩, 陈茂银, 周东华 第25届中国控制与决策会议论文集. 2013. 本文提出了一种基于均值滤波的去雾算法,算是后续多种基于均值滤波去雾算法的鼻祖.虽然本文于2013提出, ...

  2. 基于单幅图像的快速去雾算法实现

    清华大学,刘倩,基于单幅图像的快速去雾算法(知网上可以找到2013年的文章). 此方法过程: matlab实现的算法: I=imread('tiananmen.jpg') figure imshow( ...

  3. OpenCV图像处理专栏十七 | 清华大学《基于单幅图像的快速去雾》C++复现(有一定工程意义)

    代码开源在 https://github.com/BBuf/Image-processing-algorithm,感兴趣给我来个星星呗. 1. 前言 这是OpenCV图像处理算法朴素实现专栏的第17篇 ...

  4. 基于快速去雾的图像亮度增强方法

    起因 最近在做一个图像处理的算法,因为图像太暗,所以需要对图像的亮度进行增强(不考虑噪声的放大).尝试了网上搜索到的各种方法后,发现它们存在两个问题:容易造成原本较亮的地方过曝,并且参数不好设置.尝试 ...

  5. 图像和视频的快速去雾算法研究

    王昕, 孙莹莹, 李影昉. 图像和视频的快速去雾算法研究[J]. 影像科学与光化学, 2016, 34(1): 82-87.   WANG Xin, SUN Yingying, LI Yingfang ...

  6. 基于单幅图像的2D转3D算法研究(转)

    原文地址:https://blog.csdn.net/trent1985/article/details/14449567 最近,3D影片盛行,3D电视技术也层出不穷,3D技术在带给大家非凡的视觉冲击 ...

  7. 基于单幅图像的2D转3D算法研究

    最近,3D影片盛行,3D电视技术也层出不穷,3D技术在带给大家非凡的视觉冲击同时,也在告诉大家这背后隐藏了太多的商机. 目前的3D技术大体分为两种:软件技术和硬件技术.所谓硬件技术就是在拍摄影片时采用 ...

  8. PMS-Net: Robust Haze Removal Based on Patch Map for Single Images(基于单幅图像贴图的稳健除雾)

    简介: 本文提出了一种新的基于斑块图的雾霾去除算法.传统的基于补丁的雾霾去除算法(例如,暗通道优先)通常以固定的补丁大小执行去雾.然而,它可能会导致一些问题,如过饱和和颜色失真.因此,在本文中,我们设 ...

  9. 基于单幅图像一致性学习的弱光视频增强(CVPR2021)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨图灵智库 来源丨 泡泡机器人SLAM 编辑丨3D视觉工坊 标题: Learning Tempor ...

最新文章

  1. 报告:2019-2025年,全球数据中心年复合增长率将超过7%
  2. hive 动态分区实现 (hive-1.1.0)
  3. java的字节码无法显示_【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法...
  4. 【java】java 并发编程 CyclicBarrier 源码分析
  5. php获取表单元素的值,PHP如何获取表单提交的数据
  6. 提取lbp特征java代码_特征提取算法之LBP
  7. el table 固定表头和首行_再谈table组件:固定表头和表列
  8. 华为HCIE-CloudComputing备考笔记-2021.10
  9. 天津大学仁爱学院计算机科学与技术学费,天津大学仁爱学院计算机科学与技术专业2016年在山西理科高考录取最低分数线...
  10. cat6 万兆_干货:CAT5E超五类、CAT6和CAT6A超六类布线系统性能和应用上的区别
  11. IBM车库创新:为科技创新头号工程打造共创引擎
  12. 业务日志告警如何做?
  13. 微信分享解决wx not defined
  14. 大数据学习中虚拟机准备工作(centos基础配置)
  15. 【MySQL 第五天 图形管理工具 MySQLWorkbench 图形化管理工具SQLyog】
  16. 一个人可以办几张电话卡?
  17. 好消息|2、4、7号线北延段工程获江苏省发改委批复
  18. IND-gyc-第三周
  19. 请问:俱乐部有多少人?
  20. Linux下的zmq编译,ZeroMQ编译安装使用教程

热门文章

  1. 天下武功,唯快不破,论推荐系统的“实时性”
  2. 从流感预测到智能决策,深度学习能帮企业做哪些事?
  3. 一文看懂深度学习发展史和常见26个模型
  4. 算法面试经常需要你手写的三个排序算法(Python语言)
  5. Google发布“多巴胺”开源强化学习框架,三大特性全满足
  6. Kirito 的博客崩了,这次是因为...
  7. 高速流水线,Jenkins Shared Pipeline
  8. Linux内存、Swap、Cache、Buffer详细解析
  9. PageHelper 在 Spring Boot + MyBatis 中合理且规范的使用方法
  10. start.aliyun.com 正式上线!极速构建 Spring Cloud 应用