opencv之图像平滑处理

news2024/11/15 9:40:32

文章目录

  • 前言
  • 1.什么是平滑处理
  • 2.均值滤波
    • 2.1基本原理
    • 2.1 函数语法
  • 3.方框滤波
    • 3.1基本原理
    • 3.2函数语法
  • 4.高斯滤波
    • 4.1基本原理
    • 4.2函数语法
  • 5.中值滤波
    • 5.1基本原理
    • 5.2 函数语法
  • 6.双边滤波
    • 6.1基本原理
  • 温馨提示

前言

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

本文的内容主要来自《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(),其语法格式为:

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
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大小,对比均值滤波的结果。所编写的代码为:

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函数语法

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()的常用形式为:

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(xx)2+(yy)2)
    • σ \sigma σ 是高斯分布的标准差,用于控制滤波器的平滑程度。
  • 效果:比均值滤波效果更好,能有效去除高频噪声,同时保留图像的边缘信息。

4.1基本原理

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

图17

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

图17

图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(),该函数的语法格式是:

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()的常用形式为:

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(),其语法格式如下:

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(xx)2+(yy)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。

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


温馨提示

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

以均值滤波为例:

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

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

  • 结果存储:均值滤波通常会将结果存储在一个新的图像矩阵中(或缓冲区),而不会在计算过程中立即更新原图像中的像素值。
    因此,均值滤波是通过扫描整个图像,使用原始图像的像素值来计算每个像素的平均值,确保每个像素的更新不影响其他像素的计算过程。这种方式有助于保证滤波结果的准确性和一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov8改进策略,有可以直接用的代码,80余种改进策略,有讲解

YOLOv8改进策略介绍 YOLOv8是在YOLOv7的基础上进一步发展的目标检测模型,继承了YOLO系列模型的优点,如实时性、准确性和灵活性。然而,任何模型都有进一步改进的空间,以提高其性能、准确性和鲁棒性。下面是针对YOLOv8的一些改进策…

电容的分类

电容作为电子产品中不可或缺的元件,其种类繁多,各具特色。以下是电容的主要分类、作用及优缺点概述: 一、电容的分类 电容的分类方式多样,常见的分类方式包括按结构、用途、电解质类型及制造材料等。 按结构分类: 固…

搞懂奇偶校验

当我们有一串二进制的数据时,如何在这串二进制数据的最前面,或者最后面,添加一位的奇检验位或者偶校验位呢? (1)首先要明确使用什么校验:你使用奇校验,还是偶检验? &am…

使用 EasyExcel 高效读取大文件 Excel

使用 EasyExcel 高效读取大文件 Excel 的最佳实践 在现代应用中,数据处理经常涉及到大规模数据集的处理,Excel 作为一种常见的文件格式,经常用于数据导入和导出。然而,传统的 Excel 处理库如 Apache POI 在处理大文件时可能会面临…

基于Java+SpringBoot+Vue的植物健康系统

基于JavaSpringBootVue的植物健康系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 某信 gzh 搜索【智能编程小助手】获取项…

(学习总结15)C++11小语法与拷贝问题

C11小语法与拷贝问题 auto关键字范围forinitializer_list深拷贝与浅拷贝写时拷贝 以下代码环境为 VS2022 C。 auto关键字 在早期 C/C 中 auto 的含义是:使用 auto 修饰的变量,是具有自动存储器的局部变量,不过一般都会隐藏,导致…

科研绘图 - Python - 柱状图代码及展示

1 import pandas as pd import matplotlib.pyplot as pltstudents pd.read_excel(./Students.xlsx)print(----原始数据----) print(students)students.sort_values(by2017,inplaceTrue,ascendingFalse) students.plot.bar(xField,y[2016,2017],color[orange,red])plt.title(I…

【Redis】Redis 客户端开发与 Java 集成:RESP协议解析与实战操作

目录 客⼾端Redis Java使⽤ 样例列表引⼊依赖配置端⼝转发连接 Redis Server基础操作字符串操作列表操作哈希表操作集合操作有序集合操作访问集群 Redis Java 集成到 Spring Boot使⽤ Spring Boot 连接 Redis 单机创建项⽬配置 redis 服务地址创建 Controller使⽤ String使⽤ L…

华为OD机试真题 - 分割均衡字符串 - 贪心算法(Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、…

集成电路学习:什么是GPIO通用输入输出

GPIO:通用输入输出 GPIO,全称General Purpose Input/Output,即通用输入/输出端口,是嵌入式系统中非常重要的基本硬件资源之一。以下是对GPIO的详细解析: 一、GPIO的定义与功能 GPIO是一种非常灵活的接口,可…

ping不通本地虚拟机的静态ip的解决方案

找到网络配置文件 一般我们设置虚拟机文件为静态IP地址, 比如 /etc/sysconfig/network-scripts/ifcfg-ens33 记住Gateway 192.168.200.2 查看虚拟网络编辑器 把子网ip改为192.168.200.0 前三部分相同,第四部分是0 把nat设置中的网关ip改成Gateway 1…

时空图卷积网络:用于交通流量预测的深度学习框架-1

摘要 准确的交通预测对于城市交通控制和引导至关重要。由于交通流的高度非线性和复杂性,传统方法无法满足中长期预测任务的需求,且往往忽略了空间和时间的依赖关系。本文提出一种新的深度学习框架——时空图卷积网络(STGCN)来解决交通领域的时间序列预测…

「MyBatis」图书管理系统 v1.0

🎇个人主页:Ice_Sugar_7 🎇所属专栏:JavaEE 🎇欢迎点赞收藏加关注哦! 图书管理系统 v1.0 🍉登录🍉图书操作🍌图书类🍌页面信息🍌操作 &#x1f34…

Java中的经典排序算法:快速排序、归并排序和计数排序详解(如果想知道Java中有关快速排序、归并排序和计数排序的知识点,那么只看这一篇就足够了!)

前言:排序算法在计算机科学中占有重要地位,不同的算法适用于不同的场景。本文将深入探讨快速排序、归并排序和计数排序。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下本文大致的讲解内…

新生在线分班查询,用这个小程序制作仅需一分钟!

今天许多学校已陆续开学,老师们又开始忙碌起来。他们需要将新生的分班信息逐一通知给每位家长,这不仅是一项繁琐的工作,而且效率也不高。传统的方法是通过电话、短信或邮件一一通知,这不仅耗时耗力,还容易出现信息传递…

百度文库文章-暂存下-------题 目: 链式简单选择排序

题 目: 链式简单选择排序 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务: (包括课程设计工作量…

如何用pytorch进行图像分类

如何用pytorch进行图像分类 使用PyTorch进行图像分类是深度学习中的一个常见任务,涉及一系列步骤,从数据预处理到模型训练和评估。下面将详细描述每个步骤,从零开始构建一个图像分类器。 1. 安装必要的库 在开始之前,首先需要确…

驱动(RK3588S)第四课时:模块化编程

目录 一、什么是模块化编程二、怎么把自己编译代码给加载到开发板上运行三、驱动编程的框架四、驱动编程具体实例1、编写单模块化驱动代码2、编写多模块化驱动代码3、编写向模块传参驱动代码4、编写多模块化驱动代码另一种方式 一、什么是模块化编程 在嵌入式里所谓的模块化编…

Vue——day07之条件渲染、列表渲染以及监测数据

目录 1.template标签 2.条件渲染 3.列表渲染 4.v-for中的key的作用以及原理 5.列表过滤 placeholder 前端空字符串 使用数据监视watch实现 使用计算属性实现 6.列表排序 7.Vue更新数据检测失败 原因 总结 1.template标签 template标签是Vue.js中的一个特殊元素&am…

kube-scheduler调度策略之预选策略(三)

一、概述 摘要:本文我们继续分析源码,并聚焦在预选策略的调度过程的执行。 二、正文 说明:基于 kubernetes v1.12.0 源码分析 上文我们说的(g *genericScheduler) Schedule()函数调用了findNodesThatFit()执行预选策略。 2.1 findNodesTha…