1. 程式人生 > >[論文復現]何愷明博士CVPR2009去霧算法(2)

[論文復現]何愷明博士CVPR2009去霧算法(2)

波函數 基礎 rgb2gray mat 部分 cvpr .com tle symmetric

一、前言

終於,簡單實現了何博士論文去霧算法的基礎部分。由於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去霧算法(2)