何凯明的经典图像去雾算法,直接上代码啦,理论后续讲解哈~

Python代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PIL import Image
from guidedfilter import *def getDark(input_img, filter, frame):"""get dark image from the input image"""size = input_img.sizeoutput = []for x in xrange(size[1]):temp = []for y in xrange(size[0]):temp.append(min(input_img.getpixel((y, x))))output.append(temp)output = filter2d(output, filter, frame)output_img = Image.new('L', size)for x in xrange(size[1]):for y in xrange(size[0]):output_img.putpixel((y, x), output[x][y])return output_imgdef getLight(srcImage, darkImage, cut):"""get atmospheric light from the picture"""size = darkImage.sizelight = []for x in xrange(size[0]):for y in xrange(size[1]):light.append(darkImage.getpixel((x, y)))light.sort()light.reverse()threshold = light[int(cut * len(light))]atmosphere = {}for x in xrange(size[0]):for y in xrange(size[1]):if darkImage.getpixel((x, y)) >= threshold:atmosphere.update({(x, y): sum(srcImage.getpixel((x, y))) / 3.0})pos = sorted(atmosphere.iteritems(), key = lambda item: item[1], reverse = True)[0][0]return srcImage.getpixel(pos)def getTransmission(input_img, light, omiga):"""get transmission from the picture"""size = input_img.sizeoutput = []for x in xrange(size[1]):temp = []for y in xrange(size[0]):temp.append(min(input_img.getpixel((y, x))) / float(min(light)))output.append(temp)transmission = []for x in xrange(size[1]):temp = []for y in xrange(size[0]):temp.append(1 - omiga * minimizeFilter(output, (x, y), (10, 10)))transmission.append(temp)return transmissiondef getRadiance(input_img, transmission, light, t0):"""get radiance from the picture"""size = input_img.sizeoutput = Image.new('RGB', size)for x in xrange(size[1]):for y in xrange(size[0]):r, g, b = input_img.getpixel((y, x))r = int((r - light[0]) / float(max(t0, transmission[x][y])) + light[0])g = int((g - light[1]) / float(max(t0, transmission[x][y])) + light[1])b = int((b - light[2]) / float(max(t0, transmission[x][y])) + light[2])output.putpixel((y, x), (r, g, b))return outputdef ensure(n):if n < 0:n = 0if n > 255:n = 255return int(n)if __name__ == '__main__':image = Image.open('1.png')image = image.convert('RGB')dark = getDark(image, minimizeFilter, (10, 10))dark.save('3_dark.png')light = getLight(image, dark, 0.001)transmission = getTransmission(image, light, 0.9)tranImage = Image.new('L', image.size)grayImage = image.convert('L')for x in xrange(image.size[0]):for y in xrange(image.size[1]):tranImage.putpixel((x, y), int(transmission[y][x] * 255))guided = guidedFilter(grayImage, tranImage, 25, 0.001)guidedImage = Image.new('L', image.size)for x in xrange(image.size[0]):for y in xrange(image.size[1]):guidedImage.putpixel((x, y), ensure(guided[y][x]))guided[y][x] /= 255.0#guidedImage.show()guidedImage.save('3_guided.png')output = getRadiance(image, guided, light, 0.1)output.save('3_haze.png')
#!/usr/bin/env python
# -*- coding: utf-8 -*-from PIL import Imagedef filter2d(input_img, filter, frame):"""filter of the 2-dimension picture"""size = len(input_img), len(input_img[0])output = []for i in xrange(size[0]):temp = []for j in xrange(size[1]):temp.append(filter(input_img, (i, j), frame))output.append(temp)return outputdef minimizeFilter(input_img, point, size):"""minimize filter for the input image"""begin = (point[0] - size[0] / 2, point[0] + size[0] / 2 + 1)end = (point[1] - size[1] / 2, point[1] + size[1] / 2 + 1)l = []for i in xrange(*begin):for j in xrange(*end):if (i >= 0 and i < len(input_img)) and (j >= 0 and j < len(input_img[0])):l.append(input_img[i][j])return min(l)def convertImageToMatrix(image):size = image.sizeout = []for x in xrange(size[1]):temp = []for y in xrange(size[0]):temp.append(image.getpixel((y, x)))out.append(temp)return outdef boxFilter(im, radius):"""box filter for the image of the radius"""height, width = len(im), len(im[0])imDst = []imCum = []for x in xrange(height):imDst.append([0.0] * width)imCum.append([0.0] * width)#cumulative sum over Y axisfor i in xrange(width):for j in xrange(height):if j == 0:imCum[j][i] = im[j][i]else:imCum[j][i] = im[j][i] + imCum[j - 1][i]#difference over Y axisfor j in xrange(radius + 1):for i in xrange(width):imDst[j][i] = imCum[j + radius][i]for j in xrange(radius + 1, height - radius):for i in xrange(width):imDst[j][i] = imCum[j + radius][i] - imCum[j - radius - 1][i]for j in xrange(height - radius, height):for i in xrange(width):imDst[j][i] = imCum[height - 1][i] - imCum[j - radius - 1][i]#cumulative sum over X axisfor j in xrange(height):for i in xrange(width):if i == 0:imCum[j][i] = imDst[j][i]else:imCum[j][i] = imDst[j][i] + imCum[j][i - 1]#difference over X axisfor j in xrange(height):for i in xrange(radius + 1):imDst[j][i] = imCum[j][i + radius]for j in xrange(height):for i in xrange(radius + 1, width - radius):imDst[j][i] = imCum[j][i + radius] - imCum[j][i - radius - 1]for j in xrange(height):for i in xrange(width - radius, width):imDst[j][i] = imCum[j][width - 1] - imCum[j][i - radius - 1]return imDstdef dot(matrix1, matrix2, operation):"""dot operation for the matrix1 and matrix2"""out = []size = len(matrix1), len(matrix1[0])for x in xrange(size[0]):temp = []for y in xrange(size[1]):temp.append(operation(matrix1[x][y], matrix2[x][y]))out.append(temp)return outdef guidedFilter(srcImage, guidedImage, radius, epsilon):"""guided filter for the imagesrc image must be gray imageguided image must be gray image"""size = srcImage.sizesrc = convertImageToMatrix(srcImage)guided = convertImageToMatrix(guidedImage)one = []for x in xrange(size[1]):one.append([1.0] * size[0])n = boxFilter(one, radius)plus = lambda x, y: x + yminus = lambda x, y: x - ymultiple = lambda x, y: x * ydivide = lambda x, y: x / ymeanI = dot(boxFilter(src, radius), n, divide)meanP = dot(boxFilter(guided, radius), n, divide)meanIP = dot(boxFilter(dot(src, guided, multiple), radius), n, divide)covIP = dot(meanIP, dot(meanI, meanP, multiple), minus)meanII = dot(boxFilter(dot(src, src, multiple), radius), n, divide)varI = dot(meanII, dot(meanI, meanI, multiple), minus)epsilonMatrix = []for x in xrange(size[1]):epsilonMatrix.append([epsilon] * size[0])a = dot(covIP, dot(varI, epsilonMatrix, plus), divide)b = dot(meanP, dot(a, meanI, multiple), minus)meanA = dot(boxFilter(a, radius), n, divide)meanB = dot(boxFilter(b, radius), n, divide)return dot(dot(meanA, src, multiple), meanB, plus)

测试结果如下:
原图像:

图像暗通道:

图像导向滤波:

去雾后的效果:

Python暗通道图像去雾相关推荐

  1. 基于Matlab暗通道图像去雾处理

    基于Matlab暗通道图像去雾处理 一.简介 何恺明的暗通道先验( dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single lmage H ...

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

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

  3. c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十三 | 利用多尺度融合提升图像细节...

    前言 今天为大家介绍一个利用多尺度来提升图像细节的算法.这个算法来自于论文<DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AN ...

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

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

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

    基于导向滤波的暗通道先验去雾算法(Python语言,可直接运行) 1 编译环境 2 原理介绍 2.1 暗通道先验 2.1.1 暗通道先验理论与去雾模型 2.1.2 处理步骤 2.2 导向滤波求t(x) ...

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

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

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

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

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

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

  9. python:实现图像去雾算法(附完整源码)

    python:实现图像去雾算法 import cv2import mathimport numpy as npdef DarkChannel(im,sz):b,g,r = cv2.split(im)d ...

最新文章

  1. python的官方网站地址是什么-python赋值和地址
  2. Spark详解(七):SparkContext源码分析以及整体作业提交流程
  3. win10计算机添加右键菜单,win10系统如何对鼠标右键菜单进行手动管理和添加
  4. PHP和Mysql处理IP地址
  5. WordPress 博客平台
  6. DbHelper重用性方案 优化工具类 jdbc
  7. oracle基础知识过一遍(原创)
  8. 笔记15(Linux监控平台)
  9. 医学综合笔试计算机化考试,医学综合笔试实行计算机化考试考生手册.doc
  10. 真正能挣钱的分析模型有哪些?这三个你绝对要学会
  11. 静态嵌套类和非静态嵌套类
  12. 第29章:字符串编辑距离
  13. Camera ITS当中的test_lens_shading_and_color_uniformity测试
  14. Docker环境搭建和全终端无插件网页摄像机直播管理服务EasyNVS的部署方案详解
  15. 脑电波也能卖萌 这样的传感器好特别
  16. 【产品】《用户体验要素》框架层(界面设计、导航设计和信息设计)
  17. 中国幽门螺杆菌感染研究进展
  18. linux系统下对硬盘自定义分区格式化的分析与实现
  19. python用于计算和数据处理的包有哪些_chapter3-2 常用数据处理包Numpy整理2
  20. IIC从地址之7位,8位和10位详解

热门文章

  1. 关于double和float类型的转换
  2. ROS2读取realsense摄像头数据并发布topic到ros2
  3. 本地项目及依赖上传私服nexus
  4. python运行时不让电脑休眠_python – 在不中断程序的情况下休眠
  5. Java程序员两年校招笔记总结分析——菜鸡求职
  6. 图片标签和图片格式~
  7. 直播服务器不能正常运行,解决人人商城互动直播通信服务无法通信问题
  8. 雅克比(Jacobi)迭代法解线性方程组(Matlab程序)
  9. 安卓4.4.4安装哪个微信版本_安卓用户喜大普奔!安卓版微信7.0.13内测版发布,支持深色模式!...
  10. SAP S4HANA1610/Fiori安装过程全记录