题目
联合双边滤波
实现图像的联合双边滤波
Function im = jbf(D,C,w, sigma_f, sigma_g)
D为输入图像
C为引导图像
W为滤波窗口大小
sigma_f 为spatial kernel标准差
sigma_g为range kernel 标准差
Code
function[]=test4(I,wsize,sigma_f,sigma_g)
I2=test2_1(I,0.5,0.5);
I3=test2_1(I2,2,2);
[m,n,~]=size(I);
wcenter=floor(wsize/2);
I4=zeros(m+2*wcenter,n+2*wcenter);
I4(wcenter+1:m+wcenter,wcenter+1:n+wcenter)=rgb2gray(I3);
I4=double(I4);
I5=zeros(m+2*wcenter,n+2*wcenter,3);
I5(wcenter+1:m+wcenter,wcenter+1:n+wcenter,:)=I;
newimg=zeros(m,n,3);
sk=zeros(wsize,wsize);%spatial kernel
rk=zeros(wsize,wsize);%range kernel
for i=1:wsize
for j=1:wsize
sk(i,j)=1/(2*pi*sigma_f^2)*exp(-((i-wcenter-1)^2+(j-wcenter-1)^2)/(2*sigma_f^2));
end
end
for i=1:m
for j=1:n
%cal tem
sum=0;
for p=1:wsize
for q=1:wsize
rk(p,q)=1/((2*pi)^(1/2)*sigma_g)*exp(-(I4(p+i-1,q+j-1)-I4(wcenter+i-1,wcenter+j-1))^2/(2*sigma_g^2));
sum=sum+rk(p,q)*sk(p,q);
end
end
tem=sk.*rk/sum;
R=0;G=0;B=0;
for a=1:wsize
for c=1:wsize
R=R+tem(a,c)*I5(a+i-1,c+j-1,1);
G=G+tem(a,c)*I5(a+i-1,c+j-1,2);
B=B+tem(a,c)*I5(a+i-1,c+j-1,3);
end
end
newimg(i,j,1)=R;
newimg(i,j,2)=G;
newimg(i,j,3)=B;
end
end
newimg=uint8(newimg);
figure;imshow(newimg)
figure;imshow(I)
注:当时的想法完全忘了,这里只给个代码给想偷懒的同学,真想要学习的请再加油