(十五)双边滤波Bilateral Filter

news2025/6/9 15:24:12

文章目录

    • mathjax: true
    • 1.高斯滤波
      • 1.1 理论
      • 1.2 示例
    • 2.双边滤波(Bilateral Filter)
      • 2.1 理论基础
      • 2.2 OpenCV bilateralFilter函数
    • 参考资料


欢迎访问个人网络日志🌹🌹知行空间🌹🌹



title: 3.双边滤波BilateralFilters
toc: true
category: ComputerVision
date: 2023-01-31 23:19:29
tags:

  • ComputerVision
    categories:
  • ComputerVision

mathjax: true

1.高斯滤波

1.1 理论

高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。

二维高斯函数表达式:

h ( x , y ) = K e − x 2 + y 2 2 σ 2 h(x, y) = Ke^{-\frac{x^2+y^2}{2\sigma ^2}} h(x,y)=Ke2σ2x2+y2

卷积核大小 k k k, r r r表示的是距离卷积核中心的距离

r = ( x − k / 2 ) 2 + ( y − k / 2 ) 2 r = \sqrt{(x - k/2)^2 + (y-k/2)^2} r=(xk/2)2+(yk/2)2

h ( r ) = K e − r 2 2 σ 2 h(r) = Ke^{-\frac{r^2}{2\sigma ^2}} h(r)=Ke2σ2r2

其中 σ \sigma σ类似于正态分布的方差,控制着高斯函数的型态。

σ \sigma σ越大,分布越分散,各部分比重差别不大,于是生成的模板各元素值差别不大,类似于平均模板;

σ \sigma σ越小,分布越集中,中间部分所占比重远远高于其他部分,反映到高斯模板上就是中心元素值远远大于其他元素值,于是自然而然就相当于中间值的点运算。

K = 1 s π σ K=\frac{1}{\sqrt{s\pi}\sigma} K=sπ σ1,则高斯函数为,

h ( r ) = 1 s π σ e − r 2 2 σ 2 h(r) = \frac{1}{\sqrt{s\pi}\sigma}e^{-\frac{r^2}{2\sigma ^2}} h(r)=sπ σ1e2σ2r2

对于卷积核大小为 k = 3 , σ = 0.8 k=3,\sigma=0.8 k=3,σ=0.8的高斯核为:

在这里插入图片描述

高斯核主要用来对图像做平滑。

1.2 示例

OpenCV中有GaussianBlurAPI函数,调用时只需给出kernel sizesigma即可。

cv::Mat dst;
cv::GaussianBlur(img, dst, cv::Size(7, 7), 0.9);
cv::imshow("Before Gaussian Blur", img);
cv::imshow("After Gaussian Blur", dst);
cv::waitKey(0);

在这里插入图片描述

上图中,可以看到平滑后红框中的帽子边沿变模糊了。

2.双边滤波(Bilateral Filter)

2.1 理论基础

第一部分介绍的高斯滤波在对图像进行平滑操时,对所有的像素都是无差别的使用同个高斯核进行计算的,这会导致对图像中物体边缘也进行平滑,使图像变的模糊。

为了解决高斯滤波会导致边缘模糊的问题,不仅需要考虑像素之间的空间关系,还需要考虑卷积核范围内的像素值间的变化大小。对像素值变化大的位置,考虑有可能是边缘,增大该位置的权重。

回顾一下,高斯模糊的公式为:

在这里插入图片描述

其中 G B [ I ] p GB[I]_p GB[I]p表示的是像素 p p p位置处Gaussian Blur后的结果, S S S表示的高斯核, q q q表示的是高斯核所覆盖的函数, G σ G_\sigma Gσ表示的是高斯函数, I q I_q Iq表示的是位置 q q q处的像素值。

双边滤波算法Bilateral Filter不仅考虑了位置,还考虑了像素值的变化,因此双边滤波的公式为:

在这里插入图片描述

其中 G F [ I ] p GF[I]_p GF[I]p表示的是像素位置 p p pBilateral Filter后的结果, G σ r G_{\sigma_r} Gσr是定义在像素差值上的高斯函数。

在这里插入图片描述

上面这幅图中, ( a ) (a) (a)表示的是一幅有边缘的图像像素值变化,图 ( b ) (b) (b)表示的是一个23x23的双边滤波的核,图 ( c ) (c) (c)表示的是对 ( a ) (a) (a)使用双边滤波后得到的结果,可以看到有效的对图像进行了平滑,并保留了边缘信息。

2.2 OpenCV bilateralFilter函数

cv::Mat dstb, dstg;
cv::GaussianBlur(img, dstg, cv::Size(3,3), 0.8);
cv::bilateralFilter(img, dstb, -1, 75, 0.8);
cv::imshow("Origin", img);
cv::imshow("After Gaussian Blur", dstg);
cv::imshow("After Bilateral Filter", dstb);
cv::waitKey(0);

效果对比如下:

在这里插入图片描述

点开图像看原图,在图中红色框出的部分,能够看到双边滤波在平滑的同时还有非常好的保边能力。

参考资料

  • 1.https://www.cnblogs.com/wangguchangqing/p/6407717.html
  • 2.https://www.geeksforgeeks.org/python-bilateral-filtering/
  • 3.https://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序 java基于Android老年人智慧服务平台-

目录 1绪论 4 1.1项目研究的背景 4 1.2开发意义 4 1.3项目研究内容 4 1.4论文结构 4 2开发技术介绍 6 2.1B/S架构 6 2.2 Android平台 6 2.3 Java语言简介 6 2.4 MySQL 介绍 7 2.5 MySQL环境配置 8 2.6 SSM框架 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性…

【图像异常检测】 Anomalib

原文: A practical guide to image-based anomaly detection using Anomalib 1. 简介 在工业生产中,质量保证是一个很重要的话题, 因此在生产中细小的缺陷需要被可靠的检出。工业异常检出旨在从正常的样本中检测异常的、有缺陷的情况。工业…

构建工具tsup入门第四部分

🎄Hi~ 大家好,我是小鑫同学,一位长期从事前端开发的编程爱好者,我将使用更为实用的案例输出更多的编程知识,同时我信奉分享是成长的唯一捷径,在这里也希望我的每一篇文章都能成为你技术落地的参考~ 目录&am…

哈夫曼树、带权路径长度、前缀编码 的概念

文章目录一、基本概念1.1带权路径长度(WPL)1.2哈夫曼树二、哈夫曼树的构造三、哈夫曼树的应用3.1哈夫曼编码与前缀编码一、基本概念 1.1带权路径长度(WPL) 路径长度: 经历的边数 结点的带权路径长度: 从树…

创建线程的三种模式

进程,是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。 线程,是进程的子任务,是CPU调度和分派的基本单位,实现了进程内部的并发。 线程在进程下运行。 进程之间不会影响…

从0到1一步一步玩转openEuler--09 openEuler基础配置--设置日期和时间

文章目录9 设置日期和时间9.1 使用timedatectl命令设置9.1.1 显示日期和时间9.1.2 通过远程服务器进行时间同步9.1.3 修改日期9.1.4 修改时间9.1.5 修改时区9.2 使用date命令设置9.2.1 显示当前的日期和时间9.2.2 修改时间9.2.3 修改日期9.3 使用hwclock命令设置9.3.1 硬件时钟…

QT之OpenGL深度测试

QT之OpenGL深度测试1. 深度测试概述1. 1 提前深度测试1.2 深度测试相关函数2. 深度测试精度2.1 深度冲突3. Demo4. 参考1. 深度测试概述 在OpenGL中深度测试(Depth Testing)是关闭的,此时在渲染图形时会产生一种现象后渲染的会把最先渲染的遮挡住。而在启用深度测试…

浏览器的底层运行机制

一、复习 1.进程和线程 进程:指一个程序(或浏览器打开一个页面就是开辟一个进程)* 线程:程序中具体执行任务的一个进程中可能包含一到多个线程!!* 单线程:同时只能处理一件事,上一件事处理完,…

ASEMI三相整流模块MDS55-16特征,MDS55-16应用

编辑-Z ASEMI三相整流模块MDS55-16参数: 型号:MDS55-16 最大重复峰值反向电压(VRRM):1600V 最大RMS电桥输入电压(VRMS):1700V 最大平均正向整流输出电流(IF&#xf…

MySQL架构图

MySQL架构图 Mysql逻辑架构图主要分三层: 1) 第一层负责连接处理,授权认证,安全等等 每个客户端连接都会在服务器进程中拥有一个线程,服务器维护了一个线程池,因此不需要为每一个新建的连接创建或者销毁线程。 当客户…

看板管理对项目管理有什么帮助?

在目前市面上的项目管理工具中,项目看板功能基本上成为了标配。看板作为敏捷的项目管理工具,可以帮助我们将项目工作可视化展现。项目看板的作用1,提高团队信息流动性:看板工具可以及时的传递项目工作中的最新讯息,保证…

Mapper文件注入问题

Mapper文件注入问题UserMapper that could not be found.原因分析解决方案程序正常运行,但是注入类爆红问题原因分析解决方法UserMapper’ that could not be found. 原因分析 撰写了mapper文件,但是没有注入spring容器 解决方案 添加mybatis.mapper-…

DVWA—CSRF-Medium跨站请求伪造中级

注意: 1、这里对XSS(Stored)关卡不熟悉的可以从这里去看http://t.csdn.cn/ggQDK 2、把难度设置成 Medium 一、这一关同样我们需要埋下伏笔,诱使用户点击来提交,首先从XSS(Stored)入手。 注意:在前面介绍…

黑马】后台项目171集

将近一个月没有练习了,找到之后果然打不开出了问题【问题】运行代码打开网页后,发现不能正常登录,一开始还以为是密码记错了,后来发现是数据库没有正常启动,phpstudy中的数据库一直是启动状态,关闭不了。【…

这个神器,让 Python 爬虫如此简单

相信大家应该都写过爬虫,简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种: 我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信…

【运筹优化】带时间窗约束的车辆路径规划问题(VRPTW)详解 + Python 调用 Gurobi 建模求解

文章目录一、概述1.1 VRP 问题1.2 CVRP 问题1.3 VRPTW 问题二、VRPTW 的一般模型三、Python 调用 Gurobi 建模求解3.1 Solomn 数据集3.2 完整代码3.3 运行结果展示3.3.1 测试案例:c101.txt3.3.2 测试案例:r101.txt一、概述 1.1 VRP 问题 车辆路径规划问…

一场深度的IT效率革命:低代码市场加速嬗变

尽管IT技术支撑了全球的信息化浪潮,然而困扰行业已久的软件开发效率却难以像摩尔定律一样快速提升,甚至已经成为了一种瓶颈,在困扰着行业的继续发展。一边是码农们高喊着996的境况,另一边是程序员的生产力并没有用在更具价值的生产…

Qml学习——布局

最近在学习Qml,但对Qml的各种用法都不太熟悉,总是会搞忘,所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频:https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 目…

C++ 浅谈之 STL List

C 浅谈之 STL List HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&am…

如何在Visual Studio、Clion、Msys2中安装和使用vcpkg

首先事情是在安装了Msys2之后,想在Clion中使用安装在Msys2中的vcpkg。但是折腾了很久还是无法解决。于是就折腾出了这篇文章,和下一篇如何在Clion使用vcpkg的文章。 不过,由于我电脑上已近配置好了vcpkg以及环境变量,要是重新删除…