Bilateral Filters(双边滤波算法)的超简单原理,学不会你打我。

摘要:
双边滤波(Bilateral Filters)是非常常用的一种滤波,它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度、颜色强度,深度距离等)。

一:如何判断边缘?
在开始之前,我们先讨论一下如何判断边缘。一般而言,区分图像是否为边缘部分的方法如下:
1:在图像的边缘部分,像素值的变化较为剧烈。
2:在图像的非边缘区域,像素值的变换较为平坦。
通过以上两点,我们可以总结出,想要保留图像边缘,必须引入一个能够衡量图像像素变换剧烈程度的变量。

二:双边滤波算法原理
霍金曾经说过,如果一本书里面有一个公式,那么这本书的销量将会失去上万个读者。本文将出现好几个公式,按这样会有失去许多个读者,但是不出现公式是不可能的,作者将尽力解释公式的含义,希望看官看过后觉得有用就点一个订阅。话不多说,咱们开门见山。
首先看双边滤波的公式:
在这里插入图片描述
其中:在这里插入图片描述
先看到这两个公式不要慌,慢慢听我说公式中的符号是什么意思。我们先做一些准备。在这里插入图片描述
我们选择一个的框,随便放在一张图中。像我这样选择一个5×5的框放在10像素×10像素的图上面。分别沿水平方向和竖直向下方向建立坐标轴,水平的叫X轴,竖直向下的叫Y轴。图中一个一个小方框代表一个像素值,这些像素值都有了一个坐标。咱们举一个例子:在这个5×5的框中,像素为165的这个点坐标为(0,0),像素为156的这个点的坐标为(1,0),像素为56的这个点坐标为(0,1),像素为0的这个点的坐标为(1,1),诸如此类。
好了,现在我们做了一些准备工作,接下来解释符号含义就方便了许多。q是输入的像素点,它代表上图中5×5的方框中其中的一个像素点。我们先不管累加符号∑和q∈S这个符号,接下来需要一点数学基础, G σ s Gσ_s Gσs是为空间域核, G σ r Gσ_r Gσr是图像像素域核。
这是两个二维高斯函数,二维高斯函数的公式为(我在网上找的一张图,带了水印,不过无关紧要):在这里插入图片描述
不过这里我们对二维高斯函数进行了一些小的改动,让他们更加符合我们的要求,这里给出 G σ s Gσ_s Gσs G σ r Gσ_r Gσr的公式,:
其中:
在这里插入图片描述
在这里插入图片描述
q代表输入像素点,m与n是输入像素的横坐标与纵坐标,p是方框中心像素点,i与j是方框中心像素的坐标,I(m,n)代表输入像素的值,I(i,j)代表方框中心像素的值, σ s σ_s σs σ r σ_r σr是我们自己设定的值。比如:q代表输入像素,在我们的方框中,我们选择像素值为156的点为输入像素,那么它的坐标为(1,0),m=1,n=0,I(1,0)=156。方框中心的点的坐标为(2,2),那么i=2,j=2,I(2,2)=146。
在这里插入图片描述ps:这个图片太大了,等我学会插入公式后再来修改一下) 代表输出的像素值,也就是我们在方框中心点要更新的像素值。我们现在举一个例子来说明。
①首先遍历整个5×5的小框,第一个遍历到的点是165,它的坐标是(0,0),像素值是165,
那么中心点与该点的空间域计算结果为:
在这里插入图片描述

②再计算中心点与该点的像素域结果:
在这里插入图片描述
σ s σ_s σs σ r σ_r σr 分别为5和20时,Gσs = 0.8521,Gσr = 0.6368。
③我们将 σ s σ_s σs σ r σ_r σr 和第一个像素值(ps:第一个像素值是165)相乘,这三个数相乘得到第一个结果。还记得累加符号∑和q∈S符号吗?其中S指的就是5×5的这个框,它的意思就是从第一个像素开始遍历,按照①②的步骤,求得每一个在5×5方框中的像素的空间域和像素域的结果,并且将像素值和空间域计算结果和像素域结果相乘,最后将这些结果相加起来,得到滤波算法公式的分子。
在这里插入图片描述

好了,我们解释完双边滤波算法的分子,接着解释分母。
当我们遍历整个5x5的方框,将方框内每个像素点都与中心点建立联系,求出它们的 Gσs 与 Gσr 的值,将 Gσs 与 Gσr 相乘即得到每个点对应的Wp,即Wp = Gσs × Gσr,将方框中25个像素点对应Wp进行累加,得到一个总的Wp,便是分母,我们在计算分子的时候可以顺便算出分母。我们再来捋一遍,在遍历结束后,用每个点的Wp乘上该点的像素值I(m, n),并求和,作为分子。将每个点的Wp相加,作为分母,两者相除,即得到需要的新输出图像的中心点(i,j)的像素值。也就是我们的滤波输出,我们将小框从左往右,从上往下不断移动,按照我们的算法不断更新方框中心的像素值,就得到了双边算法的输出。
好了,我讲完了,你听懂了吗?有问题可以留言,我会积极回答的。

### 回答1: OpenCV中的双边滤波算法是一种图像处理技术,可以用Python编程实现。双边滤波算法可以在保留图像边缘信息的同时,对图像进行平滑处理。在Python中,可以使用cv2.bilateralFilter()函数来实现双边滤波算法。该函数的参数包括输入图像、滤波器大小、颜色空间标准差和灰度空间标准差等。使用双边滤波算法可以有效地去除图像中的噪声,同时保留图像的细节信息,是图像处理中常用的技术之一。 ### 回答2: OpenCV是一个非常常用的计算机视觉库,在其众多的图像处理算法中,双边滤波是一种经典的局部平滑滤波算法,适用于去除噪声、保持边缘的清晰度。 在Python中,实现双边滤波算法的步骤如下: 1. 导入必要的库 ```python import cv2 import numpy as np ``` 2. 准备图像 双边滤波算法需要输入一幅图像,因此需要读取一张图像。这里以读取一张名为lena.png(灰度图)的图像为例。 ```python img = cv2.imread('lena.png', 0) ``` 3. 进行双边滤波 使用OpenCV中的双边滤波函数cv2.bilateralFilter()进行双边滤波处理,该函数有以下参数: - src: 输入图像 - d: 滤波器半径,单位为像素 - sigmaColor: 色彩空间的标准差 - sigmaSpace: 像素空间的标准差 - dst: 输出图像,可以直接使用输入图像 ```python blurred = cv2.bilateralFilter(img, 9, 75, 75) ``` 4. 显示图像 我们可以使用Matplotlib库来显示图像。 ```python import matplotlib.pyplot as plt plt.subplot(121), plt.imshow(img, cmap='gray') plt.title('Original Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(blurred, cmap='gray') plt.title('Blurred Image'), plt.xticks([]), plt.yticks([]) plt.show() ``` 双边滤波能够有效地去除噪声,并保留图像的边缘信息。但是,它的计算成本比较高,因此在对大型图像进行处理时需要考虑计算效率的问题。 ### 回答3: OpenCV是一个广泛使用的计算机视觉库,双边滤波算法是其中一个重要的功能。该算法主要用于对图像进行平滑处理,同时保留边缘信息,实现对图像的降噪和边缘保护。 这种算法基于高斯滤波,但与单纯的高斯滤波不同的是,它需要同时考虑图像上每个像素的空间距离和灰度值差异。这种“空间-灰度权重”的组合能够有效滤除高斯平滑无法消除的噪音,并避免对边缘信息的模糊。 在Python中使用OpenCV实现双边滤波算法非常便利。首先导入OpenCV库,然后可以使用“cv2.bilateralFilter()”函数来调用该算法,并指定相关参数,例如: filtered = cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace) 其中“img”是输入图像,“d”是卷积核直径,是一个正整数,“sigmaColor”和“sigmaSpace”是两个不同权重的参数,分别控制像素相似性权重和空间权重。 例如如果我们要对一个名为“img.jpg”的图片进行双边滤波,可以使用以下代码: import cv2 img = cv2.imread('img.jpg') filtered = cv2.bilateralFilter(img, 9, 75, 75) cv2.imshow('Filtered image', filtered) cv2.waitKey(0) cv2.destroyAllWindows() 在这个实例中,输入图像的卷积核直径为9,“sigmaColor”和“sigmaSpace”均为75,该函数返回一个滤镜过的图像。最后,该图像会被显示在屏幕上,并等待用户按下任意键退出。 总结来说,在处理图像的应用中,双边滤波算法是非常常用的。由于该算法可以消除噪音并保留边缘信息,因此它可以用于图像预处理、模式识别、图像分割等领域。在Python中使用OpenCV库来实现该算法也是很容易的。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值