[论文复现]何恺明博士CVPR2009去雾算法

Posted bamboopu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[论文复现]何恺明博士CVPR2009去雾算法相关的知识,希望对你有一定的参考价值。

一、前言

终于,简单实现了何博士论文去雾算法的基础部分。由于CVPR2009论文中的优化方法比较麻烦,速度比较慢,何博士于2010ECCV补充了一篇Guided Image Filtering优化求解速度,此处后面的优化我直接调用了何博士的函数。

主要参考文献:

[1] He K, Jian S, Tang X. Single image haze removal using dark channel prior[C]// IEEE Conference on Computer Vision & Pattern Recognition. 2009.

[2] He K, Jian S, Tang X. Guided image filtering[C]// European Conference on Computer Vision. 2010.

[3] 论文原文及相关资料下载 http://kaiminghe.com/

关键词:暗通道先验、去雾、导向滤波

 

二、实现

论文求解核心公式是:

技术分享图片

现有图已知,未知量为待求图,全局大气光和未被散射光。

A全局大气光采用亮度值(hsv-v)最高的前0.1%像素的rgb值去分别估计三通道的全局大气光

t(x)未被散射光结合暗通道先验公式如下去估计。

技术分享图片

因此即可求待求图J(x),为了控制误差,对t(x)做一个最小值约束,计算公式如下:

技术分享图片

 

三、代码

mydehaze.m

%%
% 未被散射系数t估计
% 2018年12月29日
% 使用方法:
% Yuquan Campus, bamboopu
% 待改进功能:

%%
% clean
close all;
clear;
clc;

%%
% 读图显示图片
a_rgb=im2double(imread(‘tiananmen1.bmp‘));
% a_rgb=im2double(imread(‘stone.jpg‘));
a_gray=rgb2gray(a_rgb);
[height,weight,scale]=size(a_rgb);
% 转hsv
a_hsv=rgb2hsv(a_rgb);
% 暗通道,min(x,[],3)取每个像素位置最小值
c_minrgb=min(a_rgb,[],3);% 先取RGB最小
radius=15;
c_dark=ordfilt2(c_minrgb,1,ones(radius,radius),‘symmetric‘);%窗口最小值滤波
% 暗通道灰度对比
imwrite(c_dark,‘c_dark.bmp‘);
fig=figure;
h1=subplot(1,2,1);
imshow(c_dark);
title(‘The dark channel image‘);
h2=subplot(1,2,2);
imshow(a_gray);
title(‘The grayscale image‘);
% 全局大气光估计(采用最高亮度值)
k_find=0.001;
k_pixel=fix(k_find*height*weight);
k_sort=sort(c_dark(:),‘descend‘);
k_threshold=k_sort(k_pixel);
a_v=a_hsv(:,:,1);
a_v(c_dark<k_threshold)=0;
% ar估计
a_rgb_max=a_rgb(:,:,1);
a_rgb_max(a_v==0)=[];
a_rgb_max=a_rgb_max(:);
ar=sum(a_rgb_max)/length(a_rgb_max);
% ag估计
a_rgb_max=a_rgb(:,:,2);
a_rgb_max(a_v==0)=[];
a_rgb_max=a_rgb_max(:);
ag=sum(a_rgb_max)/length(a_rgb_max);
% ab估计
a_rgb_max=a_rgb(:,:,3);
a_rgb_max(a_v==0)=[];
a_rgb_max=a_rgb_max(:);
ab=sum(a_rgb_max)/length(a_rgb_max);
% ar ag ab最大值修正
max_a=255/255;
if ar>max_a
    ar=max_a;
end
if ag>max_a
    ag=max_a;
end
if ab>max_a
    ab=max_a;
end
% t(x)估计
a_rgb_a=zeros(height,weight,scale);
a_rgb_a(:,:,1)=a_rgb(:,:,1)/ar;
a_rgb_a(:,:,2)=a_rgb(:,:,2)/ag;
a_rgb_a(:,:,3)=a_rgb(:,:,3)/ab;
a_rgb_a_min=min(a_rgb_a,[],3);% 先取RGB最小
w=0.95;
tx=1-w*ordfilt2(a_rgb_a_min,1,ones(radius,radius),‘symmetric‘);
imwrite(tx,‘tx.bmp‘);
% 白场过渡
t0=0.1;
tx(tx<0.1)=0.1;
%tx=guidedfilter_color(a_rgb,tx,100,0.04);
tx=guidedfilter(a_gray,tx,60,0.01);
imwrite(tx,‘tx_guided.bmp‘);
figure;imshow(tx);
% 简化版去雾图估计-rgb
dh_rgb=zeros(height,weight,scale);
dh_rgb(:,:,1)=(a_rgb(:,:,1)-ar)./tx+ar;
dh_rgb(:,:,2)=(a_rgb(:,:,2)-ag)./tx+ag;
dh_rgb(:,:,3)=(a_rgb(:,:,3)-ab)./tx+ab;
figure;
h1=subplot(1,2,1);
imshow(dh_rgb);
title(‘The dehaze image‘);
h2=subplot(1,2,2);
imshow(a_rgb);
title(‘The origin image‘);
imwrite(dh_rgb,‘dh_rgb.bmp‘);

guidedfilter.m

function q = guidedfilter(I, p, r, 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)
%   - local window radius: r
%   - regularization parameter: eps

[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;

a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;
b = mean_p - a .* mean_I; % Eqn. (6) in the paper;

mean_a = boxfilter(a, r) ./ N;
mean_b = boxfilter(b, r) ./ N;

q = mean_a .* I + mean_b; % Eqn. (8) in the paper;
end

  

 

四、效果

技术分享图片

图4-1暗通道与灰度图对比

技术分享图片

图4-2暗通道经导向滤波优化后结果

技术分享图片

图4-3去雾效果图

技术分享图片技术分享图片

图4-4优化前后去雾效果对比

 

五、心得

大音希声,大象无形。这篇论文关键部分的原理很简单明了,作为何博士第一篇文章,精雕细琢质量很高适合精读。论文求解模糊去雾图部分实现起来较为简单,但是优化部分编程具有一定难度。本文优化部分直接调用了官方导向滤波函数,去雾后的色调饱和度调整未添加,程序仅供参考。

 


以上是关于[论文复现]何恺明博士CVPR2009去雾算法的主要内容,如果未能解决你的问题,请参考以下文章

[论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)

何恺明一作论文 MAE 已有人复现!Pytorch版

CVPR 2021大奖公布!何恺明获最佳论文提名,代码已开源!

CVPR 2021大奖公布!何恺明获最佳论文提名,代码已开源!

何恺明上榜CVPR 2021获奖名单,4篇「最佳」是华人一作

何恺明时隔2年再发一作论文:为视觉大模型开路,“CVPR 2022最佳论文候选预定”...