[論文復現]何愷明博士CVPR2009去霧算法(2)
一、前言
終於,簡單實現了何博士論文去霧算法的基礎部分。由於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)