锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【图像增强】基于matlab暗通道图像去雾【含Matlab源码 101期】

时间:2023-11-19 06:07:02 传感器neb3

一、获取代码的方式

获取代码的方
基于图像增强的完整代码上传了我的资源:matlab暗通道图像去雾含Matlab源码 101期】
(https://download.csdn.net/download/TIQCmatlab/62925370)
点击上面的蓝色字体,直接付费下载。

获取代码的方
付费专栏图像处理(Matlab)

备注:
点击蓝色字体付费栏图像处理(Matlab),扫描上面的二维码,付费299.9元订阅海神光博客付费专栏,私信博主凭支付凭证可免费获得5上传本博客CSDN资源代码(有效期订阅日起三天内有效);
点击CSDN资源下载链接:5上传本博客CSDN资源代码

二、简介

1 暗通道先验图像去雾方法
1.1 光传输模型
由于光传播中的散射,光源发出的辐射只能部分到达接收
传感器,而其他辐射到传播介质中。假设散射光强与距离是线性关系,当光源无限接近传感器时,光的衰减值可以接近:Br,其中β空气散射系数;r光源与传感器之间的距离。当大气密度均匀时,光透射率的数学模型为:
在这里插入图片描述
式中:D场景深度;t用于量化传感器接收光强与光源表面光强之间的比例关系,即无散射辐射与光源辐射之间的比例关系。

1.2 暗通道先验理论
基于大量清晰图像的暗通道先验理论是指所有像素含天空的高质量图像的像素R,G,B在这三个通道中,至少有一个颜色通道的灰度值相当低,甚至接近0[5],即某些小区域的最小辐射强度值非常低。图像J可以定义为:

式中:J dark图像J的暗通道值; J为图像J的c通道灰度值; Q(x) 局部微小区域以像素x为中心; y对区域内的任何像素。

1.3 暗通道先验图像去雾处理
图像除雾的目的是通过除雾还原传感器接收到的有用信息。暗通道先验图像除雾处理是根据暗通道原理获取先验知识,然后利用雾图像退化模型实现图像除雾效果。

1.3.1 图像退化模型
在计算机视觉图形学领域,雾图像的退化模型为[6]:

式中:l(x)接收到传感器的场景信号,即输入雾图像;场景辐射J(x)信号处理后的清晰图像;A环境照明强度;t(x)大气透射率。J(x)t(x)用于量化场景辐射和传播中的信号损失,称为直接衰减项。A(1-t(x))表示图像接收到的大气散射光强,是色彩偏移和云效应的直接原因。

1.3.2 估算环境照明强度
黑暗通道图像中灰度值越高,云越厚,像素灰度值越接近环境光强度。要估计环境光强度,首先需要找到暗通道图像中灰度值最高的像素点,占图像总像素的01%,记录相应的坐标索引,然后根据坐标索引在输入的雾图像中找到相应的像素点,计算雾图像中相应像素点的灰度平均值作为环境光强度A。

1.3.3估计大气透射率
使用t’(x)表示以像素x为中心的滤波窗口内的大气透射率,假设它局部不变对式(3)最小值运算,分别计算R,G,B这三种颜色通道中的最小值,即

计算三个颜色通道的最小值,以像素x为中心的滤波窗中的最小灰度值,即

根据暗通道的先验原理和类型(2)可以得出:

因此,大气透射率由公式(5)和公式(6)计算为:

1.3.4 去雾处理
暗通道试验条件可用于量化云厚度和所有像素的辐射还原,然后恢复清晰和高质量的图像。通过雾图像退化模型和环境光强度A、大气透射率t(x),单幅图像可以去雾,即

2 暗通道先验算法去雾效果优化
本文的优化过程如图1所示。当输入图像云不均匀时,空气透射层的灰度信息仅在有限范围内,整个图像的辐射还原量将限制在一定范围内,不能准确恢复云厚度区域的辐射强度,从而影响图像雾效果,考虑使用拉伸空气透射层对比度来提高基于暗通道的无雾图像质量。

图1 基于暗通道先验的图像去雾处理效果优化流程

三、部分源代码

**  %-------------------------------------- clc; clear; close all;   %% -----------图像除雾算法---------------- %% 加载图片 img = imread('foggy_bench.jpg'); figure;imshow(img);title('雾图');
%% 去雾函数
De_img = anyuanse(img);
figure;imshow(De_img);title('去雾图');
%% 输出结果,分辨率300dpi并保存为tiff图片
imwrite(De_img,'1.tiff','tiff','Resolution',300);
function R = anyuanse(m_img)
% 原始图像
 
win_dark=zeros(img_size ,1);
 
for cc=1:img_size
   win_dark(cc)=1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
win_dark=reshape(win_dark,h,w);
%计算分块深度darkchannel
 for j=1+win_size:w-win_size
    for i=win_size+1:h-win_size
        m_pos_min = min(I(i,j,:));
        for n=j-win_size:j+win_size    
            for m=i-win_size:i+win_size
                if(win_dark(m,n)>m_pos_min)
                    win_dark(m,n)=m_pos_min;
                end
            end
        end
       
    end
 end
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
 %图像透射率预处理,深度图反相
 for cc=1:img_size
   win_dark(cc)=1-win_dark(cc);
 end
 %%%%%%%%%%%%%%%%%图像软抠图开始%%%%%%%%%%%%%%%%%%%%%
 %选定精确dark value坐标
win_b = zeros(img_size,1);
 
for ci=1:h
    for cj=1:w
        if(rem(ci-8,15)<1)     %没有余数?
            if(rem(cj-8,15)<1)
                win_b(ci*w+cj)=win_dark(ci*w+cj);
            end
        end
       
    end
end
 
%显示分块darkchannel
neb_size = 9;
win_size = 1;
epsilon = 0.0000001;
%指定矩阵形状
indsM=reshape([1:img_size],h,w);
%计算矩阵L
tlen = img_size*neb_size^2;
row_inds=zeros(tlen ,1);
col_inds=zeros(tlen,1);
vals=zeros(tlen,1);
len=0;
for j=1+win_size:w-win_size
    for i=win_size+1:h-win_size
        if(rem(ci-8,15)<1)
            if(rem(cj-8,15)<1)
                continue;
            end
        end
      win_inds=indsM(i-win_size:i+win_size,j-win_size:j+win_size);
      win_inds=win_inds(:);%列显示
      winI=I(i-win_size:i+win_size,j-win_size:j+win_size,:);
      winI=reshape(winI,neb_size,c); %三个通道被拉平成为一个二维矩阵 3*9
      win_mu=mean(winI,1)';  %求每一列的均值 如果第二个参数为2 则为求每一行的均值  //矩阵变向量
      win_var=inv(winI'*winI/neb_size-win_mu*win_mu' +epsilon/neb_size*eye(c)); %求方差
      winI=winI-repmat(win_mu',neb_size,1);%求离差
      tvals=(1+winI*win_var*winI')/neb_size;% 求论文所指的矩阵L
      row_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds,1,neb_size),...
                                             neb_size^2,1);
      col_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds',neb_size,1),...
                                             neb_size^2,1);
      vals(1+len:neb_size^2+len)=tvals(:);
      len=len+neb_size^2;
    end
end 
 
 
 
vals=vals(1:len);
row_inds=row_inds(1:len);
col_inds=col_inds(1:len);
%创建稀疏矩阵
A=sparse(row_inds,col_inds,vals,img_size,img_size);
%求行的总和 sumA为列向量
sumA=sum(A,2);
%spdiags(sumA(:),0,img_size,img_size) 创建img_size大小的稀疏矩阵其元素是sumA中的列元素放在由0指定的对角线位置上。
A=spdiags(sumA(:),0,img_size,img_size)-A;
 
 
  %创建稀疏矩阵
  D=spdiags(win_b(:),0,img_size,img_size);
  lambda=1;
  x=(A+lambda*D)\(lambda*win_b(:).*win_b(:));
  %%%%%%%%%%%%%%%%%%%%%%%%%软图像抠图结束%%%%%%%%%%%%%%%55
 
   %去掉0-1范围以外的数
  alpha=max(min(reshape(x,h,w),1),0);%图像透射率
 
A=220/255; %大气光没有去计算
%去雾
       
for i=1:c
    for j=1:h
        for l=1:w
            dehaze(j,l,i)=(I(j,l,i)-A)/alpha(j,l)+A;
        end
    end
end
R = dehaze;function R = anyuanse(m_img)
% 原始图像
I=double(m_img)/255;
 
% 获取图像大小
[h,w,c]=size(I);
win_size = 7;
img_size=w*h;
dehaze=zeros(img_size*c,1);
dehaze=reshape(dehaze,h,w,c);
 
win_dark=zeros(img_size ,1);
 
for cc=1:img_size
   win_dark(cc)=1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
win_dark=reshape(win_dark,h,w);
%计算分块深度darkchannel
 for j=1+win_size:w-win_size
    for i=win_size+1:h-win_size
        m_pos_min = min(I(i,j,:));
        for n=j-win_size:j+win_size    
            for m=i-win_size:i+win_size
                if(win_dark(m,n)>m_pos_min)
                    win_dark(m,n)=m_pos_min;
                end
            end
        end
       
    end
 end
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
 %图像透射率预处理,深度图反相
 for cc=1:img_size
   win_dark(cc)=1-win_dark(cc);
 end
 %%%%%%%%%%%%%%%%%图像软抠图开始%%%%%%%%%%%%%%%%%%%%%
 %选定精确dark value坐标
win_b = zeros(img_size,1);
 
for ci=1:h
    for cj=1:w
        if(rem(ci-8,15)<1)     %没有余数?
            if(rem(cj-8,15)<1)
                win_b(ci*w+cj)=win_dark(ci*w+cj);
            end
        end
       
    end
end
 
%显示分块darkchannel
neb_size = 9;
win_size = 1;
epsilon = 0.0000001;
%指定矩阵形状
indsM=reshape([1:img_size],h,w);
%计算矩阵L
tlen = img_size*neb_size^2;
row_inds=zeros(tlen ,1);
col_inds=zeros(tlen,1);
vals=zeros(tlen,1);
len=0;
for j=1+win_size:w-win_size
    for i=win_size+1:h-win_size
        if(rem(ci-8,15)<1)
            if(rem(cj-8,15)<1)
                continue;
            end
        end
      win_inds=indsM(i-win_size:i+win_size,j-win_size:j+win_size);
      win_inds=win_inds(:);%列显示
      winI=I(i-win_size:i+win_size,j-win_size:j+win_size,:);
      winI=reshape(winI,neb_size,c); %三个通道被拉平成为一个二维矩阵 3*9
      win_mu=mean(winI,1)';  %求每一列的均值 如果第二个参数为2 则为求每一行的均值  //矩阵变向量
      win_var=inv(winI'*winI/neb_size-win_mu*win_mu' +epsilon/neb_size*eye(c)); %求方差
      winI=winI-repmat(win_mu',neb_size,1);%求离差
      tvals=(1+winI*win_var*winI')/neb_size;% 求论文所指的矩阵L
      row_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds,1,neb_size),...
                                             neb_size^2,1);
      col_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds',neb_size,1),...
                                             neb_size^2,1);
      vals(1+len:neb_size^2+len)=tvals(:);
      len=len+neb_size^2;
    end
end 
 
 
 
 
R = dehaze;**

四、运行结果


**

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章