图像滤波——双边滤波(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)图片输入

图像滤波——双边滤波(bilateral filtering)_第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)图片输入
图像滤波——双边滤波(bilateral filtering)_第2张图片

(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

图像滤波——双边滤波(bilateral filtering)_第3张图片

② sigma_space=1

图像滤波——双边滤波(bilateral filtering)_第4张图片

③ sigma_space=10

图像滤波——双边滤波(bilateral filtering)_第5张图片

④ sigma_space=100

图像滤波——双边滤波(bilateral filtering)_第6张图片

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

① sigma_color=0.0001

图像滤波——双边滤波(bilateral filtering)_第7张图片

② sigma_color=1
图像滤波——双边滤波(bilateral filtering)_第8张图片
③ sigma_color=10
图像滤波——双边滤波(bilateral filtering)_第9张图片
④ sigma_color=100
图像滤波——双边滤波(bilateral filtering)_第10张图片
(5)结论

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

图像滤波——双边滤波(bilateral filtering)_第11张图片

首先,两个 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 无穷大,相当于空域高斯滤波。

你可能感兴趣的:(图像处理,计算机视觉,人工智能,图像处理)