图像滤波——双边滤波(bilateral filtering)

1. 定义:

同时考虑将要被滤波的像素点的空域信息(domain)值域信息(range)

(1)图像的空域信息指的是图像在像素级别上的空间分布和结构信息。空域信息包含了图像中每个像素及其周围像素的位置、灰度值等信息。通过分析和处理图像的空域信息,我们可以获得图像的边缘、纹理、形状等特征。

(2)图像的值域信息是指图像的像素灰度值的范围和分布信息。它描述了图像的灰度级别、对比度、亮度等特性。通过分析和处理图像的值域信息,我们可以调整图像的亮度和对比度,增强图像的细节,进行图像的直方图均衡化等操作。

2. 出现的原因及目的

(1)出现的原因:在其他滤波算法中(如均值滤波、中值滤波和高斯滤波等),认为图像像素在空间中变化缓慢(类似一道墙之内,认为墙内都是一样的颜色,都是很平整的),但是在一定的区域会有突变的情况出现(比如这道墙的墙角,它可能突然会遇到门框、窗户等),这时候上述的假设就不成立。如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘。

(2)大致解决方法:进行全局滤波之后,图像中结构的边缘信息变得模糊。因此考虑再利用包含边缘信息像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别,从而使得只考虑自己所属的一边的邻域。可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。

3. 实现原理

双边滤波的实现原理可以总结为以下几个步骤:

(1) 定义滤波器的参数:双边滤波器需要指定两个参数,即空间域核函数和像素值域核函数。空间域核函数定义了像素之间的空间距离权重,而像素值域核函数定义了像素值之间的相似性权重。

(2)计算滤波器的权重:对于每个像素,双边滤波器将计算其在空间域和像素值域上的权重。空间域权重衡量了像素之间的距离,而像素值域权重衡量了像素值之间的相似性。

(3)对像素进行滤波:根据计算得到的权重,对每个像素的周围像素进行加权平均,以得到滤波后的像素值。权重越大的像素对滤波结果的贡献越大,权重越小的像素对滤波结果的贡献越小。

双边滤波的公式可以表示为:

I filtered ( x , y ) = 1 W p ( x , y ) ∑ ( i , j ) ∈ Ω I ( x + i , y + j ) ⋅ F spatial ( i , j ) ⋅ F range ( I ( x , y ) , I ( x + i , y + j ) ) I_{\text{filtered}}(x, y) = \frac{1}{W_{\text{p}}(x, y)} \sum_{(i, j) \in \Omega} I(x + i, y + j) \cdot F_{\text{spatial}}(i, j) \cdot F_{\text{range}}(I(x, y), I(x + i, y + j)) Ifiltered(x,y)=Wp(x,y)1(i,j)ΩI(x+i,y+j)Fspatial(i,j)Frange(I(x,y),I(x+i,y+j))

其中:

  • I filtered ( x , y ) I_{\text{filtered}}(x, y) Ifiltered(x,y)是滤波之后的像素值。
  • I ( x , y ) I(x, y) I(x,y)是原始图像中的像素值。
  • W p ( x , y ) W_{\text{p}}(x, y) Wp(x,y)是归一化的权重,用于归一化滤波结果。
  • Ω \Omega Ω表示滤波器的邻域窗口,通常是一个固定大小的窗口。
  • F spatial ( i , j ) F_{\text{spatial}}(i, j) Fspatial(i,j) 是空间域核函数,用于计算像素之间的空间距离权重。
  • F range ( I ( x , y ) , I ( x + i , y + j ) ) F_{\text{range}}(I(x, y), I(x + i, y + j)) Frange(I(x,y),I(x+i,y+j))是像素值域核函数,用于计算像素值之间的相似性权重。

需要注意的是,空间域核函数和像素值域核函数的具体形式可以根据需求进行选择和定义。常用的核函数包括高斯核函数和指数核函数。

双边滤波通过综合考虑空间域和像素值域的信息,在平滑图像的同时保留了边缘信息,能够有效地去除噪声并保持图像的细节。然而,双边滤波的计算量较大,对于大尺寸图像可能会导致较慢的处理速度。因此,在实际应用中需要权衡滤波效果和计算效率。

4. 实际操作

(1)图片输入

在这里插入图片描述

(2)代码编写

在Python中,可以使用OpenCV库来实现双边滤波。以下是一个使用OpenCV实现双边滤波的示例代码:

# 双边滤波参数设置
d = 7  # 邻域直径,控制像素之间的空间距离
sigma_color = [0.0001, 1, 10, 100]  # 像素值域标准差,控制像素值之间的相似性权重
sigma_space = [0.0001, 1, 10, 100]  # 空间域标准差,控制像素之间的空间距离权重

for i in range(len(sigma_color)):
# 进行双边滤波
    filtered_image = cv2.bilateralFilter(img, d, sigma_color[0], sigma_space[i])
    cv2.imwrite(f'sigmaS_{i}.jpg',filtered_image)

for i in range(len(sigma_color)):
# 进行双边滤波
    filtered_image = cv2.bilateralFilter(img, d, sigma_color[i], sigma_space[0])
    cv2.imwrite(f'sigmaC_{i}.jpg',filtered_image)

1. 定义:

同时考虑将要被滤波的像素点的空域信息(domain)值域信息(range)

(1)图像的空域信息指的是图像在像素级别上的空间分布和结构信息。空域信息包含了图像中每个像素及其周围像素的位置、灰度值等信息。通过分析和处理图像的空域信息,我们可以获得图像的边缘、纹理、形状等特征。

(2)图像的值域信息是指图像的像素灰度值的范围和分布信息。它描述了图像的灰度级别、对比度、亮度等特性。通过分析和处理图像的值域信息,我们可以调整图像的亮度和对比度,增强图像的细节,进行图像的直方图均衡化等操作。

2. 出现的原因及目的

(1)出现的原因:在其他滤波算法中(如均值滤波、中值滤波和高斯滤波等),认为图像像素在空间中变化缓慢(类似一道墙之内,认为墙内都是一样的颜色,都是很平整的),但是在一定的区域会有突变的情况出现(比如这道墙的墙角,它可能突然会遇到门框、窗户等),这时候上述的假设就不成立。如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘。

(2)大致解决方法:进行全局滤波之后,图像中结构的边缘信息变得模糊。因此考虑再利用包含边缘信息像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别,从而使得只考虑自己所属的一边的邻域。可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。

3. 实现原理

双边滤波的实现原理可以总结为以下几个步骤:

(1) 定义滤波器的参数:双边滤波器需要指定两个参数,即空间域核函数和像素值域核函数。空间域核函数定义了像素之间的空间距离权重,而像素值域核函数定义了像素值之间的相似性权重。

(2)计算滤波器的权重:对于每个像素,双边滤波器将计算其在空间域和像素值域上的权重。空间域权重衡量了像素之间的距离,而像素值域权重衡量了像素值之间的相似性。

(3)对像素进行滤波:根据计算得到的权重,对每个像素的周围像素进行加权平均,以得到滤波后的像素值。权重越大的像素对滤波结果的贡献越大,权重越小的像素对滤波结果的贡献越小。

双边滤波的公式可以表示为:

I filtered ( x , y ) = 1 W p ( x , y ) ∑ ( i , j ) ∈ Ω I ( x + i , y + j ) ⋅ F spatial ( i , j ) ⋅ F range ( I ( x , y ) , I ( x + i , y + j ) ) I_{\text{filtered}}(x, y) = \frac{1}{W_{\text{p}}(x, y)} \sum_{(i, j) \in \Omega} I(x + i, y + j) \cdot F_{\text{spatial}}(i, j) \cdot F_{\text{range}}(I(x, y), I(x + i, y + j)) Ifiltered(x,y)=Wp(x,y)1(i,j)ΩI(x+i,y+j)Fspatial(i,j)Frange(I(x,y),I(x+i,y+j))

其中:

  • I filtered ( x , y ) I_{\text{filtered}}(x, y) Ifiltered(x,y)是滤波之后的像素值。
  • I ( x , y ) I(x, y) I(x,y)是原始图像中的像素值。
  • W p ( x , y ) W_{\text{p}}(x, y) Wp(x,y)是归一化的权重,用于归一化滤波结果。
  • Ω \Omega Ω表示滤波器的邻域窗口,通常是一个固定大小的窗口。
  • F spatial ( i , j ) F_{\text{spatial}}(i, j) Fspatial(i,j) 是空间域核函数,用于计算像素之间的空间距离权重。
  • F range ( I ( x , y ) , I ( x + i , y + j ) ) F_{\text{range}}(I(x, y), I(x + i, y + j)) Frange(I(x,y),I(x+i,y+j))是像素值域核函数,用于计算像素值之间的相似性权重。

需要注意的是,空间域核函数和像素值域核函数的具体形式可以根据需求进行选择和定义。常用的核函数包括高斯核函数和指数核函数。

双边滤波通过综合考虑空间域和像素值域的信息,在平滑图像的同时保留了边缘信息,能够有效地去除噪声并保持图像的细节。然而,双边滤波的计算量较大,对于大尺寸图像可能会导致较慢的处理速度。因此,在实际应用中需要权衡滤波效果和计算效率。

4. 实际操作

(1)图片输入
在这里插入图片描述

(2)代码编写

在Python中,可以使用OpenCV库来实现双边滤波。以下是一个使用OpenCV实现双边滤波的示例代码:

# 双边滤波参数设置
d = 7  # 邻域直径,控制像素之间的空间距离
sigma_color = [0.0001, 1, 10, 100]  # 像素值域标准差,控制像素值之间的相似性权重
sigma_space = [0.0001, 1, 10, 100]  # 空间域标准差,控制像素之间的空间距离权重

for i in range(len(sigma_color)):
# 进行双边滤波
    filtered_image = cv2.bilateralFilter(img, d, sigma_color[0], sigma_space[i])
    cv2.imwrite(f'sigmaS_{i}.jpg',filtered_image)

for i in range(len(sigma_color)):
# 进行双边滤波
    filtered_image = cv2.bilateralFilter(img, d, sigma_color[i], sigma_space[0])
    cv2.imwrite(f'sigmaC_{i}.jpg',filtered_image)

···
● d是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigma_space 计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。
● sigma_color是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigma_color 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。
● sigma_space是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigma_space的值如何,d都指定邻域大小;否则,d与 sigma_space的值成比例。

(3)在值域参数都为0.0001的情况下,不同的空域参数

① sigma_space=0.0001

在这里插入图片描述

② sigma_space=1

在这里插入图片描述

③ sigma_space=10

在这里插入图片描述

④ sigma_space=100

在这里插入图片描述

(4)在空域参数都为0.0001的情况下,不同的值域参数

① sigma_color=0.0001

在这里插入图片描述

② sigma_color=1
在这里插入图片描述
③ sigma_color=10
在这里插入图片描述
④ sigma_color=100
在这里插入图片描述
(5)结论

上述的结果并不明显,可以通过观察以下对比实验结果加深理解。

在这里插入图片描述

首先,两个 sigma 值为 kernel 的方差,方差越大,说明权重差别越小,因此表示不强调这一因素的影响,反之,则表示更强调这一因素导致的权重的不均衡。因此:

  • 两个方面的某个的 sigma 相对变小 表示这一方面相对较重要,得到强调。如 sigma_space 变小,表示更多采用近邻的值作平滑,说明图像的空间信息更重要,即相近相似。如 sigma_color变小,表示和自己同一类的条件变得苛刻,从而强调值域的相似性。

其次,sigma_space 表示的是空域的平滑,因此对于没有边缘的,变化慢的部分更适合;sigma_color表示值域的差别,因此强调这一差别,即减小 sigma_color可以突出边缘。

  • sigma_space 变大,图像每个区域的权重基本都源于值域滤波的权重,因此对于空间邻域信息不是很敏感;sigma_color变大,则不太考虑值域,权重多来自于空间距离,因此近似于普通的高斯滤波,图像的保边性能下降。因此如果像更多的去除平滑区域的噪声,应该提高 sigma_space ,如果像保持边缘,则应该减小 sigma_color 。
  • 极端情况,如果 sigma_space无穷大,相当于值域滤波;sigma_color 无穷大,相当于空域高斯滤波。
  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
双边滤波图像处理领域有广泛的应用场景,以下是一些常见的应用场景: 1. 图像去噪:双边滤波能够有效地去除图像中的各种类型的噪声,包括高斯噪声、椒盐噪声等。它能够平滑图像,同时保持图像的细节和边缘信息,使得去噪后的图像更加清晰和自然。 2. 图像增强:双边滤波可以用于增强图像的细节和纹理信息。通过调整滤波器参数,可以使得图像中的细节更加突出,纹理更加清晰。这对于图像增强、图像重建等任务非常有用。 3. 边缘保护:传统的线性滤波器在平滑图像时会模糊边缘,导致图像失真。而双边滤波能够通过考虑像素间的相似性来保持边缘信息,从而避免了这种问题。这使得它在边缘保护和边缘增强等任务中得到广泛应用。 4. 图像分割:双边滤波可以用于图像分割任务。通过对图像进行双边滤波处理,可以使得图像中不同区域的边界更加清晰,从而更容易进行图像分割和目标提取。 5. 视频处理:双边滤波也可以应用于视频处理任务。它可以对视频序列中的每一帧进行滤波处理,以去除噪声和平滑图像。这对于视频压缩、视频增强和视频分析等应用非常重要。 总的来说,双边滤波图像处理中的应用非常广泛,涵盖了图像去噪、图像增强、边缘保护、图像分割、视频处理等多个领域。它能够平滑图像的同时保留细节和边缘信息,提高图像质量和处理效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值