基於暗通道先驗條件圖像去霧算法

基於暗通道先驗條件圖像去霧算法

香港大學何凱明博士於2009發表了一篇論文《Single Image Haze Removal Using Dark Channel Prior 》。在文章中,何凱明博士提出了一種簡單而有效的圖像先驗暗通道消除單輸入圖像霧的算法。暗通道先驗是一種無霧室外圖像的統計。這是基於一個關鍵的觀察——大多數無霧室外圖像的局部區域包含一些像素,這些像素在至少一個顏色通道(R,G,B)中的強度非常低。利用這一先驗模型,可以直接估計圖像中薄霧的厚度,並恢復高質量的無薄霧圖像。各種室外霧霾圖像的結果表明了該方法的有效性。此外,作爲除霧的副產物,還可以獲得高質量的深度圖。
在這裏插入圖片描述
圖1 使用單個圖像去除薄霧。
如圖1所示,(a)爲輸入霧度圖像,(b)爲除霧後的圖像,(c)深度圖。
暗通道先驗圖像去霧計算流程:
在這裏插入圖片描述
圖2 暗通道先驗圖像去霧計算過程

1 暗通道圖像

暗通道先驗是基於以下對無霧室外圖像的觀察:在大多數非天空斑塊中,至少有一個顏色通道在某些像素處的強度非常低。換句話說,這樣一個窗口的最小強度值應該很低。形式上,對於圖像j,定義:
在這裏插入圖片描述
其中jc是j的顏色通道,Ω(x)是以x爲中心的一個局部窗口。觀察表明,除了天空區域,jdark的強度較低,如果j是無霧室外圖像,則趨向於零(jdark__>0)。稱jdark爲j的暗通道,上面的統計觀測或知識爲暗通道先驗。

2 透射率圖像

透射率公式推導過程在此不再贅述,請參看《Single Image Haze Removal Using Dark Channel Prior》。
實際上,即使在晴朗的日子裏,大氣也不是絕對沒有任何粒子的。所以,當我們看遠處的物體時,霧仍然存在。此外,霧的存在是一個基本線索或人類感知深度。這種現象叫做空中透視。如果我們徹底消除圖像中的霧,圖像可能會顯得不自然,深度感也可能會消失。所以可以選擇通過在方程中引入一個常數參數ω(0<ω≤1),爲遙遠的物體保留一小部分霧:
在這裏插入圖片描述
其中t(x)爲透射率,ω(0<ω≤1)爲常數參數,Ω(x)是以x爲中心的一個局部窗口,Ac全球大氣光強度,Ic觀察到的強度。

3 帶霧圖像去霧

在這裏插入圖片描述
圖3 去霧效果
如圖3所示,(a)爲輸入霧化圖像,(b)爲透射率圖,©爲Soft Matting後的精細透射圖(d)爲最終無霧圖像。
在這裏插入圖片描述
典型的t0值爲0.1,由於場景的亮度通常不如大氣光的亮度,所以去霧後的圖像看起來很暗淡。因此,增加了J(X)的曝光以達到最佳效果。如圖3(d)是最後恢復的無霧圖像。
在這裏插入圖片描述
圖4 除霧效果
如圖4所示,頂部:輸入模糊圖像。中間:恢復無霧圖像。底部:深度圖。頂部行圖像中的紅色矩形指示的地方爲自動獲取大氣光強的位置。

4 matlab基於暗通道先驗實現圖像去霧

在這裏插入圖片描述
圖5 實驗圖1
在這裏插入圖片描述
圖6 實驗圖2
在這裏插入圖片描述
圖7 實驗圖3
Matlab 源碼:

clear all
close all
clc
 
w0=0.85;   %0.65  乘積因子用來保留一些霧,1時完全去霧     
t0=0.1;
 
 
I=imread('test1.jpg');
 
Ir = I(:,:,1);
[h,w,s]=size(I);
 
min_I=zeros(h,w);
dark_I = zeros(h,w);
%下面取得暗影通道圖像
for i=1:h                 
    for j=1:w
        dark_I(i,j)=min(I(i,j,:));
    end
end
dark_I = uint8(dark_I);
img_dark = ordfilt2(dark_I,1,ones(5,5));
 
Max_dark_channel=double(max(max(img_dark)))  %天空亮度
dark_channel=double(img_dark);
t1=1-w0*(dark_channel/Max_dark_channel);   %取得透謝分佈率圖
t2=max(t1,t0);
T=uint8(t1*255); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I1=double(I);
J(:,:,1) = uint8((I1(:,:,1) - (1-t2)*Max_dark_channel)./t2);
J(:,:,2) = uint8((I1(:,:,2) - (1-t2)*Max_dark_channel)./t2);
J(:,:,3) =uint8((I1(:,:,3) - (1-t2)*Max_dark_channel)./t2);
figure,
set(gcf,'outerposition',get(0,'screensize'));
subplot(221),imshow(I),title('原始圖像');
subplot(222),imshow(J),title('去霧後的圖像');
subplot(223),imshow(img_dark),title('dark channnel的圖形');
subplot(224),imshow(T),title('透射率t的圖形');
imwrite(J,'wu1.jpg');

在這裏插入圖片描述
圖8 實驗結果1
在這裏插入圖片描述
圖9 實驗結果2
在這裏插入圖片描述
圖10 實驗結果3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章