clc;
clear all;
close all;
J = imread('tree2.jpg');
[q,v,~] = size(J);
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
R1 = J(:,:,1); %提取全部RGB分量
L=1; R=1;
for i=1:2:q; %0.5倍减采样
for j=1:2:v;
R11(L,R)=R1(i,j);
R=R+1;%取原图像i列下一行的元素赋给新图像的对应位置 ? ??
end
L=L+1;%换列 ? ??
R=1;%从换列后的列里的第一个元素开始取元素?
end
G1 = J(:,:,2);
L=1; R=1;
for i=1:2:q; %0.5倍减采样
for j=1:2:v;
G11(L,R)=G1(i,j);
R=R+1;%取原图像i列下一行的元素赋给新图像的对应位置 ? ??
end
L=L+1;%换列 ? ??
R=1;%从换列后的列里的第一个元素开始取元素?
end
B1 = J(:,:,3);
L=1; R=1;
for i=1:2:q; %0.5倍减采样
for j=1:2:v;
B11(L,R)=B1(i,j);
R=R+1;%取原图像i列下一行的元素赋给新图像的对应位置
end
L=L+1;%换列
R=1;%从换列后的列里的第一个元素开始取元素?
end
OutImg(:,:,1) = R11; %合成RGB分量
OutImg(:,:,2) = G11;
OutImg(:,:,3) = B11;
J=OutImg;
figure(5);
imshow(OutImg);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
J = double(J); %读进来是unot8类型,且后面的滤波等操作都要用到浮点运算
J = J ./255 ; %归一化
figure(1); imshow(J);title('原图') %显示原图
%求暗通道图像 Jdark = min(min());三个分量中的最小值并标记
Jdark = Idark(J);
figure(2);imshow(Jdark);title('暗通道图') %显示暗通道图
% 采用梯度导向滤波方法对得到的粗透射率Jdark进行细化,可以加快运算速度,增加透射图细节
Jdark = gradient_guidedfilter(Jdark,Jdark, 0.04); %图片导向滤波后得到新的图片
figure(3);imshow(Jdark);title('细化粗透射率后图')
% 大气物理模型 J = I*t + A*(1-t) 【直接衰减项】+【大气光照】
% 透射率 t与深度的关系 t=exp(-a*depth)
w = 0.95; %去雾系数,例如w为0.95时保留0.05的雾,构造景深效果
Jt = 1 - w*Jdark; %求解透射率
% 求解全局大气光照
% 1.首先对输入的有雾图像I求解其暗通道图像Jdark。
% 2.选择Jdark总像素点个数千分之一(N/1000)个最亮的像素点,记录像素点(x,y)坐标
% 3.根据点的坐标分别在原图像J的三个通道(r,g,b)内找到这些像素点并加和得到(sum_r,sum_g,sum_b).
% 4.Ac=[Ar,Ag,Ab]. 其中Ar=sum_r/N; Ag=sum_g/N; Ab=sum_b/N.
[m,n,~] = size(J);
N = floor( m*n./1000 ); %向下取整得到千分之一像素点的个数,最亮的一般就是天空
MaxPos = [0,0]; % 初始化
for i=1:1:N
MaxValue = max(max(Jdark)); %寻找暗通道图里全局最大值,第一次是每行,第二次是每列
[x,y] = find(Jdark==MaxValue); %寻找最大值的点
Jdark(Jdark==MaxValue) = 0; %最大值置零,寻找下一个次大值
%检查长度
MaxPos = vertcat(MaxPos,[x,y]); %垂直串联矩阵,MaxPos就是N*2的矩阵
Cnt = length(MaxPos(1)); %计数
if Cnt > N
break;
end
end
MaxPosN = MaxPos(2:N+1,:); %这里多加一是因为初始化的[0,0]在最上面
%提取rgb分量
%根据点的坐标分别在原图像J的三个通道(r,g,b)内找到这些像素点并加和得到(sum_r,sum_g,sum_b).
Rsum = 0; Jr = J(:,:,1);
Gsum = 0; Jg = J(:,:,2);
Bsum = 0; Jb = J(:,:,3);
for j=1:1:N %对三个分量加和
Rsum = Rsum + Jr(MaxPosN(j,1),MaxPosN(j,2));
Gsum = Gsum + Jg(MaxPosN(j,1),MaxPosN(j,2));
Bsum = Bsum + Jb(MaxPosN(j,1),MaxPosN(j,2));
end
Ac = [Rsum/N, Gsum/N, Bsum/N]; %求平均值
% 求解清晰的图像
% 根据 J = I*t + A*(1-t) I = (J-A)/Jt + A
Iorg = zeros(m,n,3);
for i = 1:1:m
for j = 1:1:n
for k = 1:1:3
Iorg(i,j,k) = (J(i,j,k)-Ac(k)) ./ Jt(i,j) + Ac(k);%J为原图,Jt为透射率
end
end
end
figure(4); imshow(Iorg,[]);title('去雾处理图')