基于导向滤波的暗通道先验去雾算法(Python语言,可直接运行)

  • 1 编译环境
  • 2 原理介绍
    • 2.1 暗通道先验
      • 2.1.1 暗通道先验理论与去雾模型
      • 2.1.2 处理步骤
    • 2.2 导向滤波求t(x)
  • 3 代码
  • 4 处理结果
    • 4.1 第一组结果及其比较,暗通道图![在这里插入图片描述](https://img-blog.csdnimg.cn/20190801162445783.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI4MDA1OTA1,size_16,color_FFFFFF,t_70)
    • 4.2 第二组结果及其比较,暗通道图
    • 4.3 原图(自取)
  • 5 需要注意的是

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 npdef 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]for c in range(channels):img[i][j][c] = min_rgb
return imgdef min_filter(Image,r):                # 最小值滤波,输入最小值图像,在2*r+1的矩形窗口内寻找最小值
rows, cols, channels = Image.shape    # 输出为暗通道图像
img = np.array(Image)
for i in range(0, rows):for j in range(0, cols):for c in range(0, channels):if i == 0 or j == 0 or i == rows - 1 or j == cols - 1:img[i][j][c] = Image[i][j][c]elif j == 0:img[i][j][c] = Image[i][j][c]else:min = 255for m in range(i - r, i + r):         # 寻找像素点(i,j)为中心的5*5窗口内的每个通道的最小值for n in range(j - r, j + r):if min > Image[m][n][c]:min = Image[m][n][c]img[i][j][c] = min
return imgdef guided_filter(Image,p,r,eps):     # 基于导向滤波进行暗通道图像的变换
#Image归一化之后的原图,p最小值图像,r导向滤波搜索范围,eps为惩罚项,输出导向滤波后的图像
# q = a * I + b
mean_I = cv.blur(Image, (r, r))  # I的均值平滑
mean_p = cv.blur(p, (r, r))  # p的均值平滑
mean_II = cv.blur(Image*Image, (r, r))  # I*I的均值平滑
mean_Ip = cv.blur(Image*p, (r, r))  # I*p的均值平滑
var_I = mean_II - mean_I * mean_I  # 方差
cov_Ip = mean_Ip - mean_I * mean_p  # 协方差
a = cov_Ip / (var_I +eps)
b = mean_p - a *mean_I
mean_a = cv.blur(a, (r, r))  # 对a、b进行均值平滑
mean_b = cv.blur(b, (r, r))
q = mean_a*Image + mean_b
return qdef select_bright(Image,img_origin,w,t0,V):          #计算大气光A和折射图t
#输入:Image最小值图像,img_origion原图,w是t之前的修正参数,t0阈值,V导向滤波结果
rows,cols,channels=Image.shape
size=rows*cols
order = [0 for i in range(size)]
m = 0
for t in range(0,rows):for j in range(0,cols):order[m] = Image[t][j][0]m = m+1
order.sort(reverse=True)
index =int(size * 0.001) #从暗通道中选取亮度最大的前0.1%
mid = order[index]
A = 0
img_hsv = cv.cvtColor(img_origin,cv.COLOR_RGB2HLS)
for i in range(0,rows):for j in range(0,cols):if Image[i][j][0]>mid and img_hsv[i][j][1]>A:A = img_hsv[i][j][1]
V = V * w
t = 1 - V/A
t = np.maximum(t,t0)
return t,Adef repair(Image,t,A):
rows, cols, channels = Image.shape
J = np.zeros(Image.shape)
for i in range(0,rows):for j in range(0,cols):for c in range(0,channels):t[i][j][c] = t[i][j][c]-0.25 # 不知道为什么这里减掉0.25效果才比较好J[i][j][c] = (Image[i][j][c]-A/255.0)/t[i][j][c]+A/255.0
return J
img = cv.imread('deHaze\\haze.bmp')
img_arr=np.array(img/255.0)                     #归一化
img_min=darkchannel(img_arr)         #计算每个通道的最小值
img_dark=min_filter(img_min,2)       #计算暗通道图像
img_guided=guided_filter(img_arr,img_min,r=75,eps=0.001)
t,A=select_bright(img_min,img,w=0.95,t0=0.1,V=img_guided)
dehaze=repair(img_arr,t,A)
cv.imshow('Origin',img)
cv.imshow('darkchannel',img_dark)
cv.imshow('dehaze',dehaze)
cv.waitKey()
cv.destroyAllWindows()

4 处理结果

4.1 第一组结果及其比较,暗通道图

暗通道图像

4.2 第二组结果及其比较,暗通道图


暗通道图

4.3 原图(自取)


5 需要注意的是

从结果来看,去雾效果不是特别好,需要调整代码中的参数不断调试,以达到最优的去雾效果。

基于导向滤波的暗通道先验去雾算法(Python,可直接运行)相关推荐

  1. 暗通道先验去雾算法介绍及其几何意义的解释过程

    何恺明的暗通道先验(dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single Image Haze Removal Using Dark C ...

  2. 图像去雾算法--暗通道先验去雾算法

    图像去雾: 在雾天拍摄的图像容易受雾或霾的影响,导致图片细节模糊.对比度低以至于丢失图像重要信息,为解决此类问题图像去雾算法应运而生.图像去雾算法是以满足特定场景需求.突出图片细节并增强图片质量为目的 ...

  3. [Python图像识别] 四十六.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  4. 基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

    ❤️欢迎订阅<从实战学python>专栏,用python实现爬虫.办公自动化.数据可视化.人工智能等各个方向的实战案例,有趣又有用!❤️ 更多精品专栏简介点这里 治愈生活的良方 就是保持对 ...

  5. 暗通道先验去雾实现过程分析

    经典去雾算法-何凯明09年提出暗通道先验去雾(Single Image Haze Removal Using Dark Channel Prior) 暗通道去雾公式:I(x) = f(x)*t(x) ...

  6. MATLAB暗原色先验去雾算法的一些认识

    1.课题介绍 本文首先简单介绍基于暗原色先验去雾算法,然后总结出各变量的求解,最后利用已知程序检验算法的效果. 引言:在雾天时,由于空气中大量悬浮粒子的散射和吸收作用,使得光学成像对比度降低,颜色偏灰 ...

  7. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影

    点击上方"小白学视觉",选择加"星标"或"置顶"重磅干货,第一时间送达 一. Sea Thru:海底图像修复 我想很多朋友一定看过海底的各种 ...

  8. 50. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  9. c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...

    前言 对于光照不均匀的图像,用通常的图像分割方法不能取得满意的效果.为了解决这个问题,论文<一种基于亮度均衡的图像阈值分割技术>提出了一种实用而简便的图像分割方法.该方法针对图像中不同亮度 ...

最新文章

  1. android中文字中间有超链接的实现方法
  2. (android)system ui 内存优化
  3. ansible调用callbacks插件实现结果nosql输出回调
  4. Android_NetWork_Test
  5. 比特币的超能力:永恒不变
  6. ADC128S022的verilog设计与仿真实现
  7. 【Java学习笔记之十五】Java中的static关键字解析
  8. linux标准i o实例,9.3. 一个 I/O 端口例子
  9. CSS自学笔记(15):CSS3多列布局
  10. php微信段子,年度挤进前十名的微信段子,笑死了
  11. 定期删除30天以前的elasticsearch的日志
  12. “快易需求系统”数据库设计心得
  13. b 站视频下载神器合集,支持电脑和手机端
  14. 排序算法lowB三人组
  15. UOS无法使用无线网络
  16. 从阿尔法元到人工智能会取代你的工作吗?
  17. 工商总局网监司给阿里发白皮书?一块神奇的里程碑
  18. 哨兵3B 地表温度产品 ENVI打开
  19. 为什么要学习微信小程序直播开发?最新的小程序直播介绍和优势分析!
  20. 牛客网 剑指Offer,一些值得记住的小题(五)

热门文章

  1. PC端跳转QQ、企业微信、微信界面
  2. 圆柱体的投影特点_机械制图常识:圆柱体
  3. Canvas制作简易涂鸦板
  4. php计算产检时间,预产期计算器 孕期计算器 怀孕孕周期表 产检时间日历 怎么算预产期计算公式...
  5. windows 10修改host,有效解决权限问题,请惠存
  6. C语言-输出最长单词
  7. 三张图解释静态NAT、动态NAT、PAT
  8. html+css新手入门:圆角的使用方法详情,常见工作场景;
  9. 软件工程实践结对作业一
  10. html创建电子邮件链接教程