win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)

Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm

均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
7.1.1 基本原理
例如,希望对下图中位于第5行第4列的像素点进行均值滤波。
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第1张图片
在进行均值滤波时,首先要考虑需要对周围多少个像素点取平均值。通常情况下,我们会以当前像素点为中心,对行数和列数相等的一块区域内的所有像素点的像素值求平均。例如,在上图中,可以以当前像素点为中心,对周围3×3区域内所有像素点的像素值求平均,也可以对周围5×5区域内所有像素点的像素值求平均。
当前像素点的位置为第5行第4列,我们对其周围5×5区域内的像素值求平均,计算方法为:
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第2张图片
计算完成后得到126,我们将126作为当前像素点均值滤波后的像素值。我们针对图中的每一个像素点计算其周围5×5区域内的像素值均值,并将其作为当前像素点的新值,即可得到当前图像的均值滤波结果。
当然,图像的边界点并不存在5×5邻域区域。例如,左上角第1行第1列上的像素点,其像素值为23,如果以其为中心点取周围5×5邻域,则5×5邻域中的部分区域位于图像外部。图像外部是没有像素点和像素值的,显然是无法计算该点的5×5邻域均值的。
针对边缘像素点,可以只取图像内存在的周围邻域点的像素值均值。如图7-8所示,计算左上角的均值滤波结果时,仅取图中灰色背景的3×3邻域内的像素值的平均值。
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第3张图片

在上图中,对于左上角(第1行第1列)的像素点,我们取第1-3列与第1~3行交汇处所包含的3×3邻域内的像素点的像素值均值。因此,当前像素点的均值滤波计算方法为:
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第4张图片

计算完成后得到116,将该值作为该点的滤波结果即可。
除此以外,还可以扩展当前图像的周围像素点。例如,将当前9×7大小的图像扩展为13×11大小的图像,如下图所示。
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第5张图片

完成图像边缘扩展后,可以在新增的行列内填充不同的像素值。在此基础上,再针对9×7的原始图像计算其5×5邻域内像素点的像素值均值。OpenCV提供了多种边界处理方式,我们可以根据实际需要选用不同的边界处理模式。
针对图像中第5行第5列的像素点,其运算过程相当于与一个内部值都是1/25的5×5矩阵进行相乘计算,从而得到均值滤波的结果126,其对应的关系如下图所示。
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第6张图片

根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的5×5矩阵相乘,得到均值滤波的计算结果,如下图所示。
win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第7张图片

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

win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第8张图片

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

win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)_第9张图片
式中,M和N分别对应高度和宽度。一般情况下,M和N是相等的,例如比较常用的3×3、5×5、7×7等。如果M和N的值越大,参与运算的像素点数量就越多,图像失真越严重。

你可能感兴趣的:(Python-OpenCV)