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

基于matlab暗通道图像去雾

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x

    9 v, m7 _$ i6 r0 N% P, ^6 A一、简介5 Y7 q/ t% ]0 W8 q% S9 T

    % G. j7 x* B" j6 P 7 u! U* E1 \- y6 c* H/ {4 `+ g) C" B+ f
    / Q2 c1 y* r0 y$ Z) ]' ^

    / K  `# k1 q$ U: D+ B
    ! z( L7 Z; w0 R6 j- `' e
    4 J7 X! M/ ?" ]9 |6 u
    9 S2 {: e3 \' d7 I
    / D& k6 G: @! M1 `# R! }
    ( J3 u- g) j+ G  U. t% G" m+ Z2 l , W6 D7 J& O# d
    1 v) |8 e4 k' }& m, ~$ d" o% r
    上述伪代码中,I表示导向图像(guided image),p为输入图像(input image),q为输出图像(output image),表示均值滤波,r为窗口半径。
    8 W2 ~" w; v: e0 L
    5 m4 U& G& S2 |# u4 c$ N' T% R' ], f
    二、源代码
    " o* z8 H$ j( Y, w2 k
    4 ~! c6 }! F& ~9 D
    9 [  w7 C; Z/ m, l" r* f
    • **
    • %--------------------------------------
    • 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;**4 }! a" `- Q- y6 n
                         8 @2 w  X, H8 I- i6 M& W% C. g

    2 g+ R0 j2 P5 I( k$ S1 w三、运行结果% A3 l# k) U$ Z. C* B' [
    / h( q4 j! U# ^- v3 N, R2 ?( k
    0 _6 q; f5 z; o9 n0 C+ t4 `

      d" p- A1 c) D7 C1 A+ v+ _; ^
    $ D2 S5 ?5 }+ s9 w5 H

    该用户从未签到

    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-11-23 20:56 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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