clear all
close all
I=imread('C:\Users\Administrator\Desktop\计算机视觉-图像去雾\Emma.jpg'); %读取保存路径下的图片
J=imnoise(I,'gaussian',0,0.01);
K= double(J)/255.0;
sigma_d=1;
sigma_r=0.3;
regularization = 0.01;
filterSize=double(uint8(3*sigma_d)*2+1);
filterRadius=ceil((filterSize-1)/2);%滤波半径
A=medfilt3(K); %进行3*3模板中值滤波
B=imfilter(K,fspecial('average',3));%进行3*3模板均值滤波
C=imfilter(K,fspecial('gaussian',3));%进行3*3模板高斯滤波
%%
I=padarray(K,[filterRadius,filterRadius],'replicate');
G=padarray(K,[filterRadius,filterRadius],'replicate');
D=btfColorImage(I,G,sigma_d,sigma_r,filterRadius);%进行双边滤波
E=imguidedfilter(K,rgb2gray(K), 'NeighborhoodSize',[3 3], 'DegreeOfSmoothing', regularization*diff(getrangefromclass(rgb2gray(K))).^2);
subplot(231),imshow(J);title('(a)原图像','Fontsize',16);
subplot(232),imshow(A);title('(b)3*3模板中值滤波','Fontsize',16);
subplot(233),imshow(B);title('(c)3*3模板均值滤波','Fontsize',16);
subplot(234),imshow(C);title('(d)3*3模板高斯滤波','Fontsize',16);
subplot(235),imshow(D);title('(e)3*3模板双边滤波','Fontsize',16);
subplot(236),imshow(E);title('(f)3*3模板导向滤波','Fontsize',16);
function J=btfColorImage(I,G,sigma_d,sigma_r,filterRadius)
x=-filterRadius:filterRadius;
y=-filterRadius:filterRadius;
[xx,yy]=meshgrid(x,y);
spatialKernel=exp(- (xx.^2+yy.^2)/(2*sigma_d^2));
[rows,cols,~]=size(I);
rc=zeros(size(I(:,:,1)));
gc=zeros(size(rc));
bc=zeros(size(gc));
if size(G,3)==1
temp=G;
G(:,:,1)=temp;
G(:,:,2)=temp;
G(:,:,3)=temp;
end
parfor y=filterRadius+1:rows-filterRadius
for x=filterRadius+1:cols-filterRadius
roi= I(y-filterRadius:y+filterRadius,x-filterRadius:x+filterRadius,:);
roidif=zeros(size(roi));
roidif(:,:,1)=roi(:,:,1)-G(y,x,1);
roidif(:,:,2)=roi(:,:,2)-G(y,x,2);
roidif(:,:,3)=roi(:,:,3)-G(y,x,3);
roidif=roidif.^2;
roidif=roidif(:,:,1)+roidif(:,:,2)+roidif(:,:,3);
tonalKernel =exp(- roidif/(2*sigma_r^2));
W=(tonalKernel.*spatialKernel);
k=sum(W(:));
RC=W.*roi(:,:,1);
GC=W.*roi(:,:,2);
BC=W.*roi(:,:,3);
rc(y,x)=sum(RC(:))/k;
gc(y,x)=sum(GC(:))/k;
bc(y,x)=sum(BC(:))/k;
end
end
rc=rc(filterRadius+1:end-filterRadius,filterRadius+1:end-filterRadius);
gc=gc(filterRadius+1:end-filterRadius,filterRadius+1:end-filterRadius);
bc=bc(filterRadius+1:end-filterRadius,filterRadius+1:end-filterRadius);
J=cat(3,rc,gc,bc);
end