理论见博客:

http://www.cnblogs.com/changkaizhao/p/3266798.html

http://www.cnblogs.com/Imageshop/p/3281703.html

由于课程作业的需要,仅仅进行简单研究。

1.主函数

clc;
clear all;
close all;
J = imread('4.jpg');
J = double(J);
J = J ./255 ;
figure(1); imshow(J);
%% 求暗通道图像 Jdark = min(min());
Jdark = Idark(J);
figure(2);imshow(Jdark,[]);%%
% 注意:何凯明使用了soft matting方法对得到的粗透射率Jt进行细化
%       本代码采用梯度导向滤波实现
Jdark = gradient_guidedfilter(Jdark,Jdark, 0.04);
figure(3);imshow(Jdark,[]);
%% 大气物理模型 J = I*t + A*(1-t)  【直接衰减项】+【大气光照】
% 透射率 t与深度的关系 t=exp(-a*depth)
w = 0.95;         %雾的保留系数
Jt = 1 - w*Jdark; %求解透射率%% 求解全局大气光照
% 1.首先对输入的有雾图像I求解其暗通道图像Jdark。
% 2.选择Jdark总像素点个数千分之一(N/1000)个最亮的像素点,记录像素点(x,y)坐标
% 3.根据点的坐标分别在原图像J的三个通道(r,g,b)内找到这些像素点并加和得到(sum_r,sum_g,sum_b).
% 4.Ac=[Ar,Ag,Ab]. 其中Ar=sum_r/N;   Ag=sum_g/N;   Ab=sum_b/N.
[m,n,~] = size(J);
N = floor( m*n./1000 );
MaxPos = [0,0]; % 初始化
for i=1:1:NMaxValue = max(max(Jdark));[x,y] = find(Jdark==MaxValue);Jdack(Jdark==MaxValue) = 0; %最大值置零,寻找下一次次大值%检查长度MaxPos = vertcat(MaxPos,[x,y]);Cnt = length(MaxPos(1));if Cnt > Nbreak;end
end
MaxPosN = MaxPos(2:N+1,:);Rsum = 0;  Jr = J(:,:,1);
Gsum = 0;  Jg = J(:,:,2);
Bsum = 0;  Jb = J(:,:,3);
for j=1:1:NRsum = Rsum + Jr(MaxPosN(j,1),MaxPosN(j,2));Gsum = Gsum + Jg(MaxPosN(j,1),MaxPosN(j,2));Bsum = Bsum + Jb(MaxPosN(j,1),MaxPosN(j,2));
endAc = [Rsum/N, Gsum/N, Bsum/N];%% 求解清晰的图像
% 根据 J = I*t + A*(1-t)   I = (J-A)/Jt + A
Iorg = zeros(m,n,3);
for i = 1:1:mfor j = 1:1:nfor k = 1:1:3Iorg(i,j,k) = (J(i,j,k)-Ac(k)) ./ Jt(i,j) + Ac(k);endend
end
figure(4); imshow(Iorg,[]);

2.暗通道函数

function Jdark = Idark( I )
% output: Jdark = min(min(r),min(g),min(b));
Wnd = 3;
Ir = I(:,:,1);
Ig = I(:,:,2);
Ib = I(:,:,3);
%% 图像拓展
[m,n,~] = size(I);
Irr = zeros(m+Wnd-1, n+Wnd-1);
Irr((Wnd-1)/2 : m+(Wnd-1)/2-1 , (Wnd-1)/2 : n+(Wnd-1)/2-1 ) = Ir;
Igg = zeros(m+Wnd-1, n+Wnd-1);
Igg((Wnd-1)/2 : m+(Wnd-1)/2-1 , (Wnd-1)/2 : n+(Wnd-1)/2-1 ) = Ig;
Ibb = zeros(m+Wnd-1, n+Wnd-1);
Ibb((Wnd-1)/2 : m+(Wnd-1)/2-1, (Wnd-1)/2 : n+(Wnd-1)/2-1 ) = Ib;
%% 暗通道
for i=1:1:mfor j=1:1:nRmin = min(min ( Irr(i:i+Wnd-1, j:j+Wnd-1) ));Gmin = min(min ( Igg(i:i+Wnd-1, j:j+Wnd-1) ));Bmin = min(min ( Ibb(i:i+Wnd-1, j:j+Wnd-1) ));Jdark(i,j) = min(min(Rmin,Gmin),Bmin);end
endend

3.基于梯度的指导滤波器

function q = gradient_guidedfilter(I, p, eps)
%   GUIDEDFILTER   O(1) time implementation of guided filter.
%
%   - guidance image: I (should be a gray-scale/single channel image)
%   - filtering input image: p (should be a gray-scale/single channel image)
%   - regularization parameter: eps  r=16;
[hei, wid] = size(I);
N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.  mean_I = boxfilter(I, r) ./ N;
mean_p = boxfilter(p, r) ./ N;
mean_Ip = boxfilter(I.*p, r) ./ N;
cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.  mean_II = boxfilter(I.*I, r) ./ N;
var_I = mean_II - mean_I .* mean_I;  %weight
epsilon=(0.001*(max(p(:))-min(p(:))))^2;
r1=1;  N1 = boxfilter(ones(hei, wid), r1); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.
mean_I1 = boxfilter(I, r1) ./ N1;
mean_II1 = boxfilter(I.*I, r1) ./ N1;
var_I1 = mean_II1 - mean_I1 .* mean_I1;  chi_I=sqrt(abs(var_I1.*var_I));
weight=(chi_I+epsilon)/(mean(chi_I(:))+epsilon);       gamma = (4/(mean(chi_I(:))-min(chi_I(:))))*(chi_I-mean(chi_I(:)));
gamma = 1 - 1./(1 + exp(gamma));  %result
a = (cov_Ip + (eps./weight).*gamma) ./ (var_I + (eps./weight));
b = mean_p - a .* mean_I;   mean_a = boxfilter(a, r) ./ N;
mean_b = boxfilter(b, r) ./ N;  q = mean_a .* I + mean_b;
end  
function imDst = boxfilter(imSrc, r)  %   BOXFILTER   O(1) time box filtering using cumulative sum
%
%   - Definition imDst(x, y)=sum(sum(imSrc(x-r:x+r,y-r:y+r)));
%   - Running time independent of r;
%   - Equivalent to the function: colfilt(imSrc, [2*r+1, 2*r+1], 'sliding', @sum);
%   - But much faster.  [hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));  %cumulative sum over Y axis
imCum = cumsum(imSrc, 1);
%difference over Y axis
imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);
imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);  %cumulative sum over X axis
imCum = cumsum(imDst, 2);
%difference over X axis
imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);
imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);
end  

4.输出结果

5.参考文献

[1] He K, Sun J, Tang X. Single image haze removal using dark channel prior[C]// Computer Vision and Pattern Recognition, 2009. CVPR 2009. IEEE Conference on. IEEE, 2009:1956-1963.
[2] Kou F, Chen W, Wen C, et al. Gradient Domain Guided Image Filtering.[J]. Image Processing IEEE Transactions on, 2015, 24(11):4528-4539.

基于暗通道优先算法的去雾应用Matlab相关推荐

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

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

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

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

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

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

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

    声明:原创内容,创作不易,欢迎点赞收藏~ 摘    要 随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用.然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导 ...

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

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

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

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

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

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

  8. 一种基于暗通道先验算法的图像去雾技术研究

    目录 一.绪论 二.雾霭图像模型与暗通道先验 三.透射率估计 四.大气光值估计 五.实例分析 参考文献 一.绪论 图像去雾技术,是由何凯明.孙健等人在CVPR2009提出来的,并获得当年CVPR最佳论 ...

  9. 图像去雾算法(二)基于暗通道先验算法学习笔记

    在http://write.blog.csdn.net/postedit/78301999中介绍了图像去雾的相关研究方法,发现目前为止在图像去雾方面,何凯明博士基于暗通道先验的算法具有很好的效果,关于 ...

最新文章

  1. java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客
  2. js阿拉伯数字转中文大写
  3. 面试官让我讲下线程的TIMED_WAITING状态,我又笑了
  4. 会议交流 | CAAI BDSC2021大会专题七:社会计算与开放知识图谱
  5. Android P版自定义开关机动画
  6. PhoneGap对比html5写android应用程序【android进化三十八】
  7. JavaScript:语言精粹
  8. 介绍几个 window 下面的terminal
  9. 机器学习(5)——决策树(预测隐形眼镜类型)
  10. SQL中计算字符串的长度函数
  11. 125款浪漫七夕表白网站源码【建议收藏】HTML+CSS+JavaScript
  12. 钠离子电池翻红:“锂焦虑”之下的望梅止渴
  13. Calendars and Reminders
  14. java不能覆盖父类的_java中子类覆盖父类方法所必须满足的条件
  15. bilibili_Linux网络基础5_SSH远程管理服务
  16. 10.9 顾z校内互坑题
  17. 运动目标检测ViBe算法的armadillo实现
  18. 【解决方案】摄像机户外直播能在哪些地方运用?团建/项目启动会/户外婚礼等户外直播方案介绍
  19. 微信小程序----封装request以及对接口进行模块化
  20. 网络安全 渗透 攻防2 (DOS基本指令与批处理)

热门文章

  1. SpringMvc 集成 shiro 实现权限角色管理-maven
  2. 【开卷故意】记录一次高并发下的死锁解决思考过程
  3. J-4 Java语言基础
  4. C语言位操作--不用中间变量交换两数值
  5. IOS定位核心与地图
  6. Android SingleTask启动模式与Home键的问题
  7. Mac系统下安装Homebrew后无法使用brew命令
  8. mongodb安装.
  9. [NOIp2017提高组]奶酪(BFS)
  10. MySQL表最大能达到多少?