opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

什么是图像平滑处理?

图像平滑处理(Image

Smoothing)是一种图像处理技术,旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像,以便在后续图像处理任务中获得更好的结果。

常用的图像平滑处理方法包括:

均值滤波(Mean Filtering):用图像中像素周围区域的平均值来代替每个像素的值,从而平滑图像。均值滤波对去除高斯噪声等简单噪声类型效果较好。

高斯滤波(Gaussian Filtering):使用高斯核来对图像进行滤波,高斯滤波在平滑图像的同时能够较好地保留图像的边缘信息。

中值滤波(Median Filtering):用像素周围区域像素值的中值来代替每个像素的值,适用于去除椒盐噪声等脉冲型噪声。

双边滤波(Bilateral Filtering):结合空间域和灰度值域的信息,能够保持图像的边缘特征,同时对图像进行平滑处理。

图像平滑处理应用场景

图像平滑处理在图像处理中有广泛的应用场景,主要用于去除图像中的噪声、减少细节、平滑图像的过渡部分,从而提升后续图像处理任务的效果。

以下是图像平滑处理的一些常见应用场景:

去噪声:图像中可能存在不同类型的噪声,如高斯噪声、椒盐噪声等。使用图像平滑处理方法可以有效地减少这些噪声,提高图像质量。

在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑

处理,所得的图像称为平滑图像。例如,下图是含有噪声的图像,在图像内存在噪声信息,

我们通常会通过图像平滑处理等方式去除这些噪声信息。

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

图像降噪:在低光条件下或者高ISO值下拍摄的图像可能会有较多的噪点。通过图像平滑处理,可以降低噪点的影响,使图像看起来更加干净和清晰。

图像模糊:在某些情况下,我们可能希望减少图像中的细节,使图像变得模糊,以达到某种特定的效果。图像平滑处理可以实现这个目标。

图像缩放:当对图像进行缩放操作时,可能会引入锯齿效应或马赛克现象。通过图像平滑处理,可以减少这些不平滑的现象,得到更平滑的缩放图像。

边缘检测:在进行边缘检测等图像处理任务时,图像平滑处理可以帮助去除细节,使边缘更加清晰和明显。

目标检测和识别:在某些情况下,图像中的细节和噪声可能会干扰目标检测和识别算法。通过图像平滑处理,可以消除这些干扰,提高目标检测和识别的准确性。

总的来说,图像平滑处理是图像预处理的重要步骤,它能够改善图像质量、减少噪声和细节,为后续图像处理任务提供更好的输入。不过需要注意,过度的平滑处理可能会导致图像失真和信息丢失,因此在应用图像平滑处理时需要权衡处理效果和影响。

均值滤波

定义:

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

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

在进行均值滤波时,首先要考虑需要对周围多少个像素点取平均值。通常情况下,我们会

以当前像素点为中心,对行数和列数相等的一块区域内的所有像素点的像素值求平均。例如,

在上图 中,可以以当前 226 像素点为中心,对周围 3×3 区域内所有像素点的像素值求平均,也可以对周围 5×5 区域内所有像素点的像素值求平均。

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

新值=[(197+25+106+156+159)+
(149+40+107+5+71)+
(163+198+226+223+156)+
(222+37+68+193+157)+
(42+72+250+41+75)]/25
=126

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

得到当前图像的均值滤波结果。

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

图像外部是没有像素点和像素值的,显然是无法计算该点的 5×5 邻域均值的。
针对边缘像素点,可以只取图像内存在的周围邻域点的像素值均值。

如图 7-8 所示,计算

左上角的均值滤波结果时,仅取图中灰色背景的 3×3 邻域内的像素值的平均值。

在图 7-8 中,对于左上角(第 1 行第 1 列)的像素点,我们取第 1~3 列与第 1~3 行交汇处

所包含的 3×3 邻域内的像素点的像素值均值。因此,当前像素点的均值滤波计算方法为:

新值=[(23+158+140)+
(238+0+67)+
(199+197+25)]/9
=116

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

除此以外,还可以扩展当前图像的周围像素点。例如,将当前 9×7 大小的图像扩展为 13×11大小的图像,如图 7-9 所示。

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

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

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

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

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

式中,M 和 N 分别对应高度和宽度。一般情况下,M 和 N 是相等的,例如比较常用的 3×3、5×5、

7×7 等。如果 M 和 N 的值越大,参与运算的像素点数量就越多,图像失真越严重。

函数语法

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

dst = cv2.blur( src, ksize, anchor, borderType )

式中:

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

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

 ksize 是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。

例如,其值可以为(5, 5),表示以 5×5 大小的邻域均值作为图像均值滤波处理的结果,

如下式所示。


anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
 borderType 是边界样式 ,该值决定了以何种方式处理边界,其值如表 7-1 所示。一般情

况下不需要考虑该值的取值,直接采用默认值即可。

通常情况下,使用均值滤波函数时,对于锚点 anchor 和边界样式 borderType,直接采用其

默认值即可。因此,函数 cv2.blur()的一般形式为:

dst = cv2.blur( src, ksize,)

实验: 读取一幅噪声图像,使用函数 cv2.blur()对图像进行均值滤波处理,得到去噪图像,并显示原始图像和去噪图像

实验原图

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

运行上述程序后,会分别显示噪声图像(左图)和去噪图像(右图)

实验2:针对噪声图像,使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况。

调整设置函数 cv2.blur()中的 ksize 参数,示例代码如下

代码如下:

import cv2
o=cv2.imread("lenaNoise.png") #读取待处理图像
#使用 blur 函数处理图像
r3=cv2.blur(o,(3,3))
r5=cv2.blur(o,(5,5))
r7=cv2.blur(o,(7,7))
cv2.imshow("original",o)
cv2.imshow("result3",r3)
cv2.imshow("result5",r5)
cv2.imshow("result7",r7)
cv2.waitKey()
cv2.destroyAllWindows()

从结果图中可以看出,卷积核越来,图片会越模糊.

相关推荐
是十一月末38 分钟前
Opencv实现图像的腐蚀、膨胀及开、闭运算
人工智能·python·opencv·计算机视觉
云空1 小时前
《探索PyTorch计算机视觉:原理、应用与实践》
人工智能·pytorch·python·深度学习·计算机视觉
长风清留扬2 小时前
基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南
人工智能·神经网络·opencv·计算机视觉·自然语言处理·数据挖掘·whisper
bryant_meng7 小时前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
西猫雷婶11 小时前
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
开发语言·python·opencv
湫ccc12 小时前
《Opencv》基础操作详解(3)
人工智能·opencv·计算机视觉
西西弗Sisyphus15 小时前
探索多模态大语言模型(MLLMs)的推理能力
人工智能·计算机视觉·语言模型·大模型
yinqinggong15 小时前
从源码编译支持FFmpeg的OpenCV
opencv·ffmpeg
帅逼码农15 小时前
K-均值聚类算法
算法·均值算法·聚类
864记忆17 小时前
关于opencv、Qt、msvc编译器之间的关系
人工智能·qt·opencv