图像去雾-dehaze-defog

图像去雾算法最近应该都是从何凯明博士的CVPR论文衍生出来,论文中基于一种假设:

没有雾的图像的dark_channel值都接近于0,而有雾的图像则不等于0.

将有雾图像的dark_channel值逆向归零,便可恢复出没有雾的图像,达到去雾的效果。

这里简单记录一下算法的过程:

src为有雾的图像。

dst为取出雾的图像。

Darkval是图像局部区域的最小值,w是一个调整系数。

A在论文中的意思是大气中的光成分,

在code中

minAtomsLight=240

dc() = min(img(:,:,:));

dc2 = minfilt2(dc, [krnlsz,krnlsz]);
A = min([minAtomsLight, max(max(dc2))])

dark_channel局部区域的最大值,听起来很拗口。

算法的核心就是这样了。

至于soft matting和guided filter是为了更进一步的提高视觉效果而对算法的完善。

算法中的大量的除法运算给实时性要求比较强的产品带来了不少麻烦,各路豪杰纷纷衍生出的适合自己产品的改进算法。

上几张实验图


很抱歉,我是一名AI语言模型,无法给出完整的代码。但是,我可以给您提供一些用于图像分割的去算法的Matlab函数,您可以参考它们来编写自己的代码。 1. 基于图像梯度的去算法 function result = defog(im) %基于图像梯度的去算法 %输入:im——待处理的图像 %输出:result——去后的图像 if size(im,3)==3 im_gray=rgb2gray(im); else im_gray=im; end %计算图像梯度 gx=[1 0 -1]; gy=[1;0;-1]; Ix=imfilter(double(im_gray),gx); Iy=imfilter(double(im_gray),gy); grad_I=sqrt(Ix.^2+Iy.^2); %计算导向滤波的输出 r=15; eps=0.0001; t=graythresh(im_gray); M=grad_I>t; O=guidedfilter(im_gray,M,r,eps); result=mat2gray(imsubtract(im_gray,O)); end 2. 基于暗通道先验的去算法 function result = defog2(im) %基于暗通道先验的去算法 %输入:im——待处理的图像 %输出:result——去后的图像 %计算暗通道 r=15; J_dark=dark_channel(im, r); %估计大气光 A=estimate_atmospheric_light(im, J_dark); %计算透射率 w=0.95; t=transmission(im, A, w); %去处理 t0=0.1; result=dehaze(im, t, A, t0); end function J_dark = dark_channel(im, r) %计算暗通道 %输入:im——待处理的图像 % r——窗口大小 %输出:J_dark——暗通道 [h, w, c] = size(im); if c==3 im_gray = min(im,[],3); else im_gray = im; end J_dark = zeros(h,w); for i=1:h for j=1:w i_min = max(i-r,1); i_max = min(i+r,h); j_min = max(j-r,1); j_max = min(j+r,w); patch = im_gray(i_min:i_max,j_min:j_max); J_dark(i,j) = min(patch(:)); end end end function A = estimate_atmospheric_light(im, J_dark) %估计大气光 %输入:im——待处理的图像 % J_dark——暗通道 %输出:A——大气光 [h, w, c] = size(im); num_pixels = h*w; num_sample = min(0.001*num_pixels, 10000); J_dark_vec = reshape(J_dark,num_pixels,1); im_vec = reshape(im,num_pixels,c); [~,indices] = sort(J_dark_vec,'descend'); indices = indices(1:num_sample); A = max(im_vec(indices,:),[],1); end function t = transmission(im, A, w) %计算透射率 %输入:im——待处理的图像 % A——大气光 % w——权重 %输出:t——透射率 [h, w, c] = size(im); if c==3 im_gray = min(im,[],3); else im_gray = im; end t = 1-w*dark_channel(im./A, 15); end function result = dehaze(im, t, A, t0) %去处理 %输入:im——待处理的图像 % t——透射率 % A——大气光 % t0——透射率阈值 %输出:result——去后的图像 [h, w, c] = size(im); if c==3 im_gray = rgb2gray(im); else im_gray = im; end t(t<t0) = t0; result = zeros(h,w,c); for i=1:3 im_i = double(im(:,:,i)); result(:,:,i) = (im_i-A(i))./t+A(i); end result(result<0) = 0; result(result>1) = 1; end 3. 基于分层时间聚合的去算法 function result = defog3(im) %基于分层时间聚合的去算法 %输入:im——待处理的图像 %输出:result——去后的图像 %设置参数 N=8; r=15; eps=1e-3; omega=0.9; %初始化 [h, w, c] = size(im); if c==3 im_gray = rgb2gray(im); else im_gray = im; end trans_map=zeros(h,w,N); result=zeros(h,w,c); %计算透射率 for i=1:N t=transmission(im_gray, r, eps); trans_map(:,:,i)=t; im_gray=guidedfilter(im_gray,t,r,eps); end %分层时间聚合 for i=N-1:-1:1 trans_map(:,:,i)=max(trans_map(:,:,i),omega*trans_map(:,:,i+1)); end %去处理 for i=1:3 im_i=double(im(:,:,i)); A_i=max(im_i(:)); trans_i=trans_map(:,:,1); result_i=(im_i-A_i)./trans_i+A_i; result(:,:,i)=result_i; end result(result<0) = 0; result(result>1) = 1; end 以上就是三种基于图像分割的去算法的Matlab函数,您可以按照需要进行调用和修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值