OpenCV(二十五):方盒滤波与均值滤波
滤波的基本概念
滤波的核心思想是:
对每个像素,以其邻域(通常为 k×k 窗口)为基础进行计算,使输出像素值更平滑或者更符合某种特定需求。
线性滤波的一般形式为:

其中 k(i,j) 为滤波核(kernel)。
归一化的意义
- 避免数值溢出
卷积核的所有元素之和被缩放到 1,不会把像素变得太大。
- 保持图像亮度不改变
例如均值滤波后,亮度不会“变亮”。
- 使滤波核有明确的物理意义
例如平均滤波核:

表示每个像素的权重是 1/9。
- 让不同大小的滤波窗口输出可比较
3×3、5×5 核都保持统一尺度,不会因为窗口大而输出更大值。
总结:
归一化 = 除以滤波窗口权重之和,使输出像素保持与输入同样的范围和尺度。
在 OpenCV 中:
normalize=True→ 均值滤波normalize=False→ 求区域和(不缩放)
方盒滤波(Box Filter)原理
方盒滤波属于线性滤波的一种,它的滤波核为常数,因此又称 Box Kernel。其基本思想是:
在邻域窗口内对像素值求和,然后乘以一个归一化因子(可选择是否归一化)。
滤波核一般形式为:

若需要归一化,则:

OpenCV 中对应函数为:
cv2.boxFilter(src, ddepth, ksize, anchor=None,normalize=True, borderType=None)
参数说明:
| 参数 | 含义 |
|---|---|
src | 输入图像 |
ddepth | 输出类型,-1 最常用 |
ksize | 滤波核大小 |
anchor | 内核中心,默认即可 |
normalize | 是否均值化 |
borderType | 边界处理方式 |
特点
优点:
- 速度快
内部通过积分图(Integral Image)优化,可实现 O(1) 的均值计算。 - 能支持不归一化情况下的求和滤波
normalize=False 时可用于快速求区域和。 - 灵活度高
可指定目标深度 ddepth(如 CV_16S、CV_32F)。
缺点:
- 对边缘模糊明显
因为所有邻域像素权重相同,不能保留边缘。 - 容易产生较大程度的模糊
比高斯滤波更容易导致图像信息丢失。
均值滤波(Mean Filter / Blur)原理
均值滤波是方盒滤波的特例。其核心思想是:
取邻域窗口内所有像素的平均值作为输出像素。
数学形式:

OpenCV 函数:
cv2.blur(src, ksize)
其内部实际上调用的是带 normalize=True 的 boxFilter,因此结果与归一化的 boxFilter 完全一致。
特点
优点:
- 简单高效,计算速度快
- 实现平滑效果明显
- 使用最广泛的基础平滑方法
缺点:
- 边缘模糊严重
- 去噪能力一般
- 无法区分噪声与细节信息(容易破坏边缘)
方盒滤波 vs. 均值滤波 对比
| 项目 | 方盒滤波(boxFilter) | 均值滤波(blur) |
|---|---|---|
| 本质 | 区域像素求和(可归一也可不归一) | 归一化的 boxFilter |
| 算法 | 可使用积分图优化 | 调用 boxFilter(normalize=True) |
| 是否可控制归一化 | 可以 | 不可以(默认归一化) |
| 速度 | 快 | 快(本质同 boxFilter) |
| 灵活性 | 高(支持 ddepth) | 较低 |
| 常见用途 | ROI 求和、快速滤波 | 普通平滑降噪 |
示例
import cv2
import numpy as npimg = cv2.imread('test.jpg')# 均值滤波
blur_img = cv2.blur(img, (5, 5))# 方盒滤波(与 blur 等效)
box_img = cv2.boxFilter(img, ddepth=-1, ksize=(5, 5), normalize=True)# 方盒滤波(不归一:仅求和)
box_sum = cv2.boxFilter(img, ddepth=-1, ksize=(5, 5), normalize=False)cv2.imshow('original', img)
cv2.imshow('mean blur', blur_img)
cv2.imshow('box filter', box_img)
cv2.imshow('box sum', box_sum)
cv2.waitKey(0)
cv2.destroyAllWindows()
