声明:原创内容,创作不易,欢迎点赞收藏~

摘    要

随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用。然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导致户外成像设备不能捕捉到高质量的清晰图像,无法正常运用于计算机视觉系统。因此,对雾天图像进行去雾处理的计算机视觉技术得以发展和运用。

本课程设计依照何恺明博士等人在《Single Image Haze Removal Using Dark Channel Prior》(点击查看论文链接)中提到的基于暗通道先验的图像去雾算法,使用MATLAB语言实现了一个基于暗通道先验单幅图像去雾的系统。结合暗通道先验条件与雾天图像模型,通过原始有雾图像得到图像的暗通道图,然后估计大气光照和介质传输率,由雾天图像模型复原出无雾图像。系统实现后,将各种各样的有雾图像输入系统中进行实验,实验的结果证明了所提出的基于暗通道先验的图像去雾算法的有效性。基于暗通道先验的图像去雾算法是一种简单有效的图像去雾算法,值得在此基础上加以改进和创新。

系统功能分析

按照何恺明博士等人在《Single Image Haze Removal Using Dark Channel Prior》中提到的基于暗通道先验的图像去雾算法,在使用MATLAB编程时,首先需要根据原始有雾图像通过计算后得到图像的暗通道图像JDark,应当编写一个darkChannel函数将原始图像作为输入,暗通道图像作为输出。得到暗通道图像后,需要根据原始图像和暗通道图像的信息估计大气光照,应当编写一个atmLight函数来实现该过程,以暗通道图像和原始图像的信息作为输入,大气光照作为输出。计算得到大气光照后,再根据原始图像和大气光照估计出该天气下的介质传输率,应当编写一个transmissionEstimate函数来实现该过程,以大气关照和原始图像作为输入,以介质传输率作为输出。最后根据雾天图像模型即可复原出无雾图像J,因此需要编写一个函数getRadiance来实现该过程,以原始图像、大气光照、介质传输率作为输入,以无雾图像J作为输出。经过上述步骤后,便可由一幅有雾图像复原出其对应的无雾图像。

图1 图像去雾系统结构图

功能实现

本课程设计,使用Windows11下的MATLAB 2022a编写实现。图像去雾算法参考何恺明博士等人发表的《Single Image Haze Removal Using Dark Channel Prior》一文。

     1.暗通道图像的获取——Jdark=darkChannel(img)

在论文中,图像暗通道图像被以下公式所定义:

图2 暗通道图像定义

因此编写的MATLAB代码如下:

function JDark = darkChannel(im2)
%根据图像得到图像的暗通道图像
[height, width, ~] = size(im2);
patchSize = 15; %设置参数Patch Size大小为15
padSize = floor(patchSize/2); %将填充数组的padSize设置为Patch Size的一半左右
JDark = zeros(height, width); % 返回的暗通道图像
imJ = padarray(im2, [padSize padSize], Inf); % 用无穷大初始化填充数组
for j = 1:heightfor i = 1:widthpatch = imJ(j:(j+patchSize-1), i:(i+patchSize-1),:);%求取最小值作为暗通道中的值JDark(j,i) = min(patch(:));%局部区域内的暗通道是该区域内所有通道的最小值end
end

2.估计大气光照——A=atmLight(im,JDark)
在论文中,大气光照的估计方法为:

图3 大气光照定义

即在暗通道图像里挑选出0.1%的最亮像素,将这些像素对应的原始图像的最亮的像素值的平均值作为大气光照。

因此编写的MATLAB代码如下:

function A = atmLight(im, JDark)
%4.3中估计大气光 A
% 大气光的颜色非常接近天空的颜色
% 所以选择所以只需选择暗通道图像(JDark)中中最接近1的前几个像素
% 通过对暗通道图像中前0.1%最亮像素取平均即可
% 获取图片大小
[height, width, ~] = size(im);
imsize = width * height;
numpx = floor(imsize/1000); % 图像中前0.1%的像素个数
JDarkVec = reshape(JDark,imsize,1); %暗通道图像像素向量化
ImVec = reshape(im,imsize,3); %原图图像像素向量化
% 根据像素值对暗通道图像中的像素进行排序
[JDarkVec, indices] = sort(JDarkVec);
indices = indices(imsize-numpx+1:end); % 取出最亮的0.1%个像素值索引
atmSum = zeros(1,3);
for ind = 1:numpxatmSum = atmSum + ImVec(indices(ind),:);%累加求和
end
A = atmSum / numpx;%求平均值

3.估计介质传输率——transmission = transmissionEstimate(im,A)
在论文中,介质传输率的计算方法为:

图4 介质传输率定义

因此编写的MATLAB代码如下:

function transmission = transmissionEstimate(im,A)
%4.1估计传输率
omega = 0.95; %保留景深感,保留少量的雾而设置的参数
%对有雾图的每一个颜色通道进行归一化
im3 = zeros(size(im));
for ind = 1:3 im3(:,:,ind) = im(:,:,ind)./A(ind);
end
transmission = 1-omega*darkChannel(im3);%计算出传输率

     4.复原得到无雾图像——J = getRadiance(A,im,transmission)

在论文中,无雾图像复原的计算方法为:

图5 无雾图像复原

因此编写的MATLAB代码如下:

function J = getRadiance(A,im,transmission)
t0 = 0.1;%设置传输率下界
J = zeros(size(im));
for ind = 1:3J(:,:,ind) = (im(:,:,ind) - A(ind))./max(transmission,t0)+A(ind);
end
J = J./(max(max(max(J))));

运行展示

(1)如下图所示,原始图片中太阳光照下的丁达尔效应被去雾算法去除。


图6 (图片来源:Pexels素材图片)

(2)如下图所示,游戏截图中的雾气被去除,能见度变高,但仍有雾气残留。

图7 (图片来源:米哈游《原神》孤云阁游戏内截图)

(3)如下图所示,森林中的雾气被去除掉,人物和树木的轮廓更加明显。

图8 (图片来源:Pexels素材图片)

总结与展望

本课程设计通过MATLAB编程实现了何恺明博士等人在《Single Image Haze Removal Using Dark Channel Prior》中提到的基于暗通道先验的图像去雾算法,在参阅完他们的这篇著名论文后,尽管有些小困惑在心头,但心中不得不肃然起敬。本以为会是一种相当复杂的图像去雾算法,在理解其大致思想后,我心中才明白好的算法应该就是返璞归真,大道至简的。使用简单的模型,有效解决实际生活中困难的问题。论文中提到的暗通道先验是基于户外无雾图像的一种统计结果,即除去天空区域外,图像中大部分局部局域中的有些像素总是在RGB通道中至少有一个通道有着非常小的亮度值,这样的像素被称为暗像素。而在有雾图像中这些暗像素的亮度值则由大气光照所导致。这一重要的统计规律的发现,无疑对该论文中图像去雾算法产生了巨大的帮助,但我想这也一定离不开何恺明博士等人对雾天图像的大量实验研究才能有所发现。科学的真理往往藏在隐秘的地方,需要锲而不舍的人去发现和探索。在通过MATLAB编程后,才发现纸上得来终觉浅,经过不断地重复参阅论文,反复理解和感悟,加上一步步编程实践,才让我更好地理解了这篇著名的论文,获益匪浅。

暗通道先验是一种通过对大量无雾图像研究所得到的统计结果,它并不能很好地适用于所有有雾图像的去雾处理,当图像中场景的像素强度与大气光照类似时,如雪雾天气下的场景,白色背景的场景等等,暗通道先验图像去雾算法就不再适用了。另外,暗通道先验图像去雾算法中,有不少参数设定在日常经验之中,例如原始图像提取暗通道图像的过程中,PatchSize,大小的设定;在估计介质传输率中,景深系数omega大小的设定;有雾图像复原成无雾图像中,介质传输率下界t0的大小的设定。这些参数的变化,都会切实影响到去雾图像的效果。如果某一参数不合适,往往就不能得到一幅视觉上观感较好的去雾图像,如何针对每一幅图像选定合适的参数进行图像去雾,从而达到更好的去雾效果,将是一个值得探讨和研究的有意义的问题。

总而言之,基于暗通道先验的单幅图像去雾算法是一个简单和非常有效的图像去雾算法,解决了图像去雾过程中的一些具有挑战性的问题,但依我之见,算法还有完善和发展的空间,在未来的图像去雾算法中具有很大的发展潜力,并且值得研究者在此基础上不断改进、完善和创新。

主要参考文献

[1]He Kaiming,Sun Jian,Tang Xiaoou. Single Image Haze Removal Using Dark Channel Prior.[J]. IEEE transactions on pattern analysis and machine intelligence,2011,33(12). 
[2]孙维江. 基于暗通道先验信息的单幅图像去雾研究[D].兰州理工大学,2018.
[3]张赛赛.基于单幅数字图像去雾技术综述[J].电脑编程技巧与维护,2022(08):147-151.DOI:10.16184/j.cnki.comprg.2022.08.002.
[4]李博文,刘进锋.图像去雾技术研究综述[J].现代计算机,2022,28(13):57-61.
[5]陈俊安,陆庚有,谢倩怡,龚智慧,刘建平,彭绍湖.图像去雾算法研究综述[J].电脑与电信,2022(07):63-66.DOI:10.15966/j.cnki.dnydx.2022.07.012.
[6]张雪,王峰,赵佳.基于暗通道先验的单幅图像去雾改进算法[J].阜阳师范大学学报(自然科学版),2022,39(02):69-75.DOI:10.14096/j.cnki.cn34-1069/n/2096-9341(2022)02-0069-07.
[7]胡莹洁. 雾天图像去雾方法研究[D].中国矿业大学,2022.DOI:10.27623/d.cnki.gzkyu.2022.000563.
[8]张威. 基于改进暗通道算法的单幅图像去雾研究[D].南京邮电大学,2021.DOI:10.27251/d.cnki.gnjdc.2021.000756.

【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)相关推荐

  1. matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法

    基于暗通道先验条件图像去雾算法 香港大学何凯明博士于2009发表了一篇论文<Single Image Haze Removal Using Dark Channel Prior>.在文章中 ...

  2. 基于MATLAB改进暗通道先验的图像去雾算法

    基于MATLAB改进暗通道先验的图像去雾算法 摘要:暗通道先验去雾算法求得的的透射率比较精细,去雾效果优于大多数去雾算法.然而在暗通道求取过程中,最小值滤波的处理会使得暗色向外扩张,导致透射率扩张变大 ...

  3. 基于暗通道优先的单幅图像去雾算法(Matlab)

    基于暗通道优先的单幅图像去雾算法(Matlab) 每一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几乎趋向于0.基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法. ​ 首 ...

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

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

  5. 【论文阅读】改进的基于均值滤波的单幅图像去雾算法研究

    改进的基于均值滤波的单幅图像去雾算法研究 吴延海,张婧,陈康 西安科技大学 学报, 2016 本文是在<基于单幅图像的快速去雾>基础上进行改进.主要改进有以下几点: 对<基于单幅图像 ...

  6. 暗通道优先的图像去雾算法(上)

    FROM:http://blog.csdn.net/baimafujinji/article/details/27206237 11.1  暗通道优先的图像去雾算法 图像增强与图像修复二者之间有一定交 ...

  7. 暗通道优先的图像去雾算法(下)

    FROM:http://blog.csdn.net/baimafujinji/article/details/30060161 书接上文 http://blog.csdn.net/baimafujin ...

  8. 基于暗通道优先算法的去雾应用Matlab

    理论见博客: http://www.cnblogs.com/changkaizhao/p/3266798.html http://www.cnblogs.com/Imageshop/p/3281703 ...

  9. 单幅图像去雾算法研究综述

    来源 <计算机工程与应用>北大核心期刊,CSCD数据库. 影响因子:2.348 简介 图像去雾算法是以满足特定场景需求,突出图片细节并增强图片质量为目的的图像分析与处理方法.在雾霾天气下, ...

最新文章

  1. 5G时代到来,人工智能设备如何重塑TMT行业
  2. 在ecshop顶部会员信息提示区显示会员等级
  3. 事件——事件绑定||事件函数传参||事件修饰符||按键修饰符||自定义按键修饰符
  4. 貌离神合的RNN与ODE:花式RNN简介
  5. 把java复制到e_编写一个程序,将e:\java目录下的所有.java文件复制到e:\jad目录下...
  6. php微信公众号测试号token配置失败,微信公众号Token配置失败解决办法
  7. 【原创】Altium Designer Winter 09 笔记 之一
  8. ZK框架笔记3、窗体组件
  9. JAVA程序将PDF转化为TXT
  10. 实用软件工程(吕云翔版)——第一章
  11. 测试手机芯片体质软件,高通cpu体质测试软件
  12. 全球首个中文PaaS支撑平台----天翎myApps快速开发平台
  13. html5都能干嘛种花,把这19种花种起来,整个家都能变成大花园!
  14. FTP服务器的上传文件端口为,FTP服务器上传文件时的端口
  15. Node.js 读取图片
  16. oracle 脚本检查点,oracle nca脚本检查点
  17. 【BZOJ 3993】【SDOI 2015】星际战争
  18. (2018, BigGAN)用于高保真自然图像合成的大规模 GAN 训练
  19. mysql创建数据库error1044_Mysql创建数据库时提示Error 1044
  20. UVA10118(记忆化搜索 + 好题)

热门文章

  1. Python 歌词解析器 音乐与歌词同步播放
  2. shell 进制转换 10转16
  3. 【工具使用】Modbus Slave软件使用详解
  4. React 导读(二)
  5. java后端调用百度地图
  6. 桥梁防撞监控系统的作用——喜讯科技
  7. 浏览器控制台无限debugger与解决办法
  8. 2019软件测试工程师技能树知识全面梳理
  9. 优雅编程之这样取名字,你就正常了!
  10. 自如等租赁平台,搞垄断,攫取最大利润,伪善的面貌