基于暗通道优先算法的去雾应用Matlab
理论见博客:
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相关推荐
- 基于暗通道优先算法的去雾应用(Matlab/C++)
基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理: 参见论文:Single Image Haze Removal Using Dark Channel Pri ...
- 暗通道优先的图像去雾算法(上)
FROM:http://blog.csdn.net/baimafujinji/article/details/27206237 11.1 暗通道优先的图像去雾算法 图像增强与图像修复二者之间有一定交 ...
- matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法
基于暗通道先验条件图像去雾算法 香港大学何凯明博士于2009发表了一篇论文<Single Image Haze Removal Using Dark Channel Prior>.在文章中 ...
- 【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)
声明:原创内容,创作不易,欢迎点赞收藏~ 摘 要 随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用.然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导 ...
- 暗通道优先的图像去雾算法(下)
FROM:http://blog.csdn.net/baimafujinji/article/details/30060161 书接上文 http://blog.csdn.net/baimafujin ...
- 基于暗通道优先的单幅图像去雾算法(Matlab)
基于暗通道优先的单幅图像去雾算法(Matlab) 每一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几乎趋向于0.基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法. 首 ...
- 基于MATLAB改进暗通道先验的图像去雾算法
基于MATLAB改进暗通道先验的图像去雾算法 摘要:暗通道先验去雾算法求得的的透射率比较精细,去雾效果优于大多数去雾算法.然而在暗通道求取过程中,最小值滤波的处理会使得暗色向外扩张,导致透射率扩张变大 ...
- 一种基于暗通道先验算法的图像去雾技术研究
目录 一.绪论 二.雾霭图像模型与暗通道先验 三.透射率估计 四.大气光值估计 五.实例分析 参考文献 一.绪论 图像去雾技术,是由何凯明.孙健等人在CVPR2009提出来的,并获得当年CVPR最佳论 ...
- 图像去雾算法(二)基于暗通道先验算法学习笔记
在http://write.blog.csdn.net/postedit/78301999中介绍了图像去雾的相关研究方法,发现目前为止在图像去雾方面,何凯明博士基于暗通道先验的算法具有很好的效果,关于 ...
最新文章
- java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客
- js阿拉伯数字转中文大写
- 面试官让我讲下线程的TIMED_WAITING状态,我又笑了
- 会议交流 | CAAI BDSC2021大会专题七:社会计算与开放知识图谱
- Android P版自定义开关机动画
- PhoneGap对比html5写android应用程序【android进化三十八】
- JavaScript:语言精粹
- 介绍几个 window 下面的terminal
- 机器学习(5)——决策树(预测隐形眼镜类型)
- SQL中计算字符串的长度函数
- 125款浪漫七夕表白网站源码【建议收藏】HTML+CSS+JavaScript
- 钠离子电池翻红:“锂焦虑”之下的望梅止渴
- Calendars and Reminders
- java不能覆盖父类的_java中子类覆盖父类方法所必须满足的条件
- bilibili_Linux网络基础5_SSH远程管理服务
- 10.9 顾z校内互坑题
- 运动目标检测ViBe算法的armadillo实现
- 【解决方案】摄像机户外直播能在哪些地方运用?团建/项目启动会/户外婚礼等户外直播方案介绍
- 微信小程序----封装request以及对接口进行模块化
- 网络安全 渗透 攻防2 (DOS基本指令与批处理)