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

基于matlab暗通道图像去雾

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x

    . m0 o7 B" N# {* c  I& I9 b" v一、简介' R) L8 R1 @  v" w+ S+ i
    ( @9 n; B& S  L
    $ ~9 Y$ W" H/ G
    ( C' A( _. v+ [; t( D, r
      v2 h9 w8 E) k% g$ d
    $ u. D5 B# B6 [& O/ w% O
    , G0 l8 q' Q5 A  ?/ u. {

    ! P9 j4 {, y! u9 t . L% y* G) y$ |6 \- Q; n8 M2 Y
    6 n+ K; ^' ?3 x6 _. H' O

    $ C! P# S- d2 Z. X7 K1 T- Z. i# b' x. r, }0 C( ?
    上述伪代码中,I表示导向图像(guided image),p为输入图像(input image),q为输出图像(output image),表示均值滤波,r为窗口半径。
    - P6 d7 I, x- q" o3 m
    " p0 r+ `8 ?1 [4 j* u& Y* I6 t: z7 K; z
    二、源代码2 y( Q0 g6 s9 h7 X/ L
    ; _! J( J1 W3 k( f$ ~

    * c: |! B7 v: Z; w4 W& z  [
    • **
    • %--------------------------------------
    • 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;**$ @- c4 u, m3 U2 Z
                         
    ( S. y7 X2 B- X6 g" _- y: R* U6 P- G" `1 l8 b7 ]
    三、运行结果7 _3 w5 T- h" b. a4 Q0 f- D
      i6 \5 T8 P1 i$ H: f  E0 D

    3 H) K  c6 W1 V; T& A8 x) G2 x0 t' Y2 [. q) w+ ]

    : ^) v, B* [) U! d+ T% R+ Z

    该用户从未签到

    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-8-4 21:40 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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