何凯明去雾算法 matlab
时间: 2023-10-16 15:30:51 浏览: 100
何凯明提出的去雾算法是一种基于暗通道先验的单幅图像去雾方法。它的基本思想是:在一幅有雾的图像中,天空区域的颜色比较浅,而非天空区域的颜色比较深,因为雾粒子的散射会使得远处的物体看起来更加模糊和淡化。因此,通过寻找图像中像素值最小的通道(即暗通道),可以获取到天空区域的信息。然后通过计算大气光的值和深度图,可以推导出去雾后的图像。
以下是何凯明去雾算法的MATLAB代码实现:
```matlab
function J = dehaze(I, t0, w)
% I: 输入的有雾图像
% t0: 控制对比度的阈值
% w: 控制空气光照强度的权重
I = im2double(I);
[m, n, ~] = size(I);
% 计算暗通道
p = floor(min(m,n)*0.001);
dark = dark_channel(I, p);
% 估计大气光
A = estimate_airlight(I, dark);
% 估计透射率
t = transmission_estimate(I, A, t0);
% 修复图像
J = zeros(size(I));
for i = 1:3
J(:,:,i) = (I(:,:,i) - A(i)) ./ max(t, w) + A(i);
end
end
function dark = dark_channel(I, p)
% 计算暗通道
if size(I,3)==3
I = rgb2gray(I);
end
dark = ordfilt2(I, 1, ones(p, p));
end
function A = estimate_airlight(I, dark)
% 估计大气光
A = zeros(1,3);
for i = 1:3
[r, c] = find(dark==max(dark(:)));
idx = sub2ind(size(I), r, c);
A(i) = max(I(idx));
% 将该区域置为最小值,防止重复选取
r_min = max(r-p, 1);
r_max = min(r+p, size(I,1));
c_min = max(c-p, 1);
c_max = min(c+p, size(I,2));
dark(r_min:r_max, c_min:c_max) = 0;
end
end
function t = transmission_estimate(I, A, t0)
% 估计透射率
gray = rgb2gray(I);
t = 1 - t0 * (dark_channel(I./A, 15) ./ 255);
t = medfilt2(t, [15, 15]); % 中值滤波
end
```
其中,`dehaze`函数实现了整个去雾算法,`dark_channel`函数计算暗通道,`estimate_airlight`函数估计大气光,`transmission_estimate`函数估计透射率。
阅读全文