基于暗通道的图像去雾算法

最近在学习基于暗通道的图像去雾算法,根据算法原理,用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

随意选取了一张带雾图片进行处理

img

处理结果如下:

img

有知道问题出在哪儿的朋友吗,非常感谢。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7747167
  • 这篇博客你也可以参考下:从 Matlab 看中国未来的软件产业,说不定能像这些基础点的方向发展下,坚持写代码做些基础的工作未来还是非常有意义的。可以一直写代码到老呢。
  • 除此之外, 这篇博客: matlab 图像形态学处理与图像分割中的 2. 对一幅带有噪声点的图像(如果图像本身没有噪声点,首先添加椒盐噪声),用膨胀腐蚀等形态学方法去除细小颗粒,实现对象提取。尝试改变结构元素,重复以上步骤对图像进行形态学处理,对比记录不同的实验结果。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 建立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]中等
  • 您还可以看一下 苏金明老师的MATLAB复变函数课程中的 复数运算-复数的乘除法、指数运算和对数运算小节, 巩固相关知识点