使用matlab编写,未使用快速算法的双边滤波实现代码。
下面是实现函数:
function J=bftGrayImage(I,G,sigma_d,sigma_r,filterRadius)
x=-filterRadius:filterRadius;
y=-filterRadius:filterRadius;
J=zeros(size(I));
[xx,yy]=meshgrid(x,y);
spatialCoeffs=exp(- (xx.^2+yy.^2)/(2*sigma_d^2));
[rows,cols]=size(I);
parfor y=filterRadius+1:rows-filterRadius
for x=filterRadius+1:cols-filterRadius
roi= I(y-filterRadius:y+filterRadius,x-filterRadius:x+filterRadius);
centerValue=G(y,x);
roidif=roi-centerValue;
tonalWeight =exp(- roidif.^2/(2*sigma_r^2));
F=(tonalWeight.*spatialCoeffs);
k=sum(F(:));
weight=F.*roi;
J(y,x)=sum(weight(:))/k;
end
end
J=mat2gray(J);
J=J(filterRadius+1:end-filterRadius,filterRadius+1:end-filterRadius);
end
下面是运行代码:
clear all
g = double(imread('cat.png'))/255.0;
G=g;%guidance image
sigma_d=2;
sigma_r=0.3;
filterSize=double(uint8(3*sigma_d)*2+1);
filterRadius=ceil((filterSize-1)/2);
I=padarray(g,[filterRadius,filterRadius],'replicate');
G=padarray(G,[filterRadius,filterRadius],'replicate');
J=bftGrayImage(I,G,sigma_d,sigma_r,filterRadius);
figure;imshow([g,J]);title('input,output');
下面是效果图: