MATLAB 自定义图像滤波函数实现与效果对比
项目介绍
本项目主要致力于通过底层算法完整复现 MATLAB 官方自带函数 imfilter 的核心功能。项目通过编写独立的 MATLAB 脚本,在不依赖图像处理工具箱高级滤波函数的情况下,实现了二维图像的线性滤波处理。
程序的目的是帮助用户深入理解图像处理中“卷积”与“相关”操作的数学原理、边界填充策略的具体实现以及滑动窗口机制的运作方式。为了验证算法的准确性,程序将自定义实现的输出结果与 MATLAB 官方函数的处理结果进行了像素级的对比(包括视觉对比和均方误差 MSE 计算)。
功能特性
- 底层算法复现:不调用
imfilter、conv2 等高级库函数,完全基于矩阵操作和循环逻辑实现图像滤波。 - 图像预处理:包含鲁棒的图像读取机制(支持自动回退到随机图像)以及手动实现的 RGB 转灰度算法。
- 多种边界填充支持:
*
零填充 (Zeros):图像边界外区域补零。
*
复制填充 (Replicate):边界像素向外延伸复制,模拟
padarray 的 replicate 模式。
*
对称填充 (Symmetric):以边界为轴像镜面一样填充,模拟
padarray 的 symmetric 模式。
- 双运算模式:支持 相关 (Correlation) 和 卷积 (Convolution) 两种运算模式,其中卷积模式会自动对滤波核进行 180 度旋转。
- 自定义滤波核:
* 程序内通过数学公式手动生成高斯平滑核。
* 定义了用于边缘增强的锐化核(拉普拉斯算子变体)。
- 效果验证与可视化:提供自定义算法与官方算法的并排对比显示,并计算差异图和均方误差 (MSE)。
系统要求
- MATLAB R2016a 或更高版本(代码主要依赖基础矩阵运算,兼容性较好)。
- 无需 Image Processing Toolbox(对比验证部分除外)。
使用方法
直接在 MATLAB 环境中运行主脚本即可。程序会自动执行以下流程:
- 读取并预处理图像。
- 生成滤波核。
- 执行“高斯平滑”场景下的对比测试。
- 执行“图像锐化”场景下的对比测试。
- 弹出图形窗口显示所有对比结果及耗时统计。
详细实现逻辑与算法分析
本项目完全基于提供的源代码实现,核心逻辑分为以下几个关键模块:
1. 图像读取与灰度化处理
程序首先尝试读取名为
peppers.png 的示例图像。若文件不存在,则自动生成一张随机的彩色噪声图像作为替代,保证程序运行不报错。
在获取到 RGB 图像后,程序未使用
rgb2gray 函数,而是直接通过加权平均法将三通道转换为单通道灰度图。
- 转换公式:$Y = 0.2989 times R + 0.5870 times G + 0.1140 times B$
- 为保证精度,计算过程在
double 类型下进行,最后转回 uint8。
2. 滤波器核生成
程序演示了两种不同类型核的定义方式:
- 高斯核 (Gaussian):不使用
fspecial,而是通过 meshgrid 生成坐标网格,结合高斯函数公式 $exp(-(x^2 + y^2) / 2sigma^2)$ 手动计算,并进行归一化处理,确保核元素之和为 1。 - 锐化核 (Sharpen):直接定义了一个 $3 times 3$ 的矩阵模板,使用典型的拉普拉斯锐化算子。
3. 核心滤波算法实现 (Custom Filter Implementation)
这是项目的核心部分,实现了一个通用的二维滤波函数,逻辑如下:
- 数据类型转换:为了避免溢出和精度损失,将输入图像强制转换为
double 类型。 - 模式处理:检查运算模式参数。如果是 卷积 (Convolution) 模式,利用
rot90 函数将滤波核旋转 180 度;如果是 相关 (Correlation) 模式,保持核不变。 - 计算填充尺寸:根据滤波核的尺寸($H times W$),计算需要向四周填充的像素数,通常为核尺寸的一半向下取整(Floor)。
- 边界填充 (Padding):调用自定义的填充函数,将原始图像扩展为一个更大的矩阵。
- 滑动窗口操作:
* 使用双重
for 循环遍历原始图像的每一个像素点。
* 在填充后的矩阵中,提取与当前像素对应的、大小与滤波核相同的局部区域 (Region of Interest, ROI)。
* 执行点乘求和运算:将 ROI 矩阵与滤波核矩阵进行对应元素相乘并求累加和,得到当前像素的滤波输出值。
- 输出处理:将计算结果矩阵根据原始图像的类型(如
uint8)进行截断和类型转换,输出最终结果。
4. 边界填充算法实现 (Custom Padarray)
该模块独立实现了 MATLAB
padarray 函数的部分功能:
- 初始化:根据图像尺寸和填充半径,创建一个全零的“大矩阵”,并将原图复制到中心位置。
- 策略分发:
*
Zeros:保持初始化状态,四周即为 0。
*
Replicate:首先将原图的第一行和最后一行分别向上、向下复制填充主要区域;然后将填充后的矩阵的最左列和最右列分别向左、向右复制。这种两步走策略确保了四个角点的像素也能被正确填充(即角点像素的值来自于原图对应的角点)。
*
Symmetric:执行镜像操作。首先将原图上下边缘的像素倒序填充到上下边界;然后将已有数据的矩阵(包含已填充的上下边界)的左右边缘进行镜像倒序填充。这保证了图像内容的连续性过渡。
5. 效果对比与验证
程序设计了两个具体的测试场景来全方位验证算法:
- 场景 A:使用高斯核,采用“复制填充”和“相关运算”。重点验证平滑效果和 Replicate 边界处理的正确性。
- 场景 B:使用锐化核,采用“对称填充”和“卷积运算”。重点验证细节增强效果、卷积旋转机制以及 Symmetric 边界处理的正确性。
每个场景均计算
MSE (均方误差),即官方结果与自定义结果差值的平方均值。在可视化环节,程序展示了原始图、官方处理图、自定义处理图以及两者相减后的差异图(放大 50 倍显示),以便用户直观地观察到两者的输出几乎完全一致(MSE 极低,差异图接近全黑)。