暗通道去雾matlab代码
时间: 2023-08-12 16:05:03 浏览: 69
以下是一份 MATLAB 实现的暗通道去雾代码,仅供参考:
```matlab
function [J, A] = dehaze(I, w_size, lambda)
% 对输入图像进行预处理
I = im2double(I);
dark = min(I, [], 3); % 获取暗通道图像
A = get_atmosphere(I, dark); % 获取大气光强度
trans = get_transmission(I, A, w_size, lambda); % 获取透射率
J = get_scene_radiance(I, trans, A); % 获取场景辐射度
end
% 获取暗通道图像
function dark = get_dark_channel(I)
[m, n, ~] = size(I);
padded = padarray(I, [0, (m-n)/2], 'symmetric', 'both');
dark = min(padded,[],3);
end
% 获取大气光强度
function A = get_atmosphere(I, dark)
[~, idx] = maxk(dark(:), round(numel(dark)*0.001)));
A = max(I(idx));
end
% 获取透射率
function trans = get_transmission(I, A, w_size, lambda)
beta = 1; % 参数 beta
t = 1 - beta*get_dark_channel(I)./A; % 估计透射率
trans = guidedfilter(rgb2gray(I), t, w_size, lambda); % 使用引导滤波器平滑透射率
end
% 获取场景辐射度
function J = get_scene_radiance(I, trans, A)
J = zeros(size(I));
for i = 1:3
J(:, :, i) = (I(:, :, i) - A(i))./max(trans, 0.1) + A(i);
end
end
% 引导滤波器
function q = guidedfilter(I, p, w_size, lambda)
mean_I = boxfilter(I, w_size)./boxfilter(ones(size(I)), w_size); % I 的均值
mean_p = boxfilter(p, w_size)./boxfilter(ones(size(p)), w_size); % p 的均值
mean_Ip = boxfilter(I.*p, w_size)./boxfilter(ones(size(I)), w_size); % I 和 p 的乘积的均值
mean_II = boxfilter(I.*I, w_size)./boxfilter(ones(size(I)), w_size); % I 的平方的均值
var_I = mean_II - mean_I.*mean_I; % I 的方差
cov_Ip = mean_Ip - mean_I.*mean_p; % I 和 p 的协方差
a = cov_Ip./(var_I + lambda); % 引导滤波器的参数 a
b = mean_p - a.*mean_I; % 引导滤波器的参数 b
mean_a = boxfilter(a, w_size)./boxfilter(ones(size(a)), w_size); % a 的均值
mean_b = boxfilter(b, w_size)./boxfilter(ones(size(b)), w_size); % b 的均值
q = mean_a.*I + mean_b; % 引导滤波器的输出 q
end
% 方框滤波器
function imDst = boxfilter(imSrc, r)
[hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));
cum = cumsum(imSrc, 1);
imDst(1:r+1, :) = cum(r+1:2*r+1, :);
imDst(r+2:hei-r, :) = cum(2*r+2:hei, :) - cum(1:hei-2*r-1, :);
imDst(hei-r+1:hei, :) = repmat(cum(hei, :), [r, 1]) - cum(hei-2*r:hei-r-1, :);
cum = cumsum(imDst, 2);
imDst(:, 1:r+1) = cum(:, r+1:2*r+1);
imDst(:, r+2:wid-r) = cum(:, 2*r+2:wid) - cum(:, 1:wid-2*r-1);
imDst(:, wid-r+1:wid) = repmat(cum(:, wid), [1, r]) - cum(:, wid-2*r:wid-r-1);
end
```
其中,`dehaze` 函数是主函数,输入需要去雾的图像 `I`、窗口大小 `w_size` 和参数 `lambda`,输出去雾后的图像 `J` 和大气光强度 `A`。其他函数分别实现了暗通道图像的计算、大气光强度的估算、透射率的计算、场景辐射度的计算以及引导滤波器和方框滤波器的实现。
需要注意的是,此实现仅供参考,具体的参数选择还需要根据具体情况进行调整。
阅读全文