matlab朦胧的去雾、加雾算法

matlab朦胧的去雾、加雾算法

去雾算法

为何要研究图像去雾技术 ?

  1. 雾霾严重频发,图像获取带雾的情况越来越多
  2. 带雾的图像很多特征被掩饰和模糊 ,导致很多细节信息不容易识别
  3. 图像的对比度和颜色鲜艳度受到极大削弱

图像增强技术是关去雾的关键技术 ,主要包括频域处理法和空域处理法,频域处理法基于卷积定理,通过小波变换或者傅里叶变换来实现。空域处理方法直接对像素进行处理,以图像灰度映射变换为基础采用所需的映射变换,例如图像对比度增强和灰度层次优化处理方法都属于空域处理法。

%function darktest(F:\pictures\4.jpg)
%暗影去雾算法
%filename------文件名或文件绝对路径
%用法:darktest('7.png')
close all
clc
w0=0.65;   %0.65  乘积因子用来保留一些雾,1时完全去雾    
t0=0.1;
 
I=imread('F:\pictures\4.jpg');
figure;
set(gcf,'outerposition',get(0,'screensize'));
subplot(221)
imshow(I);
title('原始图像');
[h,w,s]=size(I);
min_I=zeros(h,w);           
 
%下面取得暗影通道图像
for i=1:h                 
    for j=1:w
        dark_I(i,j)=min(I(i,j,:));
    end
end
subplot(223)
imshow(dark_I);
title('dark channnel的图形');
 
Max_dark_channel=double(max(max(dark_I)))  %天空亮度
dark_channel=double(dark_I);
t=1-w0*(dark_channel/Max_dark_channel);   %取得透谢分布率图
 
subplot(224)
T=uint8(t*255);
imshow(T);
title('透射率t的图形');
 
t=max(t,t0);
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I1=double(I);
J(:,:,1) = uint8((I1(:,:,1) - (1-t)*Max_dark_channel)./t);
 
J(:,:,2) = uint8((I1(:,:,2) - (1-t)*Max_dark_channel)./t);
 
J(:,:,3) =uint8((I1(:,:,3) - (1-t)*Max_dark_channel)./t);
subplot(222)
imshow(J);
title('去雾后的图像');
 

加雾算法

当然,有去雾,就会有加雾算法,代码如下:

img_name='F:\pictures\1.jpg';
I=imread(img_name);
I1 = imresize(I,[240,320]);
% subplot(2,2,1);
figure(1);
imshow(I1);
imagesc(I1);
I1=double(I1)/255;
I = I1;
% figure;imagesc(I); %一图
Im_dealt = I;
[row,col,z] = size(Im_dealt);
landline = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Iw = I;
A = 0.8;
m = 100;
n = 300;
tidx= 2;
% for beta = 0.05:0.05:0.15
for beta = 0.20:0.05:0.30
for i=1:3
for j=landline+1:row
for l=1:col
d(j,l) = 1/((j-landline)^.05 + 0.0001);
d2(j,l) = d(j,l)*8;
if j < landline
d(j,l) = -0.04*landline + 18;
td(j,l) = exp(-beta*d(j,l));
Iw(j,l,i) = I(landline,l,i)*td(landline,l) + A*(1-td(j,l));

else
d(j,l) = -0.04*sqrt((j-m).^2+(l-n).^2) + 17;
td(j,l) = exp(-beta*d(j,l));
Iw(j,l,i) = I(j,l,i)*td(j,l) + A*(1-td(j,l));
end

end
end
end
for k = 1:landline
for kj = 1:col
Iw(k,kj,: ) = Iw(landline+1,100,:);
end
end
figure(tidx);imshow(Iw);
filename = ['.\outPicture\frame179-',num2str(tidx),'.tif'];
imwrite(Iw,filename);
 subplot(2,2,tidx); imshow(Iw);
a = sprintf('%s %f','beta=',beta);
title(a);
tidx = tidx+1;
end
 figure; imshow(d);
 figure; imshow(td);

如对上述代码有问题,请下方留言,谢谢!

运行结果如下:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44824148/article/details/105826341#comments_22676959