基于MATLAB的包滤波器 (Box Filter) 算法实现
项目介绍
本项目在MATLAB环境中完整实现了一个基于滑动窗口的包滤波器(Box Filter)算法。该算法的核心逻辑是利用一个固定尺寸的矩形窗口(Kernel)在图像上逐像素滑动,计算窗口覆盖区域内所有像素强度的累加和,并将结果赋值给中心像素。该技术不仅是构建积分图(Integral Image)的基础,也是实现快速模糊、近似高斯平滑以及 Haar 特征计算的关键步骤。
项目代码不依赖外部图像文件,而是通过内置算法生成合成的灰度及彩色几何纹理图像进行算法验证,并提供了全方位的可视化分析工具,包括2D结果展示、局部3D视图以及1D像素强度剖面分析。
功能特性
- 自定义核尺寸滤波:支持任意尺寸(如3x3, 5x5等)的方形滤波核,代码默认为5x5窗口。
- 区域积分计算:算法输出为窗口内的像素强度总和(积分),而非平均值,数据类型采用双精度浮点数(double)以防止数值溢出。
- 多通道处理能力:具备处理单通道灰度图像和三通道RGB彩色图像的能力,对每个通道独立进行卷积运算。
- 灵活的边界处理:
*
零填充 (Zero-padding):在图像周围补充0值,保持输出图像尺寸不变。
*
边缘复制 (Replicate):复制图像边缘像素进行填充,有效减少边界处的“黑框”伪影。
- 高效向量化实现:利用MATLAB矩阵运算特性,避免了低效的逐像素循环,提高运算速度。
- 多维结果可视化:提供原图对比、归一化后的彩色结果、局部区域的3D柱状图以及单行像素的强度曲线对比。
核心算法与实现逻辑
本项目的主程序和核心算法函数紧密配合,具体实现逻辑如下:
1. 数据生成与预处理
程序首先清空环境,随即生成用于测试的合成图像:
- 灰度测试图:构建一个 $256 times 256$ 的矩阵,利用正弦和余弦函数生成波浪纹理,并在中心区域(坐标100-150)人为添加一个高亮矩形块,用于观察滤波器对突变边缘的响应。
- 彩色测试图:将灰度图与其转置矩阵、旋转矩阵进行通道拼接,合成RGB图像。
- 数据类型转换:在进入滤波处理前,强制将图像数据转换为
double 类型。这是为了确保在计算像素累加和时,数值不会因为超出 uint8 的范围(0-255)而发生截断或溢出。
2. 包滤波器核心逻辑 (Execute Box Filter)
这是算法的执行主体,负责协调边界填充与卷积运算:
- 核构建:创建一个全为1的矩阵 (
ones) 作为滤波核。因算法目标是求和,故不进行归一化除法操作。 - 通道分离与合并:针对输入图像的通道数(Layers)进行循环,分别提取R、G、B分量独立处理。
- 有效卷积:在经过边界填充后的图像上,使用二维卷积函数 (
conv2) 并开启 'valid' 模式。该模式仅计算卷积核完全覆盖图像的区域,配合之前的Padding操作,确保了输出结果与原始输入图像尺寸严格一致。
3. @边界处理机制 (Apply Padding)
为了解决卷积操作导致的尺寸缩减问题,代码手动实现了一个边界填充函数,支持两种策略:
- 零填充模式:计算填充宽度(核大小的一半),创建一个扩大的全零矩阵,将原图嵌入中心。
- 边缘复制模式:不仅将原图嵌入中心,还分别对上、下、左、右四个边缘以及四个角点进行像素复制(
repmat),使填充区域延续原图边缘的纹理特征。
4. 结果可视化分析
主程序最后通过六个子图展示处理效果:
- 灰度展示:直接显示灰度积分结果(使用自动缩放显示范围),可以明显观察到经过滤波后图像变得模糊,且数值显著增大(平滑效果)。
- 3D局部视图:选取图像中心的一小块区域,通过 3D 柱状图 (
bar3) 直观展示滤波后的数值分布形态。 - 彩色展示:将RGB三个通道的积分结果分别进行归一化 (
mat2gray) 后合并显示,便于人眼观察色彩平滑效果。 - 1D剖面对比:提取图像第128行的像素数据,绘制“原始强度”与“区域平均强度”(积分结果除以核面积)的曲线对比。这直观地展示了包滤波器对高频噪声的抑制作用以及对边缘的平滑过渡效果。
系统要求
- 软件环境:MATLAB R2016b 或更高版本(代码使用基础矩阵运算,对版本兼容性较好)。
- 工具箱:无特殊工具箱依赖,主要使用 MATLAB 基础函数(
conv2, imshow, meshgrid, cat 等)。
使用说明
- 确保MATLAB当前工作目录包含项目代码文件。
- 直接运行主程序脚本。
- 程序将自动生成测试数据,执行算法,并在新窗口中弹出包含6个子图的综合结果展示界面。
- 观察控制台输出,可跟踪当前正在处理灰度图还是彩色图的进度。