何凯明博士的去雾文章和算法实现已经漫天飞了,我今天也就不啰里啰唆,直接给出自己python实现的完整版本,全部才60多行代码,简单易懂,并有简要注释,去雾效果也很不错。

在这个python版本中,计算量最大的就是最小值滤波,纯python写的,慢,可以进一步使用C优化,其他部分都是使用numpy和opencv的现成东东,效率还行。

  1. import cv2
  2. import numpy as np
  3.  
  4. def zmMinFilterGray(src, r=7):
  5. '''最小值滤波,r是滤波器半径'''
  6. '''if r <= 0:
  7. return src
  8. h, w = src.shape[:2]
  9. I = src
  10. res = np.minimum(I , I[[0]+range(h-1) , :])
  11. res = np.minimum(res, I[range(1,h)+[h-1], :])
  12. I = res
  13. res = np.minimum(I , I[:, [0]+range(w-1)])
  14. res = np.minimum(res, I[:, range(1,w)+[w-1]])
  15. return zmMinFilterGray(res, r-1)'''
  16. return cv2.erode(src, np.ones((2*r+1, 2*r+1))) #使用opencv的erode函数更高效
  17. def guidedfilter(I, p, r, eps):
  18. '''引导滤波,直接参考网上的matlab代码'''
  19. height, width = I.shape
  20. m_I = cv2.boxFilter(I, -1, (r,r))
  21. m_p = cv2.boxFilter(p, -1, (r,r))
  22. m_Ip = cv2.boxFilter(I*p, -1, (r,r))
  23. cov_Ip = m_Ip-m_I*m_p
  24.  
  25. m_II = cv2.boxFilter(I*I, -1, (r,r))
  26. var_I = m_II-m_I*m_I
  27.  
  28. a = cov_Ip/(var_I+eps)
  29. b = m_p-a*m_I
  30.  
  31. m_a = cv2.boxFilter(a, -1, (r,r))
  32. m_b = cv2.boxFilter(b, -1, (r,r))
  33. return m_a*I+m_b
  34.  
  35. def getV1(m, r, eps, w, maxV1): #输入rgb图像,值范围[0,1]
  36. '''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
  37. V1 = np.min(m,2) #得到暗通道图像
  38. V1 = guidedfilter(V1, zmMinFilterGray(V1,7), r, eps) #使用引导滤波优化
  39. bins = 2000
  40. ht = np.histogram(V1, bins) #计算大气光照A
  41. d = np.cumsum(ht[0])/float(V1.size)
  42. for lmax in range(bins-1, 0, -1):
  43. if d[lmax]<=0.999:
  44. break
  45. A = np.mean(m,2)[V1>=ht[1][lmax]].max()
  46.  
  47. V1 = np.minimum(V1*w, maxV1) #对值范围进行限制
  48.  
  49. return V1,A
  50.  
  51. def deHaze(m, r=81, eps=0.001, w=0.95, maxV1=0.80, bGamma=False):
  52. Y = np.zeros(m.shape)
  53. V1,A = getV1(m, r, eps, w, maxV1) #得到遮罩图像和大气光照
  54. for k in range(3):
  55. Y[:,:,k] = (m[:,:,k]-V1)/(1-V1/A) #颜色校正
  56. Y = np.clip(Y, 0, 1)
  57. if bGamma:
  58. Y = Y**(np.log(0.5)/np.log(Y.mean())) #gamma校正,默认不进行该操作
  59. return Y
  60.  
  61. if __name__ == '__main__':
  62. m = deHaze(cv2.imread('land.jpg')/255.0)*255
  63. cv2.imwrite('defog.jpg', m)

  

下面给两个运行效果吧

暗通道去雾算法的python实现的更多相关文章

  1. Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用

    很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ...

  2. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

    最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...

  3. paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他

    在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...

  4. paper 100:何恺明经典去雾算法

    一:由简至美的最佳论文(作者:何恺明  视觉计算组) [视觉机器人:个人感觉学习他的经典算法固然很重要,但是他的解决问题的思路也是非常值得我们学习的] 那是2009年4月24日的早上,我收到了一封不同 ...

  5. 纯C++去雾算法

    去雾算法 前言:经过不断的改进研究,该算法最终稳定,高效的问世了. 经过研究使该算法适应大雾环境,对该算法的内存优化,可以实时的高效的执行. 一.实时视频: watermark/2/text/aHR0 ...

  6. 一种可实时处理 O(1)复杂度图像去雾算法的实现。

    在我博文的一系列的文章,有不少算法都于去雾有关,比如限制对比度自适应直方图均衡化算法原理.实现及效果.局部自适应自动色阶/对比度算法在图像增强上的应用这两个增强算法都有一定的去雾能力,而最直接的就是& ...

  7. 基于暗通道优先算法的去雾应用(Matlab/C++)

    基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理:             参见论文:Single Image Haze Removal Using Dark Channel Pri ...

  8. OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾

    论文下载地址:http://research.microsoft.com/en-us/um/people/jiansun/papers/GuidedFilter_ECCV10.pdf 本文主要介绍导向 ...

  9. 基于clahe的图像去雾

    基于clahe的图像去雾     通过阅读一些资料,我了解到clahe算法对图像去雾有所价值,正好opencv中有了实现,拿过来看一看.   但是现在实现的效果还是有所差异 #);    clahe] ...

随机推荐

  1. Odoo中报表PDF样式出错的解决办法

    如果发现生成的pdf样式不对,那可能是wkhtmltopdf没办法访问web服务器导致的.wkhtmltopdf进程使用web.base.url作为根url来生成对应文件路径,但这个地址是每次管理员登 ...

  2. virtualbox+vagrant学习-2(command cli)-1-vagrant box命令

    vagrant box 这是用于管理(添加.删除等)boxes的命令. box 是一个打包好的操作系统,是一个后缀名为 .box 的文件,其实是一个压缩包,里面包含了 Vagrant 的配置信息和 V ...

  3. 2.4G电动车防盗方案 超低功耗单发器 SI24R2F

           对于现在的电动车防盗标签和校园卡的市场,主要以2.4G为主做标签,各色各样的2.4G国产芯片渐渐的能满足这块RFID领域.但是作为RFID的推动领导者,深圳市动能世纪科技有限公司专注于超 ...

  4. JDK(五)JDK1.8源码分析【集合】HashMap

    本文转载自无始无终,原文连接 HashMap 在 JDK 1.8 后新增的红黑树结构 传统 HashMap 的缺点 JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也 ...

  5. SQLIO 磁盘測试工具參考

    SQLIO 下载地址:id=20163">SQLIO Disk Subsystem Benchmark Tool 默认文件夹:C:\Program Files\SQLIO 以命令行执行 ...

  6. iOS12适配及问题记录,Debug正常使用,Release数据为nil的报错

    Debug模式数据一切正常,打包出去的ipa,Release模式下数据为nil的错误,经排查,buiding中的Optimization Level, Release设为None,解决问题. IOS1 ...

  7. Linux系统调用原理

    操作系统通过系统调用为运行于其上的进程提供服务. 当用户态进程发起一个系统调用, CPU 将切换到 内核态 并开始执行一个 内核函数 . 内核函数负责响应应用程序的要求,例如操作文件.进行网络通讯或者 ...

  8. 并发编程(三)------并发类容器Copy-On-Write容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.JDK里的COW容器有两种: CopyOnWriteArrayList CopyOnWriteArraySet CopyOnWri ...

  9. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  10. MySQL索引优化经验总结

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引 ...