雙邊濾波


雙邊濾波(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM