暗通道去雾matlab代码
时间: 2023-08-12 22:04:30 浏览: 153
以下是一个简单的 MATLAB 代码示例,用于暗通道去雾:
```matlab
function J = dark_channel(I, w)
% 计算暗通道图像
[m, n, ~] = size(I);
p = floor(w/2);
J = zeros(m, n);
for i = 1:m
for j = 1:n
min_val = min(min(I(max(i-p,1):min(i+p,m), max(j-p,1):min(j+p,n), :)));
J(i,j) = min_val;
end
end
end
function [t, A] = atm_light(I, dark)
% 估算大气光值
[m, n] = size(dark);
vec_dark = reshape(dark, m*n, 1);
vec_I = reshape(I, m*n, 3);
[~, indices] = sort(vec_dark, 'descend');
indices = indices(1:floor(m*n*0.1));
A = mean(vec_I(indices, :));
t = 1 - 0.95 * mean(vec_dark(indices));
end
function J = dehaze(I, omega, w)
% 去雾函数
I = im2double(I);
dark = dark_channel(I, w);
[t, A] = atm_light(I, dark);
J = (I - repmat(A, size(I, 1), size(I, 2))) ./ max(t, omega) + repmat(A, size(I, 1), size(I, 2));
end
```
在这个代码中,我们使用了三个函数:`dark_channel`,`atm_light` 和 `dehaze`。首先,`dark_channel`函数计算输入图像的暗通道图像,`atm_light`函数估算大气光的值,最后,`dehaze`函数根据估算出的大气光和透射率去除雾霾。
要使用这个代码,只需要将要处理的图像传递给 `dehaze` 函数,例如:
```matlab
I = imread('input_image.png');
J = dehaze(I, 0.95, 15);
imshow(J);
```
其中,第二个参数 `omega` 控制了最小透射率的值,第三个参数 `w` 决定了计算暗通道图像时使用的窗口大小。你可以调整这些参数来获得最佳的去雾效果。
阅读全文