滤波是信号处理中的概念,指的是将信号中特定波段频率滤除的操作。在图像处理中,和通过傅里叶变化实现的频域下的滤波是等效的,所以也称为滤波。首先要学习的是空间域滤波,主要是基于邻域(空间域)对图像中的像素执行计算,这个术语用来区分之后会学习的频率域滤波。
所谓平滑,主要目的是为了减少和抑制图像中的噪声,在空间域中使用邻域平均的方法来实现。最最简单的就是平滑模板,是下方公式中描述的一个矩阵,我们通常称之为模板、滤波器或者过滤器。
简单来说,当k=3时,w是一个3x3的矩阵,输出图像中的某个像素点的数值,是输入图像中对应位置上也是一个3x3的空间与这个平滑模板的点乘的结果。由于我们加上了,所以确保结果不至于超过灰度值上限的255。为了计算的直观,通常k都是取奇数而不是偶数。那么最小的奇数是1,1实际上就是表示不进行平滑处理。
另外在事先的过程中还有一个问题,就是在图像的边界处如何处理。如果要求图像处理前后尺寸不变,那么最简单的方法就是填充,根据我们平滑模板的大小,如果平滑模板的边长为3,那么就在图像的上下左右各添加一层灰度值为0的区域,以实现尺寸不变;如果平滑模板的边长为5,那么上下左右就需要各添加两层,这种简称为“全0填充”。这种“全0填充”在平滑处理时影响不是那么明显,但是在图像锐化时就会产生原本不存在的边缘突出,所以有其他几种常用的效果好一些的边界填充方法,例如镜像填充或者重复填充。我们暂时考虑重复填充,实现的代码如下:
from PIL import Image
import numpy as np
def AverageFilter(src, dst, k = 3, method = "replicate"):
imarray = np.array(Image.open(src))
height, width = imarray.shape
new_arr = np.zeros((heigh