Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题

举报
一个处女座的程序猿 发表于 2021/03/28 00:01:10 2021/03/28
【摘要】 Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题     目录 输出结果 实现代码 代码下载       输出结果   实现代码 %单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题,matlab代码注解详细,能很好地帮助理解算法过程。 clc; clear all; img_na...

Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题

 

 

目录

输出结果

实现代码

代码下载


 

 

 

输出结果

 

实现代码

%单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题,matlab代码注解详细,能很好地帮助理解算法过程。
clc;
clear all;
img_name='jiedao.jpg';
% 原始图像
I=double(imread(img_name))/255;
% 获取图像大小
[h,w,c]=size(I);
win_size = 7;
img_size=w*h;
figure, imshow(I);
win_dark=ones(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
 %选定精确dark value坐标
% win_b = zeros(img_size,1);
 figure, imshow(win_dark);
 win_t=1-0.95*win_dark;
 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_t(ci*w+cj); end end end
end
 
%显示分块darkchannel
%figure, imshow(win_dark);
neb_size = 9;
win_size = 1;
epsilon = 0.000001;
%指定矩阵形状
indsM=reshape(1:img_size,h,w); %创建稀疏矩阵
  D=spdiags(win_b(:),0,img_size,img_size);
  lambda=1;
  x=(A+lambda*D)\(lambda*(win_b(:).*win_b(:))); %去掉0-1范围以外的数
  alpha=max(min(reshape(x,h,w),1),0);
 
figure, imshow(alpha);
% **************************************************
% 自动获取大气光步骤,A为最终大气光的值
% **************************************************
range=ceil(img_size*0.1);%取暗原色中最亮的%1的点数
radi_pro=zeros(range,1); %用于记录最亮点内对应图片点象素的三个通道的颜色强度 for s=1:range [a,b]=max(win_dark); [c,d]=max(a); b=b(d); m=sparse(b,d,1,h,w); %b,d为最亮值的坐标 win_dark=win_dark-c.*m; %消去选出的最大值 radi_pro(s)=sum(I(b,d,:));  %最大值对应象素三通道求和 end
A=max(radi_pro)/3;%大气光的值
% **************************************************
%  算法改进步骤,可修正天空透射率以减小明亮部分的失真率
% **************************************************
inten=zeros(h,w); for m=1:h for n=1:w inten(m,n)=mean(I(m,n,:)); end end
k=70; k=zeros(h,w)+k/255; %容差
% A=220/255;
cha=abs(inten-A);   %差限
alpha=min(max(k./cha,1).*max(alpha,0.1),1); %算法改进关键部分
figure,imshow(alpha);
% ***************************************************
alpha=repmat(alpha,[1,1,3]); dehaze=(I-A)./alpha+A;  
figure, imshow(dehaze);

 

代码下载

源代码下载地址:Matlab:单幅图象的暗原色先验去雾改进算法

 

 

文章来源: yunyaniu.blog.csdn.net,作者:一个处女座的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:yunyaniu.blog.csdn.net/article/details/80343137

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。