雙邊濾波(bilateral filter)是一種非線性濾波器,該算法結合空間信息和亮度相似性對圖像進行濾波處理,在平滑濾波的同時能大量保留圖像的邊緣和細節特征。 定義如下:
其中為輸出圖像,
為輸入圖像,
是以像素點
為中心的鄰域窗口,
為濾波核。雙邊濾波的濾波核由兩部分乘積組成:空域核
與值域核
。兩個濾波核通常都采用高斯函數形式。
其中為空域高斯函數的標准差,
為值域高斯函數的標准差。空域濾波系數由像素間的空間距離決定,距離越小,系數越大。值域濾波系數由像素間的相似度決定,像素值越接近,系數越大。
在灰度變化平緩區域,值域濾波系數接近1,此時空域濾波起主要作用,雙邊濾波器退化為傳統的高斯低通濾波器,對圖像進行平滑操作。而在圖像變化劇烈的部分(即圖像邊緣),像素間差異較大,值域濾波起主要作用,因而能保持邊緣信息。
下圖是雙邊濾波原來示意圖:
雙邊濾波原理示意
對彩色圖像:[2]中將其轉換至Lab空間,值域核由L、a、b三分量的差值決定:
但實驗結果表明它與直接分別對R、G、B通道差別並不大。
程序:
clear all; close all; I=double(imread('mandrill.jpg')); I=I/255; w = 5; sigma=[3 0.1]; O=bfilter2(I,w,sigma); figure; imshow([I,O],[]); function B = bfilter2(A,w,sigma) if size(A,3) == 1 B = bfltGray(A,w,sigma(1),sigma(2)); else B = bfltColor(A,w,sigma(1),sigma(2)); end function [B,K] = bfltGray(A,w,sigma_d,sigma_r) %% %A為給定圖像,歸一化到[0,1]的矩陣 %W為雙邊濾波器(核)的邊長/2 %定義域方差σd記為SIGMA(1),值域方差σr記為SIGMA(2) %% %計算空域核 [X,Y] = meshgrid(-w:w,-w:w); G = exp(-(X.^2+Y.^2)/(2*sigma_d^2)); %計算值域核H並與定義域核G乘積得到雙邊權重函數F [m,n] = size(A); B = zeros(m,n);%結果圖像 K = zeros(m,n);%雙邊濾波器 for i = 1:m for j = 1:n %確定鄰域邊界 iMin = max(i-w,1); iMax = min(i+w,m); jMin = max(j-w,1); jMax = min(j+w,n); %定義當前核所作用的區域為(iMin:iMax,jMin:jMax) I = A(iMin:iMax,jMin:jMax);%提取該區域的源圖像值賦給I H = exp(-(I-A(i,j)).^2/(2*sigma_r^2)); F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1); K(i,j) = sum(F(:)); B(i,j) = sum(F(:).*I(:))/K(i,j); end end function B = bfltColor(A,w,sigma_d,sigma_r) %% %A為給定圖像,歸一化到[0,1]的矩陣 %W為雙邊濾波器(核)的邊長/2 %定義域方差σd記為SIGMA(1),值域方差σr記為SIGMA(2) %% %顏色空間轉換:RGB-->Lab if exist('applycform','file') A = applycform(A,makecform('srgb2lab')); else A = colorspace('Lab<-RGB',A); end %計算空域核 [X,Y] = meshgrid(-w:w,-w:w); G = exp(-(X.^2+Y.^2)/(2*sigma_d^2)); %改變值域參數以適應Lab空間的取值范圍 sigma_r = 100*sigma_r; dim = size(A); B = zeros(dim); for i = 1:dim(1) for j = 1:dim(2) %確定鄰域邊界 iMin = max(i-w,1); iMax = min(i+w,dim(1)); jMin = max(j-w,1); jMax = min(j+w,dim(2)); I = A(iMin:iMax,jMin:jMax,:); % 計算值域核 dL = I(:,:,1)-A(i,j,1); da = I(:,:,2)-A(i,j,2); db = I(:,:,3)-A(i,j,3); H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2)); F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);%雙邊濾波核 norm_F = sum(F(:)); B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F; B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F; B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F; end end %轉回RGB空間 if exist('applycform','file') B = applycform(B,makecform('lab2srgb')); else B = colorspace('RGB<-Lab',B); end
結果:
參考:
[1 ]http://blog.csdn.net/abcjennifer/article/details/7616663
[2] TomasiC, Manduchi R. Bilateral filtering for gray and color images[C]//ComputerVision, 1998. Sixth International Conference on. IEEE, 1998: 839-846.
[3] http://www.mathworks.com/matlabcentral/fileexchange/12191-bilateral-filtering