双边滤波——原理及matlab实现

  思维闭塞时可外出采采风。1、双边滤波简介:   双边滤波(Bilateral filter)是一种非线性滤波方法(空间权值+相似权值)——空间权值:模糊去噪;相似权值:保护边缘。2、双边滤波原理  双边滤波具有两个权重:空间权重与相似权重  1)空间权重:与像素位置有关,为像素之间的距离(欧式距离,空间度量),故可定义为全局变量放在循环外,通常定义为…

大家好,又见面了,我是你们的朋友全栈君。

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

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);
end
g = 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.');
end

out=table{classIndex,2}(in);
revertclass=table{classIndex,3}; 


 5、实验结果

双边滤波——原理及matlab实现

双边滤波——原理及matlab实现

 

6、参考资料

https://blog.csdn.net/abcjennifer/article/details/7616663

https://blog.csdn.net/bugrunner/article/details/7170471

https://www.cnblogs.com/qiqibaby/p/5296681.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127320.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • juniper srx将配置文件备份到ftp服务器

    juniper srx将配置文件备份到ftp服务器

  • 图文详解j2ee开发环境搭建全过程教程_数据库环境搭建

    图文详解j2ee开发环境搭建全过程教程_数据库环境搭建在J2EE项目实施过程中需要搭建一个完整的开发环境,涉及到的技能和工具包含:JDK、Eclipse、Tomcat、MySQL、Maven、Navicat等等。这些环境对于具备工作经验的开发人员而言想必早已是轻车熟路,但是对于刚入门的新手来说还是颇为棘手。故,在此以文档形式详细记录J2EE开发环境搭建的整个过程。

    2022年10月22日
  • java 常量池和运行时常量池_java字符串常量池在堆还是方法区

    java 常量池和运行时常量池_java字符串常量池在堆还是方法区一.相关概念1.1什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。1.2Class文件中的常量池在Class文件结构中,最头的4个字节用于存储魔数MagicNumber,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主…

  • spring cloud gateway 网关认证登录_golang 网关

    spring cloud gateway 网关认证登录_golang 网关网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务,所以,使用网关的好处在于:(1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发人员把精力专注于业务逻辑的实现。由网关统一实现服务路由(灰度与ABTest)、负载均衡、访问控制、流控熔断降级等非业务相关功能

    2022年10月11日
  • maven配置环境变量

    maven配置环境变量1.下载和安装官网地址:https://maven.apache.org/download.cgi下载后解压即可使用(注意3.3以上的版本对应jdk1.7或者jdk1.8)选用Binaryziparchive目录如下:2.配置环境变量右键电脑》属性》高级系统设置点击环境变量2.1MAVEN_HOME变量点击系统变量中的新建按钮新建系统变量MAVEN_HOME变量值:D:\apache-maven-3.8.2…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号