【图像增强】基于matlab暗通道图像去雾【含Matlab源码 1226期】
一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【图像增强】基于matlab暗通道图像去雾【含Matlab源码 1226期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:
订阅紫极神光博客付费专栏,可免费获得2份代码(有效期为订阅日起,三天内有效);
二、简介
1 暗通道先验图像去雾方法
1.1 光线透射率模型
光在传播中由于散射使得从光源发出的辐射只有部分能到达接收传感器,其他则被散射到传播介质中。假设距离较小时散射光强与距离是线性关系,当光源距离传感器无限接近时,光的衰减值可近似为:Br,其中β为空气的散射系数;r为光源与传感器间的距离。大气密度均匀时,光线透射率的数学模型为:
式中:D为场景深度;t为光线透射率,用于量化传感器接收光强与光源表面光强间的比例关系,即没有被散射的辐射与光源辐射间的比例关系。
1.2 暗通道先验理论
基于统计大量清晰图像得到的暗通道先验理论是指大部分不含天空的优质图像的所有像素在R,G,B这3个通道中最少存在一个颜色通道灰度值相当低以至趋近于0[5],也就是在一定的微小区域里最小辐射强度值极低。一幅图像J可定义为:
式中:J dark为图像J的暗通道值; J为图像J的c通道灰度值; Q(x) 为以像素x为中心的局部微小区域; y为区域内任一像素。
1.3 暗通道先验图像去雾处理
图像去雾的目标是将传感器接收到的有雾图像利用获得的有用信息通过去雾还原出清晰图像。暗通道先验图像去雾处理是根据暗通道原理获取先验知识,再利用有雾图像退化模型实现图像去雾效果。
1.3.1 图像退化模型
在计算机视觉图形学领域,有雾图像的退化模型为[6]:
式中:l(x)为传感器接收到的场景信号,即输入的有雾影像;场景辐射J(x)为信号处理后的清晰图像;A为环境光照强度;t(x)为大气透射率。J(x)t(x)称为直接衰减项,用来量化场景辐射和传播中的信号损失。A(1-t(x))表示图像接收到的大气散射光强,它是引起色彩偏移和云雾效果的直接原因。
1.3.2 估算环境光照强度
暗通道图像中灰度值越高的区域云雾越厚,在输入图像中位于这部分区域的]像素灰度值越接近于环境光照强度。估算环境光照强度首先需要找到暗通道图像中灰度值最高并占图像总像素数量01%的像素点,记录它们对应的坐标索引,然后根据坐标索引在输入的有雾图像中找到对应像素点,计算有雾图像中对应像素点的灰度平均值作为环境光照强度A。
1.3.3估算大气透射率
使用t’(x)表示以像素x为中心的滤波窗口内的大气透射率,假设它局部不变对式(3)最小值运算,分别计算R,G,B这3个颜色通道中的最小值,即
将3个颜色通道的最小值进行运算,可得出以像素x为中心的滤波窗口内的灰度最小值,即
根据暗通道先验原理和式(2)可以得出:
于是,由式(5)和式(6)计算出大气透射率为:
1.3.4 去雾处理
暗通道先验条件可用来量化云雾厚度和全部像素的辐射还原量,然后恢复出清晰优质的图像。通过式(3)的有雾图像退化模型和环境光照强度A、大气透射率t(x),可进行单幅图像去雾处理,即
2 暗通道先验算法去雾效果优化
本文优化流程如图1所示。当输入图像云雾不均时,其大气透射率图层的灰度信息仅处于有限范围内,而整张图像的辐射还原量将被限制在一定区间里,不能分别准确还原云雾厚薄区域的辐射强度,从而影响图像去雾效果,考虑利用拉伸大气透射率图层对比度的方法来改善云雾厚薄不均时基于暗通道先验得出的无雾图像质量。
图1 基于暗通道先验的图像去雾处理效果优化流程
三、部分源代码
%暗通道去雾算法
%==========================================================================
%暗原色去雾算法是建立在户外自然场景暗通道优先法则的基础上的去雾方法
%其实就是解一个方程:I(x)=J(x)t(x)+A(1-t(x))
%其中I(x)是受到雾气污染的图像,J(x)是我们需要求的去雾后的图像
%t(x)是天空中云层的透射分布率,A是天空的亮度
%==========================================================================
img_name = imread('1.bmp'); %原始图像
I = double(img_name)/255;
[h,w,c] = size(I); %获取图像大小
w0 = 0.95; %去雾系数
dehaze = zeros(h,w,c); %初始化结果图像
win_dark = zeros(h,w); %初始化暗影通道图像
%--------------------------------------------------------------------------
%计算暗通道
%首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中。
%然后再对这幅灰度图进行最小值滤波
for i=1:h
for j=1:w
win_dark(i,j) = min(I(i,j,:)); %每个像素存RGB三个分量
end
end
win_dark = ordfilt2(win_dark,1,ones(9,9),'symmetric'); %9*9(暗通道窗口)进行最小值滤波
%--------------------------------------------------------------------------
%计算大气亮度A
dark_channel = win_dark;
temp = max(max(dark_channel));
[i,j] = find(dark_channel==temp);
i = i(1);
j = j(1);
A = mean(I(i,j,:));
%--------------------------------------------------------------------------
%计算透射率t(x)
gray_I = I(:,:,1); %这里gray_I可以是RGB图像中任何一个通道
p = transmission; %透射率图
r = 80;
eps = 10^-3;
%用guided filter对trasmission map做soft matting获得更为精细的透射率图
%gray_I是引导图像,p是输入图像,r是本地窗口半径,eps是正规化参数
%--------------------------------------------------------------------------
%求无雾图像
t0=0.1; %设置阈值
t1 = max(t0,transmission_filter);
for i=1:c
for j=1:h
for l=1:w
dehaze(j,l,i)=(I(j,l,i)-A)/t1(j,l)+A; %无雾图像恢复
end
end
end
%--------------------------------------------------------------------------
%显示图像
figure
subplot(121)
imshow(win_dark);title('暗通道')
subplot(122)
imshow(t1);title('透射率图')
figure
subplot(121)
imshow(I);title('去雾前')
subplot(122)
imshow(dehaze);title('去雾后')
%boxfilter(盒子滤波函数)
%==========================================================================
%输入:imSrc
%给定的滑动窗口大小:r
%==========================================================================
function imDst = boxfilter(imSrc,r)
imDst = zeros(size(imSrc)); %初始化
%--------------------------------------------------------------------------
imCum = cumsum(imSrc,1); %y轴累计求和,将每一行的数值一次累加到下一行
%y轴方向差异
imDst(1:r+1,:) = imCum(1+r:2*r+1,:);
%将imCum中的1+r到2*r+1行数据复制到imDst函数中的1到r+1行
imDst(r+2:hei-r,:) = imCum(2*r+2:hei,:)-imCum(1:hei-2*r-1,:);
%将imCum中的2*r+2到hei行数据依次减去1到hei-2*r-1行的值
%把最终结果存放到函数imDst的r+2到hei-r行
imDst(hei-r+1:hei,:) = repmat(imCum(hei,:),[r,1])-imCum(hei-2*r:hei-r-1,:);
%使用repmat函数将imCum变为r*1的格式
%然后减去函数imCum中从hei-2*r到hei-r-1行的数值
%得到的结果放入imDst的hei-r+1到hei行位置
%--------------------------------------------------------------------------
%y轴方向差异
imDst(:, 1:r+1) = imCum(:,1+r:2*r+1);
%将imCum中的1+r到2*r+1列数据复制到imDst函数中的1到r+1列
imDst(:, r+2:wid-r) = imCum(:,2*r+2:wid)-imCum(:,1:wid-2*r-1);
%将imCum中的2*r+2到hei列数据依次减去1到hei-2*r-1列的值
%把最终结果存放到函数imDst的r+2到hei-r列
imDst(:, wid-r+1:wid) = repmat(imCum(:,wid),[1,r])-imCum(:,wid-2*r:wid-r-1);
%使用repmat函数将imCum变为r*1的格式
%然后减去函数imCum中从hei-2*r到hei-r-1列的数值
%得到的结果放入imDst的hei-r+1到hei列位置
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/119753242
- 点赞
- 收藏
- 关注作者
评论(0)