opencv之图像平滑处理

文章目录

前言

**图像平滑处理是图像处理和计算机视觉领域中的一个核心技术,它在处理和分析图像数据时扮演着重要的角色。随着数字图像和视频技术的广泛应用,如何有效地提高图像质量和减少噪声成为了关键问题。**图像平滑处理技术不仅用于去除图像中的随机噪声,还用于改善图像的视觉效果,增强图像特征,并为后续的图像分析任务提供更可靠的数据。

本文的内容主要来自《OpenCV轻松入门:面向Python》这本书,他讲的比较清晰。

1.什么是平滑处理

图像平滑处理是图像处理中的一种技术,旨在减少图像中的噪声和细节,从而使图像看起来更平滑。平滑处理可以帮助改善图像质量,去除噪声,并在进一步的图像分析和处理步骤中提供更清晰的数据。常见的平滑处理技术包括滤波、模糊等。例如,下图1是含有噪声的图像,在图像内存在噪声信息,我们通常会通过图像平滑处理等方式去除这些噪声信息。


图1

通过图像平滑处理,可以有效地过滤掉图像内的噪声信息。如图2所示是对图1进行图像平滑处理的结果,可以看到原有图像内含有的噪声信息被有效地过滤掉了。


图2

图像平滑处理会对图像中与周围像素点的像素值差异较大的像素点进行处理,将其值调整为周围像素点像素值的近似值。例如,假设图3是一幅图像的像素点值。在图3中,大部分像素点值在[145,150]区间内,只有位于第3行第3列的像素点的值"29"不在这个范围内。


图3

位于第3行第3列的像素点,与周围像素点值的大小存在明显差异。反映在图像上,该点周围的像素点都是灰度点,而该点的颜色较深,是一个黑色点,如图4所示


图4

从图中可以看出,位于第3行第3列的颜色较深的点可能是噪声,需要将该点的值调整为周围像素值的近似值。如图5所示,是针对第3行第3列的像素点进行平滑处理的结果,平滑处理后,该点的像素值由29变为148。


图5

这些像素点对应的图像如图6所示,可以看到,在对第3行第3列的像素点进行平滑处理后,图像内所有像素的颜色趋于一致。


图6

如果针对图像内的每一个像素点都进行上述平滑处理,就能够对整幅图像完成平滑处理,有效地去除图像内的噪声信息。图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。取近似值的方式很多,本章主要介绍:均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波

友情提示

1.图像平滑处理对应的是英文Smoothing Images。图像平滑处理通常伴随图像模糊操作,因此图像平滑处理有时也被称为图像模糊处理,图像模糊处理对应的英文是Blurring Images。

2.图像滤波是图像处理和计算机视觉中最常用、最基本的操作。图像滤波允许在图像上进行各种各样的操作,因此有时我们也会把图像平滑处理称为图像滤波,图像滤波对应的英文是Images Filtering。

3.在阅读文献时,针对图像平滑处理,我们可能会遇到各种不同的说法,因为不同的学者对于图像平滑处理的称呼可能不一样。所以,希望大家在学习时不要太纠结这些称呼的不同,而要将注意力集中在如何更好地理解图像算法、如何更好地处理图像上。

2.均值滤波

均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。它是一种简单的线性滤波方法。

  • 公式
    I ′ ( x , y ) = 1 N ∑ ( x ′ , y ′ ) ∈ N ( x , y ) I ( x ′ , y ′ ) I'(x, y) = \frac{1}{N} \sum_{(x', y') \in N(x, y)} I(x', y') I′(x,y)=N1∑(x′,y′)∈N(x,y)I(x′,y′)

    其中:

    • I ( x , y ) I(x,y) I(x,y) 是原图像在 ( x , y ) (x,y) (x,y)位置的像素值。
    • N ( x , y ) N(x,y) N(x,y) 是以 ( x , y ) (x,y) (x,y)为中心的邻域区域。
    • N N N是邻域区域内的像素总数。
    • ( x ′ , y ′ ) (x', y') (x′,y′)是是以 ( x , y ) (x,y) (x,y)为中心的邻域区域内的坐标。
  • 效果:简单但不适用于去除细节和边缘,会使图像变得模糊。

2.1基本原理

希望对图7中位于第5行第5列的像素点进行均值滤波。

图7

在进行均值滤波时,首先要考虑需要对周围多少个像素点取平均值。通常情况下,我们会以当前像素点为中心,对行数和列数相等的一块区域内的所有像素点的像素值求平均。例如,在图7中,可以以当前像素点为中心,对周围3×3区域内所有像素点的像素值求平均,也可以对周围5×5区域内所有像素点的像素值求平均。

当前像素点的位置为第5行第5列,我们对其周围5×5区域内的像素值求平均,计算方法为:

计算完成后得到126,我们将126作为当前像素点均值滤波后的像素值。我们针对图7中的每一个像素点计算其周围5×5区域内的像素值均值,并将其作为当前像素点的新值,即可得到当前图像的均值滤波结果。

当然,图像的边界点并不存在5×5邻域区域。例如,左上角第1行第1列上的像素点,其像素值为23,如果以其为中心点取周围5×5邻域,则5×5邻域中的部分区域位于图像外部。图像外部是没有像素点和像素值的,显然是无法计算该点的5×5邻域均值的。

针对边缘像素点,可以只取图像内存在的周围邻域点的像素值均值。如图8所示,计算左上角的均值滤波结果时,仅取图中灰色背景的3×3邻域内的像素值的平均值。


图8

在图8中,对于左上角(第1行第1列)的像素点,我们取第1 ~ 3列与第1 ~ 3行交汇处所包含的3×3邻域内的像素点的像素值均值。因此,当前像素点的均值滤波计算方法为:

计算完成后得到116,将该值作为该点的滤波结果即可。

除此以外,还可以扩展当前图像的周围像素点。 边缘部分填充了与原图像边缘相同的像素值。 例如,将当前9×7大小的图像扩展为13×11大小的图像,如图9所示。


图9

完成图像边缘扩展后,可以在新增的行列内填充不同的像素值。在此基础上,再针对9×7的原始图像计算其5×5邻域内像素点的像素值均值。OpenCV提供了多种边界处理方式,我们可以根据实际需要选用不同的边界处理模式。

针对图像中第5行第5列的像素点,其运算过程相当于与一个内部值都是1/25的5×5矩阵进行相乘计算,从而得到均值滤波的结果126,其对应的关系如图10所示。


图10

根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的5×5矩阵相乘,得到均值滤波的计算结果,如图11所示。


图11

将使用的5×5矩阵一般化,可以得到如图12所示的结果。


图12

在OpenCV中,图12右侧的矩阵被称为卷积核,其一般形式如图13:

图13

式中,M和N分别对应高度和宽度。一般情况下,M和N是相等的,例如比较常用的3×3、5×5、7×7等。如果M和N的值越大,参与运算的像素点数量就越多,图像失真越严重。

2.1 函数语法

在OpenCV中,实现均值滤波的函数是cv2.blur(),其语法格式为:

python 复制代码
dst = cv2.blur( src, ksize, anchor, borderType )

式中:

● dst是返回值,表示进行均值滤波后得到的处理结果。

● src是需要处理的图像,即原始图像。它可以有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。

● anchor是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。

● borderType是边界样式,该值决定了以何种方式处理边界.

● ksize是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。例如,其值可以为(5, 5),表示以5×5大小的邻域均值作为图像均值滤波处理的结果,如图14所示。
图14

python 复制代码
import cv2
o=cv2.imread("image\\lenaNoise.png")   #读取待处理图像
r=cv2.blur(o, (5,5))                  #使用blur函数处理
cv2.imshow("original", o)
cv2.imshow("result", r)
cv2.waitKey()
cv2.destroyAllWindows()

【例1】针对噪声图像,使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况。根据题目要求,调整设置函数cv2.blur()中的ksize参数,分别将卷积核设置为5×5大小和30×30大小,对比均值滤波的结果。所编写的代码为:

python 复制代码
import cv2
o=cv2.imread("image\\noise.bmp")
r5=cv2.blur(o, (5,5))
r30=cv2.blur(o, (30,30))
cv2.imshow("original", o)
cv2.imshow("result5", r5)
cv2.imshow("result30", r30)
cv2.waitKey()
cv2.destroyAllWindows()

卷积核越大,参与到均值运算中的像素就会越多,即当前点计算的是更多点的像素值的平均值。因此,卷积核越大,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重。在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核

3.方框滤波

OpenCV还提供了方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均值。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

  • 公式
    不进行归一化处理
    I ′ ( x , y ) = ∑ ( x ′ , y ′ ) ∈ N ( x , y ) I ( x ′ , y ′ ) I'(x, y) = \sum_{(x', y') \in N(x, y)} I(x', y') I′(x,y)=∑(x′,y′)∈N(x,y)I(x′,y′)
    归一化处理
    I ′ ( x , y ) = 1 N ∑ ( x ′ , y ′ ) ∈ N ( x , y ) I ( x ′ , y ′ ) I'(x, y) = \frac{1}{N} \sum_{(x', y') \in N(x, y)} I(x', y') I′(x,y)=N1∑(x′,y′)∈N(x,y)I(x′,y′)

    其中:

    • I ( x , y ) I(x,y) I(x,y) 是原图像在 ( x , y ) (x,y) (x,y)位置的像素值。
    • N ( x , y ) N(x,y) N(x,y) 是以 ( x , y ) (x,y) (x,y)为中心的邻域区域。
    • N N N是邻域区域内的像素总数。
    • ( x ′ , y ′ ) (x', y') (x′,y′)是是以 ( x , y ) (x,y) (x,y)为中心的邻域区域内的坐标。
  • 效果

平滑效果: 方块滤波会平滑图像,减小像素值的突变,降低图像的噪声。但是,由于它简单地取窗口内像素的均值,会导致图像中的边缘和细节模糊。
噪声去除: 它能有效去除高频噪声,但效果不如其他高级滤波器(如双边滤波)好,尤其是在处理含有复杂细节的图像时。
模糊化: 由于方块滤波对图像中所有像素一视同仁,不考虑像素间的相似性,因此它会在平滑噪声的同时模糊图像中的细节和边缘。

3.1基本原理

我们以5×5的邻域为例,在进行方框滤波时,如果计算的是邻域像素值的均值,则滤波关系如图15所示。


图15

仍然以5×5的邻域为例,在进行方框滤波时,如果计算的是邻域像素值之和,则滤波关系如图16所示。


图16

根据上述关系,如果计算的是邻域像素值的均值,则使用的卷积核为:

如果计算的是邻域像素值之和,则使用的卷积核为:

3.2函数语法

python 复制代码
dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )

在OpenCV中,实现方框滤波的函数是cv2.boxFilter(),其语法格式为:

● dst是返回值,表示进行方框滤波后得到的处理结果。

● src是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者CV_64F中的一种。

● ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。

● ksize是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以3×3大小的邻域均值作为图像均值滤波处理的结果,如下式所示。

● anchor是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。

● normalize表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真(值为1)或假(值为0)。

  • 当参数normalize=1时,表示要进行归一化处理,要用邻域像素值的和除以面积。
  • 当参数normalize=0时,表示不需要进行归一化处理,直接使用邻域像素值的和。

​ 通常情况下,针对方框滤波,卷积核可以表示为:

上述对应关系为:

例如,针对5×5邻域,当参数normalize=1时,要进行归一化处理,此时计算的就是均值滤波。这种情况下,函数cv2.boxFilter()和函数cv2.blur()的作用是一样的。此时,对应的卷积核为:

同样针对5×5邻域,当参数normalize=0时,不进行归一化处理,此时滤波计算的是邻域像素值之和,使用的卷积核是:

当normalize=0时,因为不进行归一化处理,因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值。这样,就会得到一幅纯白色的图像。

​ ● borderType是边界样式,该值决定了以何种方式处理边界。

通常情况下,在使用方框滤波函数时,对于参数anchor、normalize和borderType,直接采用其默认值即可。因此,函数cv2.boxFilter()的常用形式为:

python 复制代码
dst = cv2.boxFilter( src, ddepth, ksize )

4.高斯滤波

在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

高斯滤波使用高斯函数对图像进行加权平均,权重由高斯函数确定。这种方法能更好地保留图像的边缘和细节。

  • 公式
    I ′ ( x , y ) = ∑ ( x ′ , y ′ ) ∈ N ( x , y ) I ( x ′ , y ′ ) ⋅ G ( x ′ , y ′ ) ∑ ( x ′ , y ′ ) ∈ N ( x , y ) G ( x ′ , y ′ ) I'(x, y) = \frac{\sum_{(x', y') \in N(x, y)} I(x', y') \cdot G(x', y')}{\sum_{(x', y') \in N(x, y)} G(x', y')} I′(x,y)=∑(x′,y′)∈N(x,y)G(x′,y′)∑(x′,y′)∈N(x,y)I(x′,y′)⋅G(x′,y′)

    其中:

    • G ( x ′ , y ′ ) G(x′,y′) G(x′,y′) 是高斯函数的权重,计算公式为: G ( x ′ , y ′ ) = 1 2 π σ 2 exp ⁡ ( − ( x ′ − x ) 2 + ( y ′ − y ) 2 2 σ 2 ) G(x', y') = \frac{1}{2\pi\sigma^2} \exp \left( -\frac{(x' - x)^2 + (y' - y)^2}{2\sigma^2} \right) G(x′,y′)=2πσ21exp(−2σ2(x′−x)2+(y′−y)2)
    • σ \sigma σ 是高斯分布的标准差,用于控制滤波器的平滑程度。
  • 效果:比均值滤波效果更好,能有效去除高频噪声,同时保留图像的边缘信息。

4.1基本原理

在高斯滤波中,卷积核中的值不再都是1。例如,一个3×3的卷积核可能如图17所示:


图17

在图18中,针对最左侧的图像内第4行第3列位置上像素值为226的像素点进行高斯卷积,其运算规则为将该点邻域内的像素点按照不同的权重计算和。


图18

在实际计算时,使用的卷积核如图19中的卷积核所示。

图19

使用图19中的卷积核,针对第4行第3列位置上的像素值为226的像素点进行高斯滤波处理,计算方式为:

在实际使用中,高斯滤波使用的可能是不同大小的卷积核。例如,图20中分别是3×3、5×5、7×7大小的卷积核。在高斯滤波中,核的宽度和高度可以不相同,但是它们都必须是奇数。

图20

每一种尺寸的卷积核都可以有多种不同形式的权重比例。例如,同样是5×5的卷积核,可能是图21中所示的两种不同的权重比。

图21

在不同的资料中,卷积核有多种不同的表示方式。它们可能如图20所示写在一个表格内,也可能如图21所示写在一个矩阵内。

在实际计算中,卷积核是归一化处理的,这种处理可以表示为图20最左侧的小数形式的卷积核,也可以表示为如图21所示的分数形式。也要注意,在一些资料中,给出的卷积核并没有进行归一化,这时的卷积核可能表示为图20中间和右侧所示的卷积核,这样的卷积核是为了说明问题用的,实际使用时往往需要进行归一化。严格来讲,使用没有进行归一化处理的卷积核进行滤波,得到的结果往往是错误的。

4.2函数语法

在OpenCV中,实现高斯滤波的函数是cv2.GaussianBlur(),该函数的语法格式是:

python 复制代码
dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

式中:

​ ● dst是返回值,表示进行高斯滤波后得到的处理结果。

​ ● src是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。

​ ● ksize是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,滤波核的值必须是奇数。

​ ● sigmaX是卷积核在水平方向上(X轴方向)的标准差,其控制的是权重比例。例如,图22中是不同的sigmaX决定的卷积核,它们在水平方向上的标准差不同。

图22

​ ● sigmaY是卷积核在垂直方向上(Y轴方向)的标准差。如果将该值设置为0,则只采用sigmaX的值;如果sigmaX和sigmaY都是0,则通过ksize.width和ksize.height计算得到。

其中:

​ ● sigmaX=0.3×[(ksize.width-1)×0.5-1] + 0.8

​ ● sigmaY=0.3×[(ksize.height-1)×0.5-1] + 0.8

​ ● borderType是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

在该函数中,sigmaY和borderType是可选参数。sigmaX是必选参数,但是可以将该参数设置为0,让函数自己去计算sigmaX的具体值。

官方文档建议显式地指定ksize、sigmaX和sigmaY三个参数的值,以避免将来函数修改后可能造成的语法错误。当然,在实际处理中,可以显式指定sigmaX和sigmaY为默认值0。因此,函数cv2.GaussianBlur()的常用形式为:

python 复制代码
dst = cv2.GaussianBlur( src, ksize, 0, 0 )

5.中值滤波

中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻域内所有像素值的中间值来替代当前像素点的像素值。中值滤波通过将每个像素的值替换为其邻域像素值的中值,来去除噪声,尤其是椒盐噪声

  • 公式
    I ′ ( x , y ) = m e d i a n ( I ( x ′ , y ′ ) ∣ ( x ′ , y ′ ) ∈ N ( x , y ) ) I′(x,y)=median({I(x′,y′)∣(x′,y′)∈N(x,y)}) I′(x,y)=median(I(x′,y′)∣(x′,y′)∈N(x,y))

    其中,中值是邻域区域内所有像素值的中间值。

  • 效果:能有效去除椒盐噪声,不会像均值滤波那样模糊图像。

5.1基本原理

中值滤波会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值。

例如,针对图23中第4行第4列的像素点,计算它的中值滤波值。

图23

将其邻域设置为3×3大小,对其3×3邻域内像素点的像素值进行排序(升序降序均可),按升序排序后得到序列值为:[66,78,90,91,93,94,95,97,101]。在该序列中,处于中心位置(也叫中心点或中值点)的值是"93",因此用该值替换原来的像素值78,作为当前点的新像素值,处理结果如图24所示。

图24

5.2 函数语法

在OpenCV中,实现中值滤波的函数是cv2.medianBlur(),其语法格式如下:

python 复制代码
dst = cv2.medianBlur( src, ksize)

式中:

​ ● dst是返回值,表示进行中值滤波后得到的处理结果。

​ ● src是需要处理的图像,即源图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。

​ ● ksize是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,核大小必须是比1大的奇数,比如3、5、7等。

6.双边滤波

双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。双边滤波是一种非线性滤波方法,通过考虑空间距离和像素值的相似性来平滑图像。它能够平滑图像的同时保留边缘信息。

  • 公式
    I ′ ( x , y ) = ∑ ( x ′ , y ′ ) I ( x ′ , y ′ ) ⋅ G s ( x ′ , y ′ ) ⋅ G c ( I ( x ′ , y ′ ) ) ∑ ( x ′ , y ′ ) G s ( x ′ , y ′ ) ⋅ G c ( I ( x ′ , y ′ ) ) I'(x, y) = \frac{\sum_{(x', y')} I(x', y') \cdot G_s(x', y') \cdot G_c(I(x', y'))}{\sum_{(x', y')} G_s(x', y') \cdot G_c(I(x', y'))} I′(x,y)=∑(x′,y′)Gs(x′,y′)⋅Gc(I(x′,y′))∑(x′,y′)I(x′,y′)⋅Gs(x′,y′)⋅Gc(I(x′,y′))

    其中:

    • G s ( x ′ , y ′ ) Gs(x′,y′) Gs(x′,y′) 是空间高斯函数,用于计算像素之间的空间距离: G s ( x ′ , y ′ ) = exp ⁡ ( − ( x ′ − x ) 2 + ( y ′ − y ) 2 2 σ s 2 ) G_s(x', y') = \exp \left( -\frac{(x' - x)^2 + (y' - y)^2}{2\sigma_s^2} \right) Gs(x′,y′)=exp(−2σs2(x′−x)2+(y′−y)2)
    • G c ( I ( x ′ , y ′ ) ) G_c(I(x', y')) Gc(I(x′,y′))是颜色高斯函数,用于计算像素值之间的差异: G c ( I ( x ′ , y ′ ) ) = exp ⁡ ( − ( I ( x ′ , y ′ ) − I ( x , y ) ) 2 2 σ c 2 ) G_c(I(x', y')) = \exp \left( -\frac{(I(x', y') - I(x, y))^2}{2\sigma_c^2} \right) Gc(I(x′,y′))=exp(−2σc2(I(x′,y′)−I(x,y))2)
    • σ s \sigma_s σs和 σ c \sigma_c σc分别是空间和颜色的标准差。
  • 效果:能够在平滑图像的同时保留边缘细节,适用于复杂图像。

6.1基本原理

前述滤波方式基本都只考虑了空间的权重信息,这种情况计算起来比较方便,但是在边缘信息的处理上存在较大的问题。例如,在图25中,图像左侧是黑色,右侧是白色,中间是很明显的边缘。

图25

在均值滤波、方框滤波、高斯滤波中,都会计算边缘上各个像素点的加权平均值,从而模糊边缘信息。如图26所示是高斯滤波处理的结果图像。

图26

从图26可以看到,经过高斯滤波处理后,边缘信息变得很模糊,均值滤波处理也会造成类似的问题。边界模糊是滤波处理过程中对邻域像素取均值所造成的结果,上述滤波处理过程单纯地考虑空间信息,造成了边界模糊和部分信息的丢失。

双边滤波在计算某一个像素点的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)。双边滤波综合考虑距离和色彩的权重结果,既能够有效地去除噪声,又能够较好地保护边缘信息。

在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为0,直接忽略该点),这样就保护了边缘信息。

● 图( a )是原始图像,左侧区域是白色(像素值为255),右侧区域是黑色(像素值为0)。

● 图( b )是进行均值滤波的可能结果。在进行均值滤波时,仅仅考虑空间信息,此时左右两侧的像素的处理结果是综合考虑周边元素像素值,并对它们取均值得到的。

● 图( c )是进行双边滤波的可能结果。在进行双边滤波时,不仅考虑空间信息,还考虑色彩差别信息。在双边滤波中,在计算左侧白色区域边缘点的滤波结果时:

● 对于白色的点,给予的权重较大。

● 对于黑色的点,由于色彩差异较大,颜色距离很远(注意,不是像素点之间的物理距离,而是颜色值的距离。像素点的值分别是0和255,差别很大,所以说它们颜色距离很远),因此可以将它们的权重设置为0。

这样,在计算左侧白色边缘滤波结果时,得到的仍然是白色。因此,双边滤波后,左侧边缘得到保留。

在计算右侧黑色区域边缘点的滤波结果时:

● 对于黑色的点,给予的权重较大。

● 对于白色的点,由于色彩差异较大,颜色距离很远,因此可以将它们的权重设置为0。

这样,在计算右侧黑色边缘滤波结果时,得到的仍然是黑色。因此,双边滤波后,左侧边缘得到保留。


温馨提示

在进行滤波时,滤波过程是基于原始图像的像素值来进行的,而不是使用已经更新的像素值。这意味着每个像素的更新都是独立的,滤波计算使用的是图像在滤波之前的像素值,而不是使用已经被滤波更新过的值。

以均值滤波为例:

  • 操作步骤:均值滤波会为图像中的每一个像素计算一个新的值,这个新的值是该像素邻域内所有像素值的平均值。

  • 原始值使用:在计算每一个像素的新值时,滤波器会使用原始图像中该像素邻域的像素值,而不是已经计算和更新过的像素值。

  • 结果存储:均值滤波通常会将结果存储在一个新的图像矩阵中(或缓冲区),而不会在计算过程中立即更新原图像中的像素值。

    因此,均值滤波是通过扫描整个图像,使用原始图像的像素值来计算每个像素的平均值,确保每个像素的更新不影响其他像素的计算过程。这种方式有助于保证滤波结果的准确性和一致性。

相关推荐
IT古董41 分钟前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee42 分钟前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa42 分钟前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
四口鲸鱼爱吃盐44 分钟前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
蓝天星空1 小时前
Python调用open ai接口
人工智能·python
睡觉狂魔er1 小时前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶
scan7241 小时前
LILAC采样算法
人工智能·算法·机器学习
leaf_leaves_leaf1 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零11 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
爱喝热水的呀哈喽2 小时前
《机器学习》支持向量机
人工智能·决策树·机器学习