双边滤波——原理及matlab实现
发布日期:2022-01-31 02:37:35 浏览次数:23 分类:技术文章

本文共 2871 字,大约阅读时间需要 9 分钟。

   思维闭塞时可外出采采风。

1、双边滤波简介:

    双边滤波(Bilateral filter)是一种非线性滤波方法(空间权值+相似权值)——空间权值:模糊去噪;相似权值:保护边缘。


2、双边滤波原理

    双边滤波具有两个权重:空间权重与相似权重

    1)空间权重:与像素位置有关,为像素之间的距离(欧式距离,空间度量),故可定义为全局变量放在循环外,通常定义为

c(\xi ,x)=e^{-\tfrac{1}{2}(\tfrac{d(\xi ,x)}{\sigma_{d}})^{2}}

d(\xi,x)=d(\xi-x)=||\xi -x||

    其中d(\xi,x)表示两个像素间的距离(欧式距离)。该过程滤波如下:

h(x)=k_{d}^{-1}(x)\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }f(\xi )c(\xi ,x)d\xi

    权值为:

k_{d}(x)=\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }c(\xi ,x)d\xi

  2)相似权重:与像素值大小有关,为像素值之间的距离(辐射距离,相似性度量),根据像素值不同而不同,需要放在循环内,通常定义为

s(f(\xi) ,f(x))=e^{-\frac{1}{2}(\frac{\sigma (f(\xi ),f(x))}{\sigma _{\tau }})^{2}}

\sigma(\xi ,x)=\sigma(\xi-x)=||\xi -x||

其中\sigma (f(\xi ),f(x))表示两个像素值之间的距离。该过程滤波如下:

h(x)=k_{\tau }^{-1}(x)\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }f(\xi )s(f(\xi) ,f(x))d\xi

    权值为:

k_{\tau }(x)=\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }s(f(\xi) ,f(x))d\xi

    3)两者结合,得到基于空间距离、相似程度整体考虑的双边滤波如下:

h(x)=k^{-1}(x)\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }f(\xi )c(\xi ,x)s(f(\xi) ,f(x))d\xi

    权值为:

k(x)=\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }c(\xi,x)s(f(\xi) ,f(x))d\xi


3、双边滤波实现:

    实际应用时,根据需要对积分采用离散形式表示,滤波半径根据需要自行设置。

    在进行滤波前,需将数据转换为浮点型等。


4、matlab源代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%主函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 读取f = imread(filename);% 设置参数r = 5;% 滤波半径a = 3;% 全局方差b = 0.1;% 局部方差% 判断二维图还是三维图if ismatrix(f)    g = bfilt_gray(f,r,a,b);else    g = bfilt_rgb(f,r,a,b);end% 显示subplot(121)imshow(f)subplot(122)imshow(g)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%灰度图双边滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function g = bfilt_gray(f,r,a,b)% f灰度图;r滤波半径;a全局方差;b局部方差[x,y] = meshgrid(-r:r);w1 = exp(-(x.^2+y.^2)/(2*a^2));f = tofloat(f);%f = im2double(f);h = waitbar(0,'Applying bilateral filter...');set(h,'Name','Bilateral Filter Progress');[m,n] = size(f);f_temp = padarray(f,[r r],'symmetric');g = zeros(m,n);for i = r+1:m+r    for j = r+1:n+r        temp = f_temp(i-r:i+r,j-r:j+r);        w2 = exp(-(temp-f(i-r,j-r)).^2/(2*b^2));        w = w1.*w2;        s = temp.*w;        g(i-r,j-r) = sum(s(:))/sum(w(:));    end    waitbar((i-r)/m);end% g = revertclass(g);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%彩色图双边滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function g = bfilt_rgb(f,r,a,b)% f灰度图;r滤波半径;a全局方差;b局部方差[x,y] = meshgrid(-r:r);w1 = exp(-(x.^2+y.^2)/(2*a^2));f = tofloat(f);%f = im2double(f);h = waitbar(0,'Applying bilateral filter...');set(h,'Name','Bilateral Filter Progress');fr = f(:,:,1);fg = f(:,:,2);fb = f(:,:,3);[m,n] = size(fr);fr_temp = padarray(fr,[r r],'symmetric');fg_temp = padarray(fg,[r r],'symmetric');fb_temp = padarray(fb,[r r],'symmetric');[gr,gg,gb] = deal(zeros(size(fr)));for i = r+1:m+r    for j = r+1:n+r        temp1 = fr_temp(i-r:i+r,j-r:j+r);        temp2 = fg_temp(i-r:i+r,j-r:j+r);        temp3 = fb_temp(i-r:i+r,j-r:j+r);        dr = temp1 - fr_temp(i,j);        dg = temp2 - fg_temp(i,j);        db = temp3 - fb_temp(i,j);        w2 = exp(-(dr.^2+dg.^2+db.^2)/(2*b^2));        w = w1.*w2;        gr(i-r,j-r) = sum(sum(temp1.*w))/sum(w(:));        gg(i-r,j-r) = sum(sum(temp2.*w))/sum(w(:));        gb(i-r,j-r) = sum(sum(temp3.*w))/sum(w(:));    end    waitbar((i-r)/n);endg = cat(3,gr,gg,gb);% g = revertclass(g);%%%%%%%%%%%%%%%%%%%%%%%%%%%%可以用到的函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [out,revertclass]=tofloat(in)identity=@(x) x;tosingle=@im2single;table={'uint8',tosingle,@im2uint8'uint16',tosingle,@im2uint16'int16',tosingle,@im2int16'logical',tosingle,@logical'double',identity,identity'single',identity,identity};classIndex=find(strcmp(class(in),table(:,1)));if isempty(classIndex)    error('unsupported input immage class.');endout=table{classIndex,2}(in);revertclass=table{classIndex,3};

 5、实验结果

 

6、参考资料

转载地址:https://blog.csdn.net/l_eop/article/details/81812277 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:opencv1.0在vc6.0中设置链接库
下一篇:Workerman WebSocket示例

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月05日 18时27分38秒