大佬教程收集整理的这篇文章主要介绍了女朋友嫌我拍的照片有雾,连夜用OpenCV写出❤️去雾算法❤️逃过一劫(收藏保命),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
❤️欢迎订阅《从实战学python》专栏c;用python实现爬虫、办公自动化、数据可视化、人工智能等各个方向的实战案例c;有趣又有用!❤️
更多精品专栏简介点这里
治愈生活的良方 就是保持对生活的热爱
每次和女朋友出去玩c;拍照是必须的c;天气好还行c;天气要是不好c;加上我这破手机c;那拍的简直惨不忍睹c;自己都不过去。
但是没什么能难倒程序员的c;为了不挨骂c;连夜写出去雾算法c;女朋友更崇拜我了!
⚠️本文高能c;专业知识繁多c;小白可以直接文末拿代码运行(每行都有注释)。
⚠️想深入研究的同学c;万字详解包教包会!
⚠️总之c;收藏护体!
话不多说c;先看看效果强不强。
应用:车牌识别
应用:雾天预警
应用:景物识别
目前图像处理技术已非常火热c;应用也非常广泛。
图像处理的难度不仅在于成像技术c;更在于外界的天气条件c;遇到雾、雨、雪等能见度低的恶劣天气时c;成像会受到很大影响c;其中雾霾天气屡见不鲜c;还使采集到的图片辨识度、对比度、色彩饱和度都大大降低。
雾气的消除可以从物理去雾和数字去雾两个方向考虑c;物理去雾即在成像镜头上优化c;高清去雾的镜头成本昂贵c;不能广泛应用c;所以研究重点在数字去雾上c;即通过后期处理对图像进行优化c;从去雾算法提出至今c;可用的去雾算法大致可分为基于图像增强的去雾算法和基于图像复原的去雾算法。
本算法基于图像复原的暗通道先验去雾算法c;在大气成像模型的基础上c;得出图像恢复的基本公式。
暗通道理论指出:在大多数非空局部区域中c;始终至少有一个颜色通道的某些像素值较低甚至为0。
公式的关键点在于透射率的计算c;为了改进算法c;用导向滤波对透射率进行优化。
又因为该算法本身对天空部分并不适用c;所以考虑对公式增加参数c;二次计算透射率c;完成对算法的再一次优化。
最后再用OpenCV-Python对去雾算法进行具体实现以及运行速度的优化。最终能够实现对绝大多数的有雾图片快速去雾。
为了让领域小白理解接下来我要讲的内容c;需要普及一些基础知识。
像素是图像的基本要素c;也是图像的最小单位。
一张图片实际是由很多个小方格组成c;每个小方格有固定的位置和颜色数值c;这决定了图片最终呈现的样子c;像素的多少决定了在屏幕上显示的大小。
如果是黑白图片c;用0-255之间的一个数字来表示颜色的深浅明暗c;0表示最暗(黑色)c;255表示最亮(白色)。
如果是彩色图片c;用三个0-255之间的数字组成的数字序列来表示红绿蓝三种颜色所占的比例c;则某一个位置的像素就可以用数字序列表示为[24,180,50]。
比如一个5*4像素的彩色图像就可以这样存在计算机中。
通道简单来说就是表示通道表示每个点能存放多少个数。
例如彩色图像中每个像素点存放三个值c;即3通道的c;黑白图像每个像素点存放一个数字c;即单通道。
图像的像素点不是0就是1(图像不是黑色就是白色)c;图像像素点占的位数就是1位c;图像的深度就是1c;也称作位图。
图像中的像素介于0-255之间c;0表示完全黑色c;255表示完全白色c;并且在0-255之间插入了255级灰度。
当查看单个通道时c;每个通道都显示为灰度图像而不是黑白图像。
在通道的灰度图像中c;对比度应与通道颜色的对比度匹配c;它代表了彩色光在整个图像上的分布。
因为有3个通道c;所以也有3个灰度图像。
暗通道是一个基本假设c;即在大多数非空局部区域中c;始终至少有一个颜色通道的某些像素值较低。
形成这种现象的原因很多c;比如色彩鲜艳的物体的表面c;汽车c;建筑物或城市的阴影c;较暗的物体表面的阴影c;这些场景的暗通道始终较暗。
暗通道实际上使用三个RGB通道中的最小通道来形成灰度图像。
作者计算大量没有雾的图像c;并找到规则:
每个图像中三个RGB其中一个颜色通道具有一个灰色通道c;阶值非常低c;几乎接近零。
如果有雾c;则有一定的灰色;
如果没有雾c;则有很多黑色(像素接近0)。
共计算了5,000多个图像属性c;基本上都满足这样的先验定理。
所以只需分别计算出三个通道中RGB的最小值即可。
大气颗粒的散射是雾霾的主要原因。
无论是用肉眼观察还是从拍摄的图像中观察c;有很多雾的场景总是会受到对比度降低和视野降低的困扰。
在1925年c;Keim和Nemnich等人提出雾图像的低可见性是由于大气中空气中的微粒吸收和散射了光。
1976年c;约翰·威利(JohnWiley)等人提出c;粒子散射会导致光在传输过程中在目标和相机之间衰减c;并增加了一层大气散射光。
为了解决1999年大雾天能见度差的问题c;SrinivasaG和Narasimhan等人建立了数学模型来改善雾像的成像过程以及雾像中包含的各种元素。
该模型认为c;在强散射介质中c;检测系统的成像结果劣化的主要原因有两个:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrrwKMG3-1630474072464)(file:private/var/folders/j0/jf6_lq_s2wjcqpt53gnd88b80000gn/T/com.kingsoft.wpsoffice.mac/wps-libiao/ksohtml/wps6EBduQ.jpg)]
图中显示探测系统成像时接收到的光源主要来自两个部分c;
通过此物理模型建立得到雾天成像的数学模型为:
该公式的物理意义为经过粒子衰减能够达到探测系统的那部分光的比例。
大多数团队和学者在通过探测系统获得含雾图像并对其进行去雾图像处理时均以上述大气散射模型作为雾天成像的理论模型。
其主要思路是根据各种先验知识或者图像处理手段c;从含雾图像中估计传输函数或大气光c;将求解得到的参量代入到大气散射模型中c;即可恢复出目标图像。
在强分散介质中c;检测系统成像质量的下降主要包括以下两个原因:
暗通道先验去雾算法最早由何凯明博士中提出。先验与经验相对c;就是基于某种经验所得出的结论去研究解决问题的方法c;此处就是指何凯明博士统计了5000多副图像后得出的先验定理:
在每一幅图像的RGB三个颜色通道中c;总有一个通道的灰度值很低c;几乎趋向于0。
可以发现c;有雾的时候会呈现一定的灰色c;而无雾的时候咋会呈现大量的黑色(像素为接近0)。如图:有雾图片的灰度图整体呈灰色c;无雾图片的非天空部分呈黑色。
在现实生活中产生这种现象的原因的有很多且很普遍c;例如汽车c;建筑物等城市中的阴影c;有色物体的表面c;比如绿叶c;各种鲜艳的花朵c;较暗的物体表面c;这些场景图像的RGB颜色通道中c;总有一个通道的灰度值很低。
此处省去推导过程c;直接上公式。
在日常生活中c;即使是晴空万里c;雾也不是完全不存在的c;只是浓度比较低c;依然会影响人们看远处的物体;
所以c;去雾时也不能做到绝对c;应该保留一定程度的雾c;通过在式中加入一个在[0,1]之间的系数来实现。
明确需要计算哪些值。
在实际中c;可以借助于暗通道图来从有雾图像中获取该值。
然后在这些位置中c;在原始有雾图像I中寻找对应的具有最高亮度的点的值c;作为A值c;
最后计算A的平均值。
理论已经完成c;咱们直接代码实现。
OpenCV主要提供一组通用的基础结构。
用于开发人工视觉程序c;并改善商业产品中机器的感知。
OpenCV库具有2500多种优化算法c;包括经典和最先进的机器视觉以及机器学习算法。
这些算法可用于检测和识别面部c;跟踪移动的对象c;提取对象的三维模型c;从立体相机生成3D点云并组合图像以生成高分辨率全景图像。从图像数据库中查找相似图像等等。
使用OpenCV的项目已植入街景图像c;在监视期间检测入侵c;监视采矿设备c;帮助机器人导航和收集物体,并检测泳池中的溺水事件等很多。
OpenCV支持各种编程语言c;如C++c;Pythonc;Java等c;OpenCV-Python是OpenCV的PythonAPIc;结合了C++和Python语言的最佳特性。
综上所述c;OpenCV-Python的功能非常强大c;所以本文用它来实现去雾算法。
OpenCV在很多领域都有应用c;比如图像分割、物体识别、动作识别、人脸识别、结构分析等众多领域c;功能复杂繁多。在暗通道先验去雾算法中c;除去一些计算函数c;最关键的就是OpenCV的形态学处理。
形态变换是对图像形状进行的简单操作c;通常是指对二值图像进行的操作c;常见的形态变换包括腐蚀c;膨胀和张开操作。
腐蚀是对前景中物体边缘的腐蚀c;其腐蚀效果与现实相同。
其原理为卷积核沿着图像滚动c;如果相应区域的图像的像素值是1c;则对应于卷积核中心的像素值保持不变c;否则将全部变为0。
在卷积核中c;图像的边缘c;部分为0c;则该区域的部分将全变为0并保持不变。
其原理同样为卷积核沿着图像流动c;如与卷积核对应的图像像素值之一为1c;该区域将全部变为1c;否则保持不变。
进行腐蚀操作后再进行膨胀操作就是开运算
闭与开相对c;所以开运算的逆过程就是闭运算c;进行膨胀操作后再进行腐蚀造作c;原理和开运算一样c;可以用于去除二值化图像的背景色噪点。
首先计算图像的总像素点数c;取其前0.1%。
再按像素值从小到大的顺序获取像素所在位置的下标c;按按照下标从雾图中找到对应位置的三通道值。
这样就完成了从暗通道图中按照亮度的大小取前0.1%的像素。然后取这些值的平均值作为大气光A的值。
代码如下:
def AtmLight(im,dark):
[h,w]=im.shape[:2] #获取图像的长宽
imsz=h*w #长*宽得到总像素点个数
numpx=int(@H_554_498@max(@H_292_459@math.floor(imsz/1000),1)) #取总个数的前0.1%
darkvec=dark.reshape(imsz,1); #复制原图
imvec=im.reshape(imsz,3); #复制暗通道图
darkvec1=np.transpose(darkvec) #横纵坐标互换
inDices=darkvec1.argsort(); #按像素值从小到大的顺序获取像素所在位置的下标
inDices=inDices[0][imsz-numpx::] #取前0.1%大的
atmsum=np.zeros([1,3]) #一行三列以0填充的矩阵
for ind in range(0,numpx): #按下标到原图找到对应位置的像素值并求和
atmsum=atmsum+imvec[inDices[ind]]
A=atmsum/numpx; #计算平均值
return A
依据公式粗略得到透射率的值c;该值有待优化c;后续会处理。
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 Recover(im, t, A, tx=0.1):
res = np.empty(im.shape, im.dtype);
t = cv2.@H_554_498@max(t, tx); #如果t小于txc;取tx
for ind in range(0, 3): #按公式计算
res[:, :, ind] = (im[:, :, ind] - A[0, ind]) / t + A[0, ind]
return res
含天空部分的图像去雾之后只能观察到少许的去雾效果c;图像亮度大大降低c;且天空部分过度曝光c;去雾效果并不理想。
说明此算法本身确实对大面积天空部分并不适用。
针对上文得到的较为粗略的透射率c;在本章对其进行优化c;
何凯明曾提出过软遮光的方法c;该方法虽然获得的透射率非常精细c;但是运行速度极慢c;成为致命弱点。
在实际使用中c;效果并不理想。所以在本文中使用引导滤波的方法获得更精准的透射率。
该方法的核心在于正方形的简单模糊c;而有很多个快速且独立于半径的算法都可以用于正方形的简单模糊c;使算法的运行速度大大提高c;可以实际使用。
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;
算法对天空部分的处理效果并不理想c;天空部分被和非天空部分会出现明显的过渡区域和过度曝光现象。
这是算法从提出就存在的问题c;为了解决这跟问题c;从以下两种思路进行优化。
在计算大气光值时提到c;A是所有按亮度取前0.1%像素点的平局值c;由于天空部分的大气光过大c;影响了最后的平均值。
所以考虑设置一个最大全球大气光值作为所有像素点的阈值c;如果有像素点的值大于阈值c;该值就等于阈值。
这里将阈值设置为220。
因为这种直接取阈值的方法有些绝对c;所以多次实验之后发现结果并无较大改变。
考虑到上面直接取阈值的方法有些绝对c;所以想到设置一个参数来重新计算透射率。
正常情况下c;天空部分的大气光值和A使比较接近的c;而只有远离天空的地方才能用暗通道先验算法去雾。
所以将符合条件的像素点的值与A相减c;如果结果小于某个值c;认为这个区域可能是天空c;就需要重新计算透射率。
如果结果小于某个值c;则认为该区域不是天空c;不用重新计算透射率。
这里的某个值c;设置为kc;每个像素处的透射率用它来调节c;则改良后的透射率计算公式为
经过实验c;该方法对去雾校果有非常大的改善。
窗口的大小对去雾效果来说是个关键的参数。
从理论角度分析c;窗口更大c;就有更大的概率包含暗通道c;暗通道也就越暗c;与无雾图像的对比越不明显c;去雾效果也就不好。
实验得到:窗口越大c;去雾的效果越不好。窗口大小在11-51之间去雾效果最好。
ω最初是为考虑维持景深c;所以保留一定程度的雾c;所以其值越小c;保留的雾越多c;当然去雾效果越不好。
实验后发现c;取0.95最佳。
关于导向滤波中的半径r值c;因为在前面进行形态学处理暗通道的图像成一块一块的。
为了使透射率率更加精准c;实验后发现c;r的取值大于等于窗口大小的4倍最好。
源码下载地址:待审核
完整论文下载地址:待审核
免费地址
⭐今天是坚持刷题更文的第48/100天
⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力
为了回馈各位粉丝c;礼尚往来c;给大家准备了一条多年积累下来的优质资源c;包括 学习视频、面试资料、珍藏电子书等
大家可以点这里领取
以上是大佬教程为你收集整理的女朋友嫌我拍的照片有雾,连夜用OpenCV写出❤️去雾算法❤️逃过一劫(收藏保命)全部内容,希望文章能够帮你解决女朋友嫌我拍的照片有雾,连夜用OpenCV写出❤️去雾算法❤️逃过一劫(收藏保命)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。