Fattal去雾算法介绍

Single Image Dehazing

Raanan Fattal

Hebrew University of Jerusalem,Israel

      这篇文章提出一种新的从单幅输入图像中估计传输函数的方法。新方法中,重新定义了大气传输模型,大气散射模型中除了传输函数(transmission function)这个变量外,还增加了表面阴影(surface shading)这个变量。作者假设一个前提,表面阴影和传输函数是统计无关的,根据这一前提对大气散射模型进行运算分析,即可求得传输函数并对图像去雾。

      作者首先介绍了大气散射模型:

      该式定义域RGB三颜色通道空间,表示探测系统获取的图像,是无穷远处的大气光,表示目标辐射光,即需要回复的目标图像,表示传输函数,即光在散射介质中传输经过衰减等作用能够到达探测系统的那一部分的光的比例。坐标向量表示探测系统获取的图像中每一个像素的坐标位置。

      对大气散射模型进行变形,将需要恢复的目标图像视作表面反射系数(surface albedo coefficients)和阴影系数(shading factor)的按坐标的点乘,即,其中为三通道向量,是描述在表面反射的光的标量。即的尺度与相同,为彩色图像,为灰度图像。为了简化,假设在某区域内为常数,即在像素区域内,为常数。则大气散射模型变为:

       将向量分解成两个部分,一部分为与大气光平行的向量,另一部分为与大气光垂直的残留向量(residual vector),记作,且表示与大气光向量垂直的所有向量构成的向量空间。如图所示,向量与向量之间的夹角为,从的端点引垂线到,垂足与的端点的连线即为向量

       对于重新定义的大气散射模型中的,将其写成平行于的向量于平行于的向量之和

         其中,记作为表面反射和大气光的相关量或相关系数,表示在RGB空间中的两个三维向量的点积。

       为了获得独立的方程,求取输入图像沿着大气光向量的那一分量(标量)为:

 

则输入图像沿着方向的那一分量(标量)为:

(因为向量和向量垂直,所以

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fattal的去雾代码是一种基于暗通道先验和双边滤波的图像去雾方法,可以去除图像中的雾霾和浓雾效果。以下是Fattal的去雾代码的MATLAB实现: ```matlab function J = FattalDehaze(I, tmin, AirlightMethod, omega, lambda, sigma) % I: 带雾图像 % tmin: 最小透射率 % AirlightMethod: 估算大气光的方法,可以选择'fast'或'refine' % omega: 噪声方差权重 % lambda: 正则化参数 % sigma: 双边滤波器的空间标准差 % 计算暗通道先验 dark = darkChannel(I, 15); % 估算大气光 A = airlight(I, dark, AirlightMethod); % 估算透射率 t = transmissionEstimate(I, A, sigma, lambda); % 使最小透射率为tmin t = max(t, tmin); % 恢复原始图像 J = recover(I, A, t, omega); end function dark = darkChannel(I, sz) % I: 输入图像 % sz: 窗口大小 % 计算暗通道 if size(I,3)==3 I = rgb2gray(I); end dark = imerode(I, strel('rectangle', [sz sz])); end function A = airlight(I, dark, method) % I: 输入图像 % dark: 暗通道先验 % method: 估算大气光的方法,可以选择'fast'或'refine' % 估算大气光 if strcmp(method, 'fast') [M, N] = size(I); flatI = reshape(I, M*N, 1); flatdark = reshape(dark, M*N, 1); [~, indices] = sort(flatdark, 'descend'); indices = indices(1:round(0.001*M*N)); A = max(flatI(indices)); elseif strcmp(method, 'refine') A = max(I, [], 3); A = imerode(A, strel('rectangle', [15 15])); end end function t = transmissionEstimate(I, A, sigma, lambda) % I: 输入图像 % A: 估算的大气光 % sigma: 双边滤波器的空间标准差 % lambda: 正则化参数 % 估算透射率 I = im2double(I); temp = imdivide((I - A), max(A, 0.1)); temp = rgb2gray(temp); t = 1 - lambda * imfilter(temp, fspecial('gaussian', [15 15], sigma)); end function J = recover(I, A, t, omega) % I: 输入图像 % A: 估算的大气光 % t: 估算的透射率 % omega: 噪声方差权重 % 恢复原始图像 J = zeros(size(I)); for i = 1:3 J(:,:,i) = (I(:,:,i) - A(i)) ./ max(t, 0.1) + A(i); end J = imadjust(J, [0, 1], [0, 1], omega); end ``` 需要注意的是,这是一种基于暗通道先验和双边滤波的图像去雾方法,它对图像进行了一些假设,比如假设雾霾是均匀分布的,大气光是全局的,透射率是空间不变的等等。在实际应用中,可能需要根据具体情况对这些假设进行调整,以获得更好的去雾效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值