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

2023-12-05 23:28

本文主要是介绍《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

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

在这里插入图片描述

这篇关于《opencv实用探索·十》opencv双边滤波的简单理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/459537

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu