圖像去霧
實驗內容
天氣對圖像的質量有很大的影響,請利用圖像分析的相關知識,實現基於暗通道先驗的圖像去霧算法,對有霧霾的圖像進行增強。
簡潔版原理
原理裏式子推導有點多,詳細步驟也可以參考這位大大的博客
以及論文n He K, Sun J, Tang X. Single image haze removal using dark channel prior[J]. IEEE CVPR, 2009.
簡單來說,主要使用的是下面這個公式的原理:
其中,
I(X):我們現在已經有的圖像(待去霧的圖像);
J(x):我們要恢復的無霧的圖像;
A:全球大氣光成分;
t(x):透射率。
現在的已知條件就是I(X),要求目標值J(x)。
其中,全局大氣光A可以從暗通道圖中按照亮度的大小取前0.1%的像素進行處理取得,再按照下面的公式可算得透射率:
最後代入原式求J(x)就可得到去霧的圖像了。
如果簡潔版原理意猶未盡,可以再看下面詳細版原理。
詳細版原理說明
實驗步驟
- 首先求出待去霧圖像I每個像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然後再對這幅灰度圖進行最小值濾波,濾波窗口使用15×15規格。
- 對暗通道矩陣元素從大到小排序,從暗通道圖中按照亮度的大小取前0.1%的像素,將所得通道像素取最大值作爲暗通道中最亮的閾值點集,並記錄暗通道閾值點集的位置。
- 根據暗通道所取閾值和位置,找到原圖對應位置裏的最亮通道值,構造全局大氣光A矩陣。
- 根據所得全局大氣光A與原圖所得最小值通道矩陣,即暗通道,求透射率t。
- 將所得參數代入霧圖形成模型,求目標圖像J。
實驗效果
實驗發現,暗通道霧圖形成模型中參數ω的取值,t_0的取值,A的取法,濾波窗口大小以及圖像的後期增強處理等因素均會對目標圖像效果造成不同程度的影響。在此將不同實驗下的效果圖進行分類討論與對比。
首先,設置ω取值0.95,t_0取值0.1,A取小於等於限定閾值的暗通道對應原圖最亮閾值,濾波窗口大小爲15×15,圖像後期進行直方圖拉伸的增強處理。如圖 1 haze1_w0.95_Amin_histeq_filt15、圖 2 haze2_w0.95_Amin_histeq_filt15、圖 3 haze3_w0.95_Amin_histeq_filt15、圖 4 haze4_w0.95_Amin_histeq_filt15、圖 5 haze5_w0.95_Amin_histeq_filt15所示。
圖 1 haze1_w0.95_Amin_histeq_filt15
圖 2 haze2_w0.95_Amin_histeq_filt1
圖 3 haze3_w0.95_Amin_histeq_filt15
圖 4 haze4_w0.95_Amin_histeq_filt15
圖 5 haze5_w0.95_Amin_histeq_filt15
接下來研究A的取值方式對實驗效果的影響,以“haze1”樣本爲例,分別A取小於等於限定閾值與大於等於限定閾值的暗通道對應原圖最亮閾值進行對比。其他參數:t_0取值0.1,濾波窗口大小爲15×15,圖像後期不進行直方圖拉伸的增強處理。如圖 6 haze1_w0.95_Amin_histeqNO_filt15、圖 7 haze1_w0.95_Amax_histeqNO_filt15所示。
圖 6 haze1_w0.95_Amin_histeqNO_filt15
圖 7 haze1_w0.95_Amax_histeqNO_filt15
接下來研究ω的取值對實驗效果的影響,以“haze4”樣本爲例,分別設置ω取值0.95、0.8、0.6進行對比。其他參數:t_0取值0.1,A取小於等於限定閾值的暗通道對應原圖最亮閾值,濾波窗口大小爲15×15,圖像後期不進行直方圖拉伸的增強處理。如圖 8 haze4_w0.95_Amin_histeqNO_filt15、圖 9 haze4_w0.8_Amin_histeqNO_filt15、圖 10 haze4_w0.6_Amin_histeqNO_filt15所示。
圖 8 haze4_w0.95_Amin_histeqNO_filt15
圖 9 haze4_w0.8_Amin_histeqNO_filt15
圖 10 haze4_w0.6_Amin_histeqNO_filt15
接下來研究圖像後期的增強處理對實驗效果的影響,以“haze2”樣本爲例,分別設置圖像後期進行與不進行直方圖拉伸的增強處理進行對比。其他參數:t_0取值0.1,A取小於等於限定閾值的暗通道對應原圖最亮閾值,濾波窗口大小爲15×15。如圖 11 haze2_w0.95_Amin_histeqNO_filt15、圖 12 haze2_w0.95_Amin_histeq_filt15所示。
圖 11 haze2_w0.95_Amin_histeqNO_filt15
圖 12 haze2_w0.95_Amin_histeq_filt15
實驗代碼(Matlab)
HazeRemoval.m
clear;
close all;
clc;
%% 基於暗通道的去霧算法
I = imread('../test images/haze2.jpg');
PR=I(:,:,1); %提取紅色分量
PG=I(:,:,2); %提取綠色分量
PB=I(:,:,3); %提取藍色分量
gray = min(min(PR,PG),PB);
Jdark=ordfilt2(gray,1,ones(15,15)); %最小值濾波,得到暗通道
%從暗通道圖中按照亮度的大小取前0.1最亮的像素
[t, index] = sort(Jdark(:)', 'descend');
n = ceil(length(Jdark)*0.001) %前0.1的像素個數
threshold = max(t(1:n)); %暗通道中最亮的閾值
index(1:n); %暗通道閾值點集的位置
%根據暗通道所取閾值和位置,找到原圖對應位置裏的最亮通道值,構造全局大氣光A矩陣
R = PR(:)';
G = PG(:)';
B = PB(:)';
for i = 1:n %結合閾值求原圖通道最大值
a = min(threshold, max(max(R(index(i)), G(index(i))), B(index(i))));
end
A = max(a)
%求透射率t
w = 0.95;
A = I*0 + A;
t = 1 - w*double(gray)./double(A(:,:,1)); %存在負數
tmean = mean(mean(t))
%求目標圖像J
t = max(t,0.1); %除去負數,防止白場過渡
J(:,:,1) = (double(PR) - double(A(:,:,1)))./t + double(A(:,:,1));
J(:,:,2) = (double(PG) - double(A(:,:,2)))./t + double(A(:,:,2));
J(:,:,3) = (double(PB) - double(A(:,:,3)))./t + double(A(:,:,3));
J = uint8(J); %一定要轉回與I相同的類型,不然顯示不出(用round無效)
%直方圖均衡化
J(:,:,1) = histeq(J(:,:,1));
J(:,:,2) = histeq(J(:,:,2));
J(:,:,3) = histeq(J(:,:,3));
figure;
subplot(2,2,1);imshow(I);title('原圖像');
subplot(2,2,2);imshow(Jdark);title('暗通道');
subplot(2,2,3);imshow(t);title('透射率圖');
subplot(2,2,4);imshow(J);title('目標圖');
實驗結論
- A的取值決定了全局大氣光的強度,A取小於等於限定閾值的暗通道對應原圖最亮閾值則圖片光源偏暗,反之偏亮。
- 參數ω的取值主要影響去霧程度,越大則去霧效果越強。
- 圖像後期進行直方圖拉伸的圖像增強會使圖像更加鮮豔易辨識。
- 其他影響參數,如t_0的取值,本實驗中統一取了0.001,但此參數在圖像較小的條件下,對圖像處理的影響不大。
參考
參考論文:n He K, Sun J, Tang X. Single image haze removal using dark channel prior[J]. IEEE CVPR, 2009.
參考博文:https://www.cnblogs.com/Imageshop/p/3281703.html