《opencv实用探索·十》opencv双边滤波的简单理解

1、引言
OpenCV中的双边滤波(Bilateral Filtering)是一种保持边缘清晰的滤波方法,它考虑像素的空间关系和像素值之间的差异。双边滤波对于去除噪声的同时保持图像的边缘非常有效,它也是一种非线性滤波。

双边滤波采用了两个高斯滤波的结合。一个负责计算空间邻近度的权值,也就是常用的高斯滤波器原理。而另一个负责计算像素值相似度的权值。在两个高斯滤波的同时作用下,就是双边滤波。

高斯滤波和双边滤波的效果对比图如下,可以清晰的看到双边滤波在模糊图像的同时也保持了图像边缘的清晰。
在这里插入图片描述

2、双边滤波的数学解析
双边滤波的数学表示如下所示:
在这里插入图片描述
S(i, j):指以 (i, j) 为中心的 (2N+1)x(2N+1) 的大小的范围;
f(k, l):(多个) 输入点;
g(i, j):输出点;
ω(i,j,k,l)为加权系数,其取值决定于空间域滤波器和像素域滤波器的乘积

空间域滤波器和像素域滤波器表现形式分别如下所示:

第一个函数表示当前点与中心点的欧式距离,第二个函数表示当前点灰度与中心点灰度差的绝对值。
在这里插入图片描述
对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。
双边滤波中加入了对灰度信息的权重,即在邻域内灰度值越接近中心点的灰度值的点权重越大,与中心点灰度值相差大的点权重越小,此权重大小则由像素范围域高斯函数确定。

两者相乘得到最终的卷积模板:
在这里插入图片描述
由于双边滤波需要每个中心点邻域的灰度信息来确定系数,所以速度比一般的滤波慢很多,而且计算量增长速度是核大小的平方。

双边滤波的核函数是空间域核与像素范围域核的综合结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保持了边缘的信息。

为了使图像的边缘得到保留,就要根据当前被卷积像素的邻域进行观察,“推断”是否是边缘点和接近边缘的点。因此,结构元素就会改变,从而保留边缘点。下图大概演示了双边滤波的一个过程,右边是输入图像,图中有段灰度的突变,这表示边缘区域。中间的滤波核是将我们原本的高斯核,与一个能“推断”出是否在边缘点的结构元素相乘,得到专属于这个点的结构元素。灰度值高的地方不应该和灰度低的区域进行混合,所以,图像中接近边缘的一个点就会生成中间图这样的结构元素。左边是输出图像,可以看到原图像中的噪声被很好的去除同时也保留了清晰的边缘。
在这里插入图片描述

3、opencv双边滤波接口使用

void bilateralFilter(InputArray src, OutputArray dst, int d,double sigmaColor, double sigmaSpace,int borderType = BORDER_DEFAULT );

第一个参数,输入图像,图像数据类型为必须是CV_8U、CV_32F和CV_64F三者之一,并且通道数必须为单通道或者三通道
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数,int类型的d,表示在滤波过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来。
第四个参数,颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
第五个参数,空间坐标中滤波器的标准差值,这个参数越大表明越远的像素会相互影响,从而使更大领域中有足够相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。
第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

d怎么设置?
对于每个像素,双边滤波器在其周围的一个正方形窗口内查看相邻像素。这个窗口的大小由 d 控制,它定义了窗口的直径。窗口的大小决定了在进行滤波时考虑的空间范围。
当 d 小于等于 0 时,窗口大小会由 sigmaSpace 来决定。这种情况下,d 的值会根据 sigmaSpace 来计算,确切的说,d 被计算为:d=int(sigmaSpace×1.5)。
这是 OpenCV 中对 d 的特殊处理,使得用户可以直接通过调整 sigmaSpace 控制滤波器的空间范围,而无需显式指定 d 的值。
这种方式可以方便用户,尤其是在不知道或不确定合适的 d 值时。通过调整 sigmaSpace,用户可以更直观地控制滤波器在空间上的影响范围,而无需手动计算 d。
当 d 值较大时,滤波器窗口变得较大,涵盖更广泛的像素,从而导致平均化效果更为显著。这可能导致较大结构的平滑,但也可能使图像细节变得模糊,为了保留图像细节,特别是边缘,通常选择较小的 d 值。较小的 d 值使得滤波器只关注较小的空间邻域,更有效地保留图像的细节和边缘。
保留细节:
如果你的目标是尽量保留图像的细节,特别是图像中的边缘和纹理,可以选择较小的 d 值。通常来说,尝试从 5 或更小的值开始是一个合理的起点
减少噪声:
如果你的图像包含大量噪声,选择稍大一些的 d 值可能会更有效地降低噪声。尝试从 10 或更大的值开始,然后根据需要进行调整。
图像平滑:
如果你的目标是对整个图像进行平滑,可以尝试较大的 d 值。这将导致较大的滤波窗口,对图像的整体结构进行平滑

sigmaColor怎么设置?
平衡平滑和细节:
如果你的目标是在平滑图像的同时尽量保留细节使边缘清晰,可以尝试选择一个中等大小的 sigmaColor。开始时,可以从 25 或 50 开始尝试。
对噪声敏感度:
较小的 sigmaColor 值通常会对颜色变化较小的区域更为敏感,因此可能更适合在图像中有较多噪声的情况。如果你希望减少噪声的影响,可以尝试选择较小的 sigmaColor 值。
颜色变化程度:
根据图像中的颜色变化程度来选择 sigmaColor。如果图像中的颜色变化较大,可能需要选择较大的 sigmaColor。

sigmaSpace怎么设置?
平滑整体图像但保留较多细节:
sigmaSpace: 25-50
对噪声敏感,但仍要进行平滑:
sigmaSpace: 10-20
强烈平滑整个图像,减小细节:
sigmaSpace: 75-100
对大结构保持较好细节,但平滑小结构:
sigmaSpace: 10-20

总结:
平滑整体图像但保留较多细节:
sigmaColor: 25-50
sigmaSpace: 25-50
d: 尝试较小的值,如5-10

对噪声敏感,但仍要进行平滑:
sigmaColor: 相对较小的值,例如10-20
sigmaSpace: 相对较小的值,例如10-20
d: 可以选择中等大小的值,如10-15

强烈平滑整个图像,减小细节:
sigmaColor: 较大的值,例如75-100
sigmaSpace: 较大的值,例如75-100
d: 可以选择相对较大的值,如15-20

对大结构保持较好细节,但平滑小结构:
sigmaColor: 25-50
sigmaSpace: 相对较小的值,例如10-20
d: 中等大小的值,例如10-15

下面是不同参数配比显示的效果:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

[Redis]基础入门

Redis入门 一、初识Redis Redis是一种键值型的NoSql数据库。 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值,甚至是json。 NoSql则是相对于传统关系型数据库而言&a…

行业内卷严重到什么程度了?

一.内卷现状 最近大家都吐槽找工作难,确实很难。 不得不说,现在找工作的难度是以前的很多倍。甚至可以说地狱级都不为过。 以前只要简历一挂到网上,就有很多电话打过来。特别是在一线城市,各种类型企业的HR都来找,希…

Android wifi disable分析

总体流程 老套路基本不变: WifiSettings 通过 WifiManager 下cmd 给 WifiServiceWifiService 收到cmd后,先完成一部分列行检查(如UID的权限、是否airPlayMode等等),之后将cmd下发给到WifiControllerWifiController 收…

Linux 环境变量

文章目录 环境变量概念查看环境变量设置环境变量代码获取环境变量补充说明 环境变量概念 定义 :环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 个人理解:Linux下一切皆文件,在Linux中所用的指…

在机器学习或者深度学习中是否可以直接分为训练集和测试集而不需要验证集?我的答案如下:

文章目录 一、训练集是什么?二、验证集是什么?三、测试集是什么?四、是否可以直接分为训练集和测试集而不需要验证集?总结 在机器学习和深度学习项目中,通常会将数据集划分为三个部分:训练集,验…

UVM实现component之间transaction级别的通信

my_model是从i_agt中得到my_transaction,并把 my_transaction传递给my_scoreboard。在UVM中,通常使用TLM(Transaction Level Modeling)实现component之间transaction级别 的通信。 在UVM的transaction级别的通信 中,数…

在Word中移动页面主要靠导航窗格,有了它,移动页面就事半功倍

本文包括有关在Microsoft Word 2019、2016和Office 365中使用导航窗格移动页面以及复制和粘贴页面的说明。 如何设置导航窗格以重新排列页面 Microsoft Word并不将文档视为单独页面的集合,而是将其视为一个长页面。正因为如此,重新排列Word文档可能会很复杂。在Word中移动页…

【精选】ATKCK红队评估实战靶场二 (超详细过程思路)

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【ATK&CK红队评估实战靶场】 【VulnHub靶场复现】【面试分析】 &#x1f…

智能优化算法应用:基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.堆优化算法4.实验参数设定5.算法结果6.参考文献7.…

Verilog if语句阻断z状态传播

一、测试代码 设置两组输入输出,对比使用assign赋值语句与always if语句。 if_assign_test.v timescale 1ns / 1ps // // Engineer: wkk // Module Name: if_assign_test // module if_assign_test(input if_a_in,input if_b_in,input if_c_in,input if_d_in…

在线网页视频提取工具哪个好用?建议收藏!

随着短视频的崛起,很多人都喜欢将视频下载到手机中慢慢观看,这样可以避免在线播放的卡顿问题,但是会遇到一个问题就是在线网页视频提取工具哪个好用,有的可以提取但是画质太差模糊,有的自带水印飞来飞去。今天小编给大…

同旺科技 USB TO SPI / I2C --- 调试W5500_读写网关地址

所需设备: 内附链接 1、USB转SPI_I2C适配器(专业版); 首先,连接W5500模块与同旺科技USB TO SPI / I2C适配器,如下图: 这里的网关地址设置为192.168.1.1 先将网关地址写入寄存器,然后再读取出来:

关于神舟-战神TA5NS系统重装问题

加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统,然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动(如果没有私信我,我网盘里有),拷到u盘中,然后进入pe系统里面…

Educational Codeforces Round 159 (Rated for Div. 2) 之 A - E 题

目录 [A. Binary Imbalance](https://codeforces.com/contest/1902/problem/A)DescriptionSolutionCode [B. Getting Points](https://codeforces.com/contest/1902/problem/B)DescriptionSolutionCode [C. Insert and Equalize](https://codeforces.com/contest/1902/problem/…

分享126个图片JS特效,总有一款适合您

分享126个图片JS特效,总有一款适合您 126个图片JS特效下载链接:https://pan.baidu.com/s/1sOKHo4RciQXwQX9vhLIm3g?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整…

【Maven】更新依赖索引

有时候给idea配置完maven仓库信息后,在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了,具体做法如下: 打开设置----搜索maven----Repositories----选中本地仓库-…

Javafx实现浏览器

浏览器是一种计算机程序,主要用于显示互联网上的网页。通过浏览器,用户可以访问各种网站、搜索引擎、在线应用程序、社交媒体等。常见的浏览器包括Google Chrome、Mozilla Firefox、Safari、Microsoft Edge、Opera等。浏览器的功能不仅限于浏览网页&…

shell编程

1、开发内存监测脚本 功能描述 监测linux剩余可用的内存,当可用内存小于100M时,就发邮件给我;并且将该脚本加入crontab,每3分钟检查一次内存知识点 获取当前内存的命令:free -m # 以兆的形式显示代码 #! /bin/bashf…

15、pytest的fixture调用fixture

官方实例 # content of test_append.py import pytest# Arrange pytest.fixture def first_entry():return "a"# Arrange pytest.fixture def order(first_entry):return [first_entry]def test_string(order):# Actorder.append("b")# Assertassert orde…

Python中检查字符串是否仅包含字母的多种方法:深入探究

更多资料获取 📚 个人网站:ipengtao.com 随着Python在数据处理和字符串操作方面的广泛应用,经常需要对字符串进行验证,确认其是否仅包含字母。本文将探讨Python中的多种方法来检查字符串是否只由字母组成,以及它们的应…