matlab暗通道去雾代码
时间: 2023-09-07 22:11:04 浏览: 102
MATLAB暗通道图形去雾程序.zip
以下是一份基于暗通道先验的去雾 MATLAB 代码:
```matlab
function defogged_img = dark_channel_prior(image, window_size, omega, t0)
% Inputs:
% image - 输入的有雾图像
% window_size - 暗通道先验窗口的大小
% omega - 权值调节参数
% t0 - 最小可接受透射率阈值
% Outputs:
% defogged_img - 去雾后的图像
% 将图像从 [0, 1] 范围内的浮点数转换为 [0, 255] 范围内的整数
if max(image(:)) <= 1
image = image * 255;
end
% 将图像转换为双精度类型
image = im2double(image);
% 计算暗通道矩阵
dark_channel = min(image, [], 3);
dark_channel = ordfilt2(dark_channel, 1, ones(window_size));
% 计算透射率
transmission = 1 - omega * dark_channel;
% 过滤掉太小的透射率值
transmission(transmission < t0) = t0;
% 估计大气光
atmosphere = estimate_atmosphere(image, transmission);
% 使用传输恢复图像
defogged_img = transmission_based_dehazing(image, transmission, atmosphere);
end
function atmosphere = estimate_atmosphere(image, transmission)
% Inputs:
% image - 输入的有雾图像
% transmission - 透射率
% Outputs:
% atmosphere - 估计的大气光
% 将图像从 [0, 1] 范围内的浮点数转换为 [0, 255] 范围内的整数
if max(image(:)) <= 1
image = image * 255;
end
% 将图像转换为双精度类型
image = im2double(image);
% 计算暗通道矩阵
dark_channel = min(image, [], 3);
dark_channel = ordfilt2(dark_channel, 1, ones(size(transmission)));
% 选择前 0.1% 亮度的像素作为大气光
pixels = reshape(image, size(image, 1) * size(image, 2), size(image, 3));
pixels = pixels(dark_channel >= 0.9);
atmosphere = max(pixels);
end
function defogged_img = transmission_based_dehazing(image, transmission, atmosphere)
% Inputs:
% image - 输入的有雾图像
% transmission - 透射率
% atmosphere - 估计的大气光
% Outputs:
% defogged_img - 去雾后的图像
% 将图像从 [0, 1] 范围内的浮点数转换为 [0, 255] 范围内的整数
if max(image(:)) <= 1
image = image * 255;
end
% 将图像转换为双精度类型
image = im2double(image);
% 计算归一化的反射率
normalized_reflectance = zeros(size(image));
for i = 1:size(image, 3)
normalized_reflectance(:, :, i) = (image(:, :, i) - atmosphere(i)) ./ transmission + atmosphere(i);
end
% 裁剪归一化反射率并将其转换为图像类型
defogged_img = min(max(normalized_reflectance, 0), 1);
if max(defogged_img(:)) <= 1
defogged_img = defogged_img * 255;
end
defogged_img = uint8(defogged_img);
end
```
要使用此代码,您可以将其复制并粘贴到 MATLAB 中,或将其保存到一个名为“dark_channel_prior.m”的文件中。然后,您可以使用以下代码加载您要去雾的图像并对其进行去雾:
```matlab
% 加载有雾图像
foggy_img = imread('foggy_image.jpg');
% 使用暗通道先验进行去雾
defogged_img = dark_channel_prior(foggy_img, 15, 0.95, 0.1);
% 显示原始图像和去雾后的图像
subplot(1, 2, 1);
imshow(foggy_img);
title('原始图像');
subplot(1, 2, 2);
imshow(defogged_img);
title('去雾后的图像');
```
请注意,此代码仅适用于单张图像,并且可能需要调整一些参数才能在其他图像上获得最佳结果。
阅读全文