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

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

摘    要

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

      本课程设计依照何恺明博士等人在《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.

 

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
暗通道先验去雾是一种常用的图像去雾方法,它基于一个观察到的现象:自然场景中的绝大多数区域,在至少一个彩色通道中具有较低的像素值。通过利用这一先验信息,可以估计出图像中的透射率,从而实现去雾效果。 在MATLAB中,可以通过以下步骤实现暗通道先验去雾: 1. 读取原始图像并将其转换为双精度灰度图像。 ```matlab I = imread('input_image.jpg'); I = im2double(rgb2gray(I)); ``` 2. 计算图像的暗通道。对于每个像素点,取其周围一个滑动窗口内的最小值。 ```matlab window_size = 15; dark_channel = ordfilt2(I, 1, true(window_size)); ``` 3. 估计全局大气光。选择暗通道中像素值最大的一些点作为无雾区域,计算它们在原始彩色图像中的最大值。 ```matlab top_percent = 0.001; % 可调参数,控制无雾区域的比例 num_pixels = round(numel(I) * top_percent); [~, indices] = sort(dark_channel(:), 'descend'); top_indices = indices(1:num_pixels); A = max(I(top_indices)); ``` 4. 估计透射率。将暗通道除以大气光估计值,然后通过一个参数来控制去雾程度。 ```matlab omega = 0.95; % 可调参数,控制去雾程度 transmission = 1 - omega * dark_channel / A; ``` 5. 恢复原始图像。根据透射率和大气光估计值,对原始图像进行去雾处理。 ```matlab J = (I - A) ./ max(transmission, 0.1) + A; ``` 请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和优化。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值