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

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

上一篇文章主要介绍目标检测原理,通过七个问题来普及什么是目标检测,然后利用ImageAI实现最简单的目标检测案例。这篇文章将详细介绍图像去雾算法,经过图像增强后的图像也能应用于目标检测或图像分类领域,并且效果更好。本文主要讲解ACE去雾算法、暗通道先验去雾算法以及雾化生成算法,并且参考了两位计算机视觉大佬(Rizzi 何恺明)的论文。希望您喜欢,且看且珍惜。

第二阶段我们进入了Python图像识别,该部分主要以目标检测、图像识别以及深度学习相关图像分类为主,将会分享近50篇文章,感谢您一如至往的支持。作者也会继续加油的!

文章目录

  • 一.图像去雾
  • 二.ACE去雾算法
    • 1.算法原理
    • 2.代码实现
  • 三.暗通道先验去雾算法
    • 1.算法原理
    • 2.算法实现
  • 四.图像噪声和雾生成
    • 1.加盐噪声
    • 2.雾的模拟生成
  • 五.总结

同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的抬爱。如果有问题随时私聊我,只望您能从这个系列中学到知识,一起加油。代码下载地址(如果喜欢记得star,一定喔):

图像识别:

图像处理:


一.图像去雾

随着社会的发展,环境污染逐渐加剧,越来越多的城市频繁出现雾霾,这不仅给人们的身体健康带来危害,还给那些依赖图像信息的计算机视觉系统造成了不良影响,因为在雾天采集到的图像对比度和饱和度均较低,颜色易发生偏移与失真等。因此,寻找一种简单有效的图像去雾方法,对计算机视觉的后续研究至关重要。

该部分主要从下列几篇论文摘取对图像去雾算法进行普及,引用及参考中文论文:

图像增强(Image Enhancement)是指按照某种特定的需求,突出图像中有用的信息,去除或者削弱无用的信息。图像增强的目的是使处理后的图像更适合人眼的视觉特性或易于机器识别。 在医学成像、遥感成像、人物摄影等领域,图像增强技术都有着广泛的应用。图像增强同时可以作为目标识别、目标跟踪、特征点匹配、图像融合、超分辨率重构等图像处理算法的预处理算法。

近些年来,出现了众多的单幅图像去雾算法,应用比较广泛的有:

  • 直方图均衡化去雾算法
  • Retinex去雾算法
  • 暗通道先验去雾算法
  • 基于卷积神经网络的DehazeNet去雾算法

其主要可以分为 3 类:基于图像增强的去雾算法、基于图像复原的去雾算法和基于 CNN 的去雾算法。

(1) 基于图像增强的去雾算法
通过图像增强技术突出图像细节,提升对比度,使之看起来更加清晰,这类算法的适用性较广。具体的算法有:

  • Retinex 算法
    根据成像原理,消除了反射分量的影响,达到了图像增强去雾的效果
  • 直方图均衡化算法
    使图像的像素分布更加均匀,放大了图像的细节
  • 偏微分方程算法
    将图像视作一个偏微分方程,通过计算梯度场提高对比度
  • 小波变换算法
    对图像进行分解,放大有用的部分

此外,在这类算法的基础上出现了众多的基于图像增强原理的改进算法。

(2) 基于图像复原的去雾算法
主要是基于大气散射物理学模型,通过对大量有雾图像和无雾图像进行观察总结,得到其中存在的一些映射关系,然后根据有雾图像的形成过程来进行逆运算,从而恢复清晰图像。其中最经典的要属何恺明大佬提出的:

  • 暗通道先验去雾算法
    通过对大量无雾图像进行特征分析,找到了无雾图像与大气散射模型中某些参数的先验关系。该算法复杂度低,去雾效果好,因此在其基础上出现了大量基于暗通道先验的改进算法。

(3) 基于CNN的去雾算法
使用 CNN 建立一个端到端的模型,通过有雾图像恢复出无雾图像,目前使用神经网络进行去雾的算法主要有两种思路:

  • 使用 CNN 生成大气散射模型的某些参数,然后再根据大气散射模型来恢复无雾图像
  • 使用 CNN (例如 GAN)直接根据模糊图像生成无雾的清晰图像

CNN 因其强大的学习能力在多个领域得到应用,因此也出现了采用 CNN 进行去雾的算法。2016年CAI等首次提出了一种名为DehazeNet的去雾网络,用于估计有雾图像的透射率。DehazeNet 将有雾的模糊图像作为输入,输出其透射率,基于大气散射模型理论恢复出无雾的清晰图像。

下图是分别对直方图均衡化、暗通道先验去雾、DehazeNet和AOD-Net去雾算法进行测试,实验结果如图所示。由图可知,基于图像增强的直方图均衡化算法的去雾图像对比度明显增强,由于不考虑降质原因,在增加对比度的同时也对噪声进行了放大,出现细节丢失与色彩偏差现象。基于物理模型的暗通道去雾算法、基于神经网络的 DehazeNet 和 AOD-Net 算法的去雾效果较直方图均衡化算法更佳。

其他去雾算法对比结果如下图所示,比如城市和道路有无图像去雾效果对比。

最后,正如总结王道累老师总结的一样,目前针对有雾图像去雾的算法主要是从基于图像增强、图像复原和 CNN 3 个方向进行的。

  • 基于图像增强的方法不考虑有雾图像的形成过程,而是直接通过突出图像的细节,提高对比度等方式,从而使有雾图像看上去更加清晰。
  • 基于图像复原的方法则是追寻图像降质的物理过程,通过物理模型还原出清晰的图像。
  • 基于 CNN 的方法则是利用神经网络强大的学习能力,寻找有雾图像与图像复原物理模型中某些系数的映射关系或者使用 GAN,根据有雾图像还原出无雾的清晰图像。

上述 3 类去雾算法对于雾天图像都有着明显的去雾效果,尽管其在实际生活中已经得到了广泛的应用,但下述几点仍有可能是今后图像去雾领域的研究重点和难点:

  • 更加真实的雾天图像数据集
    采用神经网络进行去雾的算法在效果上好于图像增强和复原的方法,但是由于在自然界中很难拍摄到一组背景相同的有雾图像和无雾图像,因此目前训练神经网络所采用的数据集均是通过合成得到的,虽然能够在一定程度上拟合自然环境,但是仍然存在着一些差距。所以目前急需一种由在真实环境中获取到的具有相同背景的有雾图像和无雾图像构建的数据集,来提高神经网络去雾算法的鲁棒性和稳定性。

  • 更加简便的去雾算法
    目前各类算法能够有效去除单幅图像上的雾霾,但相对较好的算法都存在着时间复杂度高的问题,很难应用到视频去雾或者需求较多的复杂任务中去。

  • 鲁棒性更强的去雾算法
    上述算法都只对图像上存在的均匀的薄雾有较好的去雾效果,对于浓雾或者分布不均的团雾则效果较差,因此找到一种适用范围更广的去雾方法将会是一个极具挑战性的课题。


二.ACE去雾算法

1.算法原理

该部分主要介绍参考作者书籍以及相关论文进行叙述,简单介绍ACE算法的原理知识。如果读者想详细了解其原理,推荐阅读英文原文,详见下面的参考文献,都是大佬。

引用及参考中文论文:

英文原文:

图像对比度增强的算法在很多场合都有用处,特别是在医学图像中,这是因为在众多疾病的诊断中,医学图像的视觉检查时很有必要的。Retinex算法是代表性的图像增强算法,它根据人的视网膜和大脑皮层模拟对物体颜色的波长光线反射能力而形成,对复杂环境下的一维条码具有一定范围内的动态压缩,对图像边缘有着一定自适应的增强。

自动色彩均衡(Automatic Color Enhancement,ACE) 算法是Rizzi大神在Retinex算法的理论上提出的,它通过计算图像目标像素点和周围像素点的明暗程度及其关系来对最终的像素值进行校正,实现图像的对比度调整,产生类似人体视网膜的色彩恒常性和亮度恒常性的均衡,具有很好的图像增强效果。

ACE算法包括两个步骤:

  • 一是对图像进行色彩和空域调整,完成图像的色差校正,得到空域重构图像。
    模仿视觉系统的侧抑制性和区域自适应性,进行色彩的空域调整。侧抑制性是一个生理学概念,指在某个神经元受到刺激而产生兴奋时,再刺激相近的神经元,后者所发生的兴奋对前者产生的抑制作用。
  • 二是对校正后的图像进行动态扩展。
    对图像的动态范围进行全局调整,并使图像满足灰度世界理论和白斑点假设。算法针对单通道,再延伸应用到RGB彩色空间的3通道图像,即对3个通道分别处理再进行整合完成。

(1) 区域自适应滤波
输入图像I(灰度图为例),该步是对单通道图像I中所有点p的区域自适应滤波,得到完成色差校正,空域重构后的中间结果图像,计算公式如下:

式中:Ic§-Ic(j)为p、j两个像素点间灰度差值,表达拟生物学上的侧抑制性;d(p,j)表示距离度量函数,使用两点间的欧氏距离,作用上控制点j对p的影响权重,映射出滤波的区域适应性;Sa(x)是亮度表现函数(奇函数),本文算法选择经典Saturation函数。

不同亮度函数和参数的选择控制了对比度增强的程度,经典的Saturation函数在饱和前取越大的斜率,结果的对比度增强越明显,如图2所示,极限情况是sign函数形式,而Sign函数由于无差别过度增强放大,导致噪声同样得到放大效果不佳,最终选择Saturation函数作为相对亮度表现函数。公式如下:

(2) 色调重整拉伸,对图像动态扩展
将式(1)中得到的中间量拉伸映射到 [0, 255] 中,占满动态范围 [0, 255](8位灰度图像),计算公式如下,式中:[minR,maxR]是中间量L(x)的全部定义域,该项使图像达到全局白平衡。

下图是条形码图像进行ACE图像增强后的效果图,通过图像增强后的图(b)对比度更强,改善了原图像的明暗程度,增强的同时保持了图像的真实性。

ACE算法英文介绍如下:

实验对比效果如下图所示,大家在写该主题论文的时候,注意和传统方法对比。


2.代码实现

由于OpenCV中暂时没有ACE算法包,下面的代码是借鉴“zmshy2128”老师的文章,修改实现的彩色直方图均衡化处理。后面有机会作者详细分析其代码实现过程。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-03-12 # 惨zmshy2128老师文章并修改成Python3代码 import cv2 import numpy as np import math import matplotlib.pyplot as plt #线性拉伸处理 #去掉最大最小0.5%的像素值 线性拉伸至[0,1] def stretchImage(data, s=0.005, bins = 2000): ht = np.histogram(data, bins); d = np.cumsum(ht[0])/float(data.size) lmin = 0; lmax=bins-1 while lmin<bins: if d[lmin]>=s: break lmin+=1 while lmax>=0: if d[lmax]<=1-s: break lmax-=1 return np.clip((data-ht[1][lmin])/(ht[1][lmax]-ht[1][lmin]), 0,1) #根据半径计算权重参数矩阵 g_para = {} def getPara(radius = 5): global g_para m = g_para.get(radius, None) if m is not None: return m size = radius*2+1 m = np.zeros((size, size)) for h in range(-radius, radius+1): for w in range(-radius, radius+1): if h==0 and w==0: continue m[radius+h, radius+w] = 1.0/math.sqrt(h**2+w**2) m /= m.sum() g_para[radius] = m return m #常规的ACE实现 def zmIce(I, ratio=4, radius=300): para = getPara(radius) height,width = I.shape zh = [] zw = [] n = 0 while n < radius: zh.append(0) zw.append(0) n += 1 for n in range(height): zh.append(n) for n in range(width): zw.append(n) n = 0 while n < radius: zh.append(height-1) zw.append(width-1) n += 1 #print(zh) #print(zw) Z = I[np.ix_(zh, zw)] res = np.zeros(I.shape) for h in range(radius*2+1): for w in range(radius*2+1): if para[h][w] == 0: continue res += (para[h][w] * np.clip((I-Z[h:h+height, w:w+width])*ratio, -1, 1)) return res #单通道ACE快速增强实现 def zmIceFast(I, ratio, radius): print(I) height, width = I.shape[:2] if min(height, width) <=2: return np.zeros(I.shape)+0.5 Rs = cv2.resize(I, (int((width+1)/2), int((height+1)/2))) Rf = zmIceFast(Rs, ratio, radius) #递归调用 Rf = cv2.resize(Rf, (width, height)) Rs = cv2.resize(Rs, (width, height)) return Rf+zmIce(I,ratio, radius)-zmIce(Rs,ratio,radius) #rgb三通道分别增强 ratio是对比度增强因子 radius是卷积模板半径 def zmIceColor(I, ratio=4, radius=3): res = np.zeros(I.shape) for k in range(3): res[:,:,k] = stretchImage(zmIceFast(I[:,:,k], ratio, radius)) return res #主函数 if __name__ == '__main__': img = cv2.imread('car.png') res = zmIceColor(img/255.0)*255 cv2.imwrite('car-Ice.jpg', res)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99

运行结果如图所示,ACE算法能有效进行图像去雾处理,实现图像的细节增强。

最后是目标检测去雾和女神去雾的效果,哈哈,继续加油!


三.暗通道先验去雾算法

该算法是计算机视觉领域何恺明大佬于2009年提出的图像去雾经典算法,并获取当年CVPR最佳论文。论文题目为《Single Image Haze Removal Using Dark Channel Prior》。下图是大佬的百科简介,是真的厉害,值得我们大家学习。

  • 2003年5月,何恺明拿到保送清华的资格,是当年执信中学唯一保送上清华大学的学生;高考结果出炉以后,何恺明获得满分900分的成绩,成为当年广东省9位满分状元之一。
  • 2009年,何恺明成为首获计算机视觉领域三大国际会议之一CVPR“最佳论文奖”的中国学者。
  • 在2015年的ImageNet图像识别大赛中,何恺明和他的团队用“图像识别深度差残学习”系统,击败谷歌、英特尔、高通等业界团队,荣获第一。
  • 何恺明作为第一作者获得了CVPR 2009,CVPR 2016和ICCV 2017(Marr Prize)的最佳论文奖,并获得了ICCV 2017最佳学生论文奖。
  • 2018年,第31届计算机视觉和模式识别大会(Conference on Computer Vision and Pattern Recognition, CVPR)在美国盐湖城召开,何恺明获得本届大会的PAMI年轻学者奖。

1.算法原理

言归正传,如果是图像处理或研究图像去雾领域的作者,建议大家认真阅读这篇英文原文,能在2009年提出该算法真的很惊艳。

引用及参考中文论文:

英文原文:

暗通道先验(Dark Channel Prior, DCP)去雾算法 依赖大气散射模型进行去雾处理,通过对大量有雾图像和无雾图像进行观察总结,得到其中存在的一些映射关系,然后根据有雾图像的形成过程来进行逆运算,从而恢复清晰图像。

算法实现过程及原理如下,参考何恺明老师和何涛老师的论文。

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

  • x是图像的空间坐标
  • I(x)代表有雾图像(待去雾图像)
  • J(x)代表无雾图像(待恢复图像)
  • A代表全球大气光值
  • t(x)代表透射率

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

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

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

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

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

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

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

(4) 公式变形
根据大气散射模型,将第一个公式稍作处理,变形为下式:

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

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

因此可推导出:

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

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

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

  • 先求取暗通道图,在暗通道图中按照亮度的大小提取最亮的前0.1%的像素
  • 在原始雾图I(x)中找对应位置上具有最高亮度的点的值,作为大气光值A

此外,由于透射率t偏小时,会造成J偏大,恢复的无雾图像整体向白场过度,因此有必要对透射率设置一个下限值t0(一般取值为0.1),当t值小于t0 时,取t=t0。将以上求得的透射率和大气光值代入公式,最终整理得到图像的恢复公式如下:

这就是暗通道先验去雾算法的原理过程,下面简单补充论文中的处理效果图。

再次膜拜偶像,极力推荐大家阅读论文。


2.算法实现

实现代码引用木老师的,感觉比我写得好,参考如下:

# -*- coding: utf-8 -*-
'''
Created on Sat Sep 11 00:16:07 2021
@author: xiuzhang

参考资料:
https://blog.csdn.net/leviopku/article/details/83898619
'''

import sys
import cv2
import math
import numpy as np

def DarkChannel(im,sz):
    b,g,r = cv2.split(im)
    dc = cv2.min(cv2.min(r,g),b)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(sz,sz))
    dark = cv2.erode(dc,kernel)
    return dark

def AtmLight(im,dark):
    [h,w] = im.shape[:2]
    imsz = h*w
    numpx = int(max(math.floor(imsz/1000),1))
    darkvec = dark.reshape(imsz,1)
    imvec = im.reshape(imsz,3)

    indices = darkvec.argsort()
    indices = indices[imsz-numpx::]

    atmsum = np.zeros([1,3])
    for ind in range(1,numpx):
       atmsum = atmsum + imvec[indices[ind]]

    A = atmsum / numpx;
    return A

def TransmissionEstimate(im,A,sz):
    omega = 0.95
    im3 = np.empty(im.shape,im.dtype)

    for ind in range(0,3):
        im3[:,:,ind] = im[:,:,ind]/A[0,ind]

    transmission = 1 - omega*DarkChannel(im3,sz)
    return transmission

def Guidedfilter(im,p,r,eps):
    mean_I = cv2.boxFilter(im,cv2.CV_64F,(r,r))
    mean_p = cv2.boxFilter(p, cv2.CV_64F,(r,r))
    mean_Ip = cv2.boxFilter(im*p,cv2.CV_64F,(r,r))
    cov_Ip = mean_Ip - mean_I*mean_p

    mean_II = cv2.boxFilter(im*im,cv2.CV_64F,(r,r))
    var_I   = mean_II - mean_I*mean_I

    a = cov_Ip/(var_I + eps)
    b = mean_p - a*mean_I

    mean_a = cv2.boxFilter(a,cv2.CV_64F,(r,r))
    mean_b = cv2.boxFilter(b,cv2.CV_64F,(r,r))

    q = mean_a*im + mean_b
    return q

def TransmissionRefine(im,et):
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    gray = np.float64(gray)/255
    r = 60
    eps = 0.0001
    t = Guidedfilter(gray,et,r,eps)

    return t

def Recover(im,t,A,tx = 0.1):
    res = np.empty(im.shape,im.dtype)
    t = cv2.max(t,tx)

    for ind in range(0,3):
        res[:,:,ind] = (im[:,:,ind]-A[0,ind])/t + A[0,ind]

    return res

if __name__ == '__main__':

    fn = 'car-02.png'
    src = cv2.imread(fn)
    I = src.astype('float64')/255

    dark = DarkChannel(I,15)
    A = AtmLight(I,dark)
    te = TransmissionEstimate(I,A,15)
    t = TransmissionRefine(src,te)
    J = Recover(I,t,A,0.1)

    arr = np.hstack((I, J))
    cv2.imshow('contrast', arr)
    cv2.imwrite('car-02-dehaze.png', J*255 )
    cv2.imwrite('car-02-contrast.png', arr*255)
    cv2.waitKey();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101

实现效果如下图所示:

如果想和后续目标汽车检测结合,同样可以先去雾再进行检测,如下图所示:


四.图像噪声和雾生成

图像处理总少不了噪声添加或生成,下面补充两个简单的椒盐噪声和雾气模拟生成的代码。这与本文的实验紧密相关,能为我们提供更多的GAN生成样本。后面人工智能系列文章,GAN我们看看能不能学习真实雾化场景的图像,值得期待,哈哈!

1.加盐噪声

原图是一张风景图像:

代码如下:

# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread('fj.png', cv2.IMREAD_UNCHANGED) rows, cols, chn = img.shape #加噪声 for i in range(50000): x = np.random.randint(0, rows) y = np.random.randint(0, cols) img[x,y,:] = 210 cv2.imshow('noise', img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows() cv2.imwrite('fj-res.png',img)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出结果如下图所示:


2.雾的模拟生成

代码如下:

import numpy as np
import cv2 as cv
import os
import random

file = ['fj.png']
output = 'fj-wu.png'

for file_img in file:
    #打开图像
    img = cv.imread(file_img)
    mask_img = cv.imread(file_img)

    #雾的颜色
    mask_img[:, :] = (166, 178, 180) 

    #里面参数可调,主要调整雾的浓度
    image = cv.addWeighted(img,
                           round(random.uniform(0.03, 0.28), 2),
                           mask_img, 1, 0) 

    #保存的文件夹
    cv.imwrite(output, image)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

输出结果如下图所示,效果还不错。


五.总结

写到这里,本文就介绍完毕,希望您喜欢。如果你是一名Python初学者或想了解图像处理知识,真心推荐该系列,并且多实践多写代码,最后希望文章对您有所帮助。

八月初又认识了很多朋友,也解答了许多学生和博友的问题,虽然自己技术不是很好,但真心感激这一路走来认识了许多伙伴,也享受相互交流的过程,感恩遇见,不负青春。

这半个月交流让我印象深刻的是复旦、浙大和武大离职读博想当老师的朋友,我们交流了许多学习心得并鼓励前行;也有贵财计科、软工、电商几位学生工作的问题;以及家乡贵财、贵大、兴义师范、贵师大、贵理工选择考研或已经读研同学的咨询,我们相互学习;当然还有许多创业、工作、学习或寻求正能量的交流,包括来自广东、南航、中北、湖北工业、建筑转NLP、安全或AI行业的博友。最让我享受的是,许多我教过的学生或相互鼓励前行的博友,经常祝福我们一家并保持良好的情谊,这或许就是分享的魅力,觉不亚于一次holy shit。教育的方式多种多样,我享受这样的交流和鼓励方式,山川异域,携手同行。

最后补充一句,父母能带给孩子最好的礼物,或许就是“处于逆境时的应对能力”,希望小珞珞能坚强、健康、快乐的成长,女神也能美丽和幸福一辈子。爱你们哟。

(By:Eastmount 2021-09-14 晚上12点 http://blog.csdn.net/eastmount/ )


(0)

相关推荐

  • 江蓉|| 朦胧缥缈雾霾天

    小时候,只知道有雾,以为是白色的,长大后才知道雾是无色无味的,是水汽凝结而成.冬天里,四川盆地特有的地貌结构导致时常有雾,感觉很缥缈,每当大雾散去,太阳就会出来. 今早,睁眼已近八点,习惯性的拿起手机 ...

  • 寻找新鲜空气(3):这里有雾没有霾

    雾霾,雾霾.人们习惯将"雾"和"霾"连在一起叫,其实是冤枉了雾. 雾是清白的. 雾没有异味. 因为有了雾,每天的风景都不一样. 所以我昨天清晨拍了,今天一早又来 ...

  • 山     雾

    ​                      阴雨绵绵的乡村 山藏雾后 云雾接天 有雾的曰子 勾起一段往事 有雾的日子 总结一段回忆 却在看不透的岁月 朦胧迷离 山雾将日子包裹成银屏 上演你我的曾经 ...

  • 惊呆了!速度高达15000fps的人脸检测算法!

    昨天52CV君发现一篇奇文,<Face Detection at 15,000 FPS:Real-Time Inference on GPU and CPU>,速度高达15000fps的人 ...

  • 福安市溪潭境内最近有雾,注意安全行车

    福安溪潭境内最近有雾, 提醒大家注意安全行车! 赛岐缪锦峰消息:最近我市溪潭镇内早上常见大雾锁道,希望大家注意安全行车: 雾,浓浓的雾. 最近早晨从赛岐去市区的上班路上,溪潭镇内陈家山至溪北洋隧道口, ...

  • 龙野一雄论经方证治(十六):急性支气管炎与治疗详解(2)

    龙野一雄简介:1905-1976,日本著名汉方医家.医史学者,主要著作有<伤寒论金匮要略解说><汉方入门讲座><汉方处方集><新撰类聚方><日本医 ...

  • 第二十六课:《凌波仙子》技法详解

    [玫瑰]作品:<水中仙子> [玫瑰]讲师:青墨老师 [抱拳]实操分享: [烟花]1.构图:十字构图法 思路:先主要后次要:先完整后残缺:先近处后远处. [烟花]2.花朵 ① 花瓣共六片,先 ...

  • 第四十二课 《飞流直下》拆图详解

    授课老师:寒山老师 要点:画山水切记颜色过浓 ①瀑布之上:交错变换 瀑布之下:干净整洁 1.瀑布之上的急流要左右交错. 2.岩石的交错决定着水的流向. 3.瀑布末端要虚化,体现云雾升腾之感. ②落意在 ...

  • 第四十五课《山体组合》技法详解

    作品:<山体组合> 讲师:寒山老师 构图:九宫格构图法 画法总结 山脉:正面左右摇摆,层层叠压,侧面依次勾勒高低起伏 山坡:正面两面互皴,乱石点缀,侧面承层叠压有条不紊,远山一气呵成干净整 ...

  • 何恺明技惊四座的首篇经典之作:暗通道先验去雾到底是在解决一个什么问题?

    MLNLP(机器学习算法与自然语言处理)是国内外最大的自然语言处理社区之一,汇聚超过50w订阅者,受众覆盖国内外NLP硕博生.高校老师以及企业研究人员. 社区的愿景是促进国内外自然语言处理,机器学习学 ...

  • 古书《郭氏易解》十六十五卷,明朝万历四十六年郭子章著

    古书《郭氏易解》十六十五卷,明朝万历四十六年郭子章著

  • 639期B || 妥妥读《三国》(四十六)败于禁关羽名声震 失荆州云长走麦城/轩诚播读

    美丽诗文 | 精品连播 | 美丽杂谈 | 艺术空间 | 经典时刻 上期结尾: 曹仁所在的樊城也被水淹了.曹仁派人堵了东边,水进了西边.有人向曹仁建议,说,失去樊城以后还可以再夺回来,可是没有了人就什么 ...

  • 第四十六讲:子产和管仲

    <论语>是高一要求的必读书,也是考试范围,更是最重要的传统经典之一.大家听一听讲解,除了方便理解和背诵,还可以积累文言文的知识,作文素材,提升语文素养,可谓一举四得.以往各期可以点击文章下 ...

  • 人间词话之楹联欣赏第四十六期

    编审:抱月山人,敝庐 图文编辑:夕颜  咏千秋塔(成联两副) 联/琴儿(文成) 其一 诗吟一塔,火爆三堤,脚底山城头已点: 光炳千秋,芳流四海,云中眼界日同升. 其二 玲珑宝塔,昂首讴歌,扬眉吐气风云 ...