天气对图像的质量有很大的影响,请利用图像分析的相关知识,实现基于暗通道先验的图像去雾算法,对有雾霾的图像进行增强。
原理里式子推导有点多,详细步骤也可以参考这位大大的博客
以及论文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)就可得到去雾的图像了。
如果简洁版原理意犹未尽,可以再看下面详细版原理。
实验发现,暗通道雾图形成模型中参数ω的取值,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
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('目标图');
参考论文: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