一种基于暗通道先验算法的图像去雾技术研究(matlab代码)

一、实验结果

理论基础请参考博主相关博文:一种基于暗通道先验算法的图像去雾技术研究

以常见的自然景象为测试,根据以上原理估计图像的暗通道、大气透射率以及进行无雾图像的恢复。需要说明的是,对透射率的优化是采用guided image filtering方法,实验结果如下图示所示:

在这里插入图片描述

图2 图像去雾结果

二、Matlab代码

function  [Jim,transm,depth]=darkpriordhaze(I,blocksize,w0,t0,r,eps);
% single image dehaze
[rows,columns,L]=size(I);
r=round(blocksize/2);
dark_channel=zeros(rows,columns);
minRc=zeros(rows,columns);
%
for i=1:rows,
    for j=1:columns,
        minRc(i,j)=min(I(i,j,:));
    end
end
IminRc=padarray(minRc,[r r],'symmetric');%
%暗通道计算
for i=(r+1):(rows+r),
    waitbar((i-r)/rows);
    for j=(r+1):(columns+r),
        In=IminRc(i-r:i+r,j-r:j+r);
        dark_channel(i-r,j-r)=min(In(:));
    end
end
clear IminRc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 大气透射率估计
%gray histogram statistic,To verify how good the dark channel prior is
n_elements = histc(dark_channel(:),[0:1:255]);
p_elements = cumsum(n_elements)/sum(n_elements);%累计百分比
%the atmospheric light estimation,通过dark_chanel中的那0.1最亮的值来确定
ivp_elements=1-p_elements;
idx=find(ivp_elements<0.001);
Max_dark_channel=idx-1;
[ix,iy]=find(dark_channel>=Max_dark_channel(1));
max_ixsize=length(ix);
max_ixrgb=zeros(max_ixsize,3);
max_ixv=zeros(max_ixsize,1);
for i=1:max_ixsize;
    max_ixrgb(i,1)=I(ix(i),iy(i),1);
    max_ixrgb(i,2)=I(ix(i),iy(i),2);
    max_ixrgb(i,3)=I(ix(i),iy(i),3);
    max_ixv(i)=norm(max_ixrgb(i,:));
end
[~,ixm]= max(max_ixv);
A=max_ixrgb(ixm,:);%大气光亮度
figure
imshow(I)
title('origin image and A area');
%
hold on
line([iy(ixm)-20,iy(ixm)+20 iy(ixm)+20 iy(ixm)-20,iy(ixm)-20],[ix(ixm) ix(ixm) ix(ixm)+10 ix(ixm)+10 ix(ixm)-10 ],'Color','r');
%%%%%%%%%
Ic=zeros(size(I));
for c=1:3,
    Ic(:,:,c)=double(I(:,:,c))/A(c);
end
%
for i=1:rows,
    for j=1:columns,
        minRc(i,j)=min(Ic(i,j,:));
    end
end
IminRc=padarray(minRc,[r r],'symmetric');%
%dark channel
dark_channel2=zeros(rows,columns);
for i=(r+1):(rows+r),%
    waitbar((i-r)/rows);
    for j=(r+1):(columns+r),
        In=IminRc(i-r:i+r,j-r:j+r);
        dark_channel2(i-r,j-r)=min(In(:));
    end
end
figure
imshow(mat2gray(dark_channel2));
title('dark channel');
%%%transmission map 初始的透射率图像
transm=1-w0*dark_channel2;
clear IminRc dark_channel minRc IminRc
%%%透射率优化 % soft matting 用 guided image filtering
maxRc=zeros(rows,columns);
for i=1:rows,
    for j=1:columns,
        maxRc(i,j)=max(I(i,j,:));
    end
end
r = 11; % try r=2, 4, or 8
eps = 0.2^2; % try eps=0.1^2, 0.2^2, 0.4^2
transm = guidedfilter(maxRc, transm, r, eps);
figure
imshow(mat2gray(transm));
title('transmission map');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Jim=zeros(rows,columns,3);%根据雾霭模型恢复
for i=1:rows,
    for j=1:columns,
        Jim(i,j,1)=(double(I(i,j,1))-A(1))/max([t0,transm(i,j)])+A(1);
        Jim(i,j,2)=(double(I(i,j,2))-A(2))/max([t0,transm(i,j)])+A(2);
        Jim(i,j,3)=(double(I(i,j,3))-A(3))/max([t0,transm(i,j)])+A(3);
    end
end
figure
imshow(mat2gray(Jim));
title('dehazed image');
depth=-log(transm);
figure
imshow(depth);
title('depth image');
end


三、注意事项

订阅后,如果想获取完整数据,请及时私信博主,博主将会提供图片以及主程序。


博主简介:擅长智能优化算法信号处理图像处理机器视觉神经网络等领域Matlab仿真以及实验数据分析等,matlab代码问题、商业合作、课题选题与指导等均可私信交流


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研中心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值