暗通道去雾matlab实现
时间: 2023-11-19 10:56:51 浏览: 105
MATLAB暗通道图形去雾程序.zip
通道去雾是一种常用的图像去雾算法,它基于一个假设:在自然图像中,大多数像素点都存在着一些相同的颜色,这些颜色被称为暗通道。暗通道去雾算法通过估计暗通道来去除图像中的雾气。下面是暗通道去雾的MATLAB实现步骤:
```matlab
% 读入带雾图像
I = imread('foggy_image.jpg');
% 将图像转换为灰度图像
I_gray = rgb2gray(I);
% 估计暗通道
patch_size = 15; % 定义块大小
J_dark = minfilt2(I_gray, [patch_size patch_size]); % 计算每个像素点的最小值
J_dark = double(J_dark); % 转换数据类型
J_dark = J_dark / 255; % 归一化
% 估计大气光
top_percent = 0.001; % 定义取前0.1%的像素点
num_pixel = numel(I(:,:,1)); % 计算像素总数
num_top_pixel = round(num_pixel * top_percent); % 计算前0.1%的像素点数
J_dark_vec = reshape(J_dark, [num_pixel, 1]); % 将J_dark转换为向量
J_dark_vec_sorted = sort(J_dark_vec, 'descend'); % 将J_dark_vec按降序排列
atmos_light = mean(J_dark_vec_sorted(1:num_top_pixel)); % 取前0.1%的像素点的平均值作为大气光
% 估计透射率
w = 0.95; % 定义权重
transmission = 1 - w * J_dark / atmos_light; % 计算透射率
% 恢复图像
patch_size = 15; % 定义块大小
J_gray = double(I_gray) / 255; % 转换数据类型
J_dehazed = zeros(size(J_gray)); % 初始化去雾图像
for i = 1:size(J_gray, 1)
for j = 1:size(J_gray, 2)
patch = J_gray(max(i-patch_size/2,1):min(i+patch_size/2,end), max(j-patch_size/2,1):min(j+patch_size/2,end)); % 提取块
t = max(transmission(max(i-patch_size/2,1):min(i+patch_size/2,end), max(j-patch_size/2,1):min(j+patch_size/2,end))); % 计算块内最大透射率
J_dehazed(i,j) = (J_gray(i,j) - atmos_light) / max(t, 0.1) + atmos_light; % 恢复像素值
end
end
% 显示结果
figure;
subplot(1,2,1); imshow(I); title('原图');
subplot(1,2,2); imshow(J_dehazed); title('去雾图像');
```
阅读全文