声明:原创内容,创作不易,欢迎点赞收藏~
摘 要
随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用。然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导致户外成像设备不能捕捉到高质量的清晰图像,无法正常运用于计算机视觉系统。因此,对雾天图像进行去雾处理的计算机视觉技术得以发展和运用。
本课程设计依照何恺明博士等人在《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:height
for i = 1:width
patch = 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:numpx
atmSum = 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:3
J(:,:,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.文章来源:https://www.toymoban.com/news/detail-452752.html
文章来源地址https://www.toymoban.com/news/detail-452752.html
到了这里,关于【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!