DIA实验——图像去雾

图像去雾

实验内容

天气对图像的质量有很大的影响,请利用图像分析的相关知识,实现基于暗通道先验的图像去雾算法,对有雾霾的图像进行增强。

简洁版原理

原理里式子推导有点多,详细步骤也可以参考这位大大的博客
以及论文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)就可得到去雾的图像了。
如果简洁版原理意犹未尽,可以再看下面详细版原理。

详细版原理说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验步骤

  1. 首先求出待去雾图像I每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波窗口使用15×15规格。
  2. 对暗通道矩阵元素从大到小排序,从暗通道图中按照亮度的大小取前0.1%的像素,将所得通道像素取最大值作为暗通道中最亮的阈值点集,并记录暗通道阈值点集的位置。
  3. 根据暗通道所取阈值和位置,找到原图对应位置里的最亮通道值,构造全局大气光A矩阵。
  4. 根据所得全局大气光A与原图所得最小值通道矩阵,即暗通道,求透射率t。
  5. 将所得参数代入雾图形成模型,求目标图像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
图 1 haze1_w0.95_Amin_histeq_filt15
图 2 haze2_w0.95_Amin_histeq_filt1
图 2 haze2_w0.95_Amin_histeq_filt15
图 3 haze3_w0.95_Amin_histeq_filt15
图 3 haze3_w0.95_Amin_histeq_filt15
图 4 haze4_w0.95_Amin_histeq_filt15
图 4 haze4_w0.95_Amin_histeq_filt15
图 5 haze5_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
图 6 haze1_w0.95_Amin_histeqNO_filt15
图 7 haze1_w0.95_Amax_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
图 8 haze4_w0.95_Amin_histeqNO_filt15
图 9 haze4_w0.8_Amin_histeqNO_filt15
图 9 haze4_w0.8_Amin_histeqNO_filt15
图 10 haze4_w0.6_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
图 11 haze2_w0.95_Amin_histeqNO_filt15
图 12 haze2_w0.95_Amin_histeq_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('目标图');


实验结论

  1. A的取值决定了全局大气光的强度,A取小于等于限定阈值的暗通道对应原图最亮阈值则图片光源偏暗,反之偏亮。
  2. 参数ω的取值主要影响去雾程度,越大则去雾效果越强。
  3. 图像后期进行直方图拉伸的图像增强会使图像更加鲜艳易辨识。
  4. 其他影响参数,如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

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