找回密码
 注册
关于网站域名变更的通知
查看: 912|回复: 3
打印 上一主题 下一主题

基于matlab暗通道图像去雾

[复制链接]
  • TA的每日心情

    2019-11-19 15:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-6-3 14:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    ( T, ]0 j$ T+ W& D1 i
    一、简介9 |+ L! |$ j& k+ Y

    9 g2 r3 ^: n- `- [4 D
    2 Z6 k! ?: j6 `6 v/ J2 l; P
    3 p' P/ T) u3 X; r$ A7 ?5 d ' @  S1 D0 t/ l+ O! {* \
    ) ]$ s$ Z6 e7 l3 g! O1 u

    6 j0 W2 J8 M4 e0 z# ?! U  m/ F9 {+ e+ Z+ f5 }
    - m1 V6 R4 D# _/ x  z8 p; }0 m
    1 [* @6 D% t+ H7 d' C

    ' S8 l2 V: U  k. m0 X5 P4 r9 n0 y  ?- S/ i' R& q8 t5 R0 W. Q, E
    上述伪代码中,I表示导向图像(guided image),p为输入图像(input image),q为输出图像(output image),表示均值滤波,r为窗口半径。/ J$ `& L4 f" ^& W; X6 G

    3 d1 }# q2 b- ^& `1 [% w) i* W% g# {7 d
    二、源代码
    ! D' [' e- H* u, X9 u! E. \9 a
    9 K, s) s# m' c0 [
    # M, [# a" R0 B  P7 r: d
    • **
    • %--------------------------------------
    • 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;**: V1 s: d: q  V
                         
    1 f; v0 @2 y3 D& [  X! {. D  k& y- ?( v+ e7 [; V
    三、运行结果
    2 A& \+ O) ]) Z% I3 i! X) B) b, l8 _$ J' @* t# a6 `  A

    2 {  @$ o/ e/ q9 z# `8 g7 F5 o6 P% ~: b  ^' j0 X

    # t6 b$ f9 @$ v& ~  D

    该用户从未签到

    2#
    发表于 2021-6-3 15:52 | 只看该作者
    厉害,基于matlab暗通道图像去雾。这个代码我试着去跑一下。

    该用户从未签到

    3#
    发表于 2021-6-3 16:32 | 只看该作者
    基于matlab暗通道图像去雾

    该用户从未签到

    4#
    发表于 2021-6-3 16:32 | 只看该作者
    基于matlab暗通道图像去雾
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-18 21:31 , Processed in 0.093750 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表