最近在学习基于暗通道的图像去雾算法,根据算法原理,用matlab写了一个函数,但是无法实现去雾的功能,想了很久也不知道问题出在哪里,代码如下:
function dehazed_image = dark_channel_dehazing(hazy_image, omega, t0)
% 输入参数:
% hazy_image:模糊图像
% omega:暗通道先验中的常数
% t0:大气散射系数的下限
% 输出参数:
% dehazed_image:去雾后的图像
% 计算暗通道
dark_channel = min(hazy_image, [], 3);
% 计算大气散射系数
[~, max_indices] = maxk(dark_channel(:), round(numel(dark_channel)*omega));
max_indices = max_indices(:);
max_r = hazy_image(:,:,1);
max_r = max_r(max_indices);
max_g = hazy_image(:,:,2);
max_g = max_g(max_indices);
max_b = hazy_image(:,:,3);
max_b = max_b(max_indices);
atmosphere = [max(max_r), max(max_g), max(max_b)];
% 计算透射率
transmission = 1 - omega*min(hazy_image./repmat(max(atmosphere), size(hazy_image)), [], 3);
% 限制透射率的下限
transmission = max(transmission, t0);
% 去雾
dehazed_image = zeros(size(hazy_image));
for i = 1:3
dehazed_image(:,:,i) = (hazy_image(:,:,i) - atmosphere(i))./transmission + atmosphere(i);
end
% 将像素值限制在0-255之间
dehazed_image = max(dehazed_image, 0);
dehazed_image = min(dehazed_image, 255);
dehazed_image = uint8(dehazed_image);
end
随意选取了一张带雾图片进行处理
处理结果如下:
有知道问题出在哪儿的朋友吗,非常感谢。
建立openoperation.m文件,内容为:
function rst=openoperation(src,struct_element)
% 开操作
tmp_erode=imerode(src,struct_element);
rst=imdilate(tmp_erode,struct_element);
开始处理
finger_noise = imread('finger_noise.jpg');
subplot(1,5,1);
imshow(finger_noise);
title('原图');
struct_element1=[1 1 1;1 1 1;1 1 1];
finger1=openoperation(finger_noise,struct_element1);
subplot(1,5,2);
imshow(finger1);
imwrite(finger1, 'finger1.jpg');
title('图1');
struct_element2=[1 1 ;1 1];
finger2=openoperation(finger_noise,struct_element2);
subplot(1,5,3);
imshow(finger2);
imwrite(finger2, 'finger2.jpg');
title('图2');
struct_element3=[1 0 1;0 1 0;1 0 1];
finger3=openoperation(finger_noise,struct_element3);
subplot(1,5,4);
imshow(finger3);
imwrite(finger3, 'finger3.jpg');
title('图3');
struct_element4=[1 1 1;1 0 0;1 0 0];
finger4=openoperation(finger_noise,struct_element4);
subplot(1,5,5);
imshow(finger4);
imwrite(finger4, 'finger4.jpg');
title('图4');
finger1.jpg 结构元素为:struct_element1=[1 1 1;1 1 1;1 1 1];
finger2.jpg 结构元素为:struct_element2=[1 1 ;1 1];
finger3.jpg 结构元素为:struct_element3=[1 0 1;0 1 0;1 0 1];
finger4.jpg 结构元素为:struct_element4=[1 1 1;1 0 0;1 0 0];
效果比较:
图片 | 结构元素 | 效果 |
---|---|---|
finger1.jpg | [1 1 1;1 1 1;1 1 1] | 较好 |
finger2.jpg | [1 1 ;1 1] | 差 |
finger3.jpg | [1 0 1;0 1 0;1 0 1] | 较好 |
finger4.jpg | [1 1 1;1 0 0;1 0 0] | 中等 |