1. 基本原理
使用元素的领域内像素的平均值代替该元素,可明显的降低图像灰度的尖锐变换。它的一种重要应用是模糊处理:得到感兴趣的区域的粗略表示,将次要的/小的元素与背景融合,使得主要的/较大的元素变得易于检测
$$ R=\frac{1}{m} \sum_{i=1}^{m} z_{i} $$
- $m$为滤波器大小
2. 测试结果
图源自skimage
3. 代码
1 import numpy as np
2
3
4 def means_filter(input_image, filter_size):
5 '''
6 均值滤波器
7 :param input_image: 输入图像
8 :param filter_size: 滤波器大小
9 :return: 输出图像
10
11 注:此实现滤波器大小必须为奇数且 >= 3
12 '''
13 input_image_cp = np.copy(input_image) # 输入图像的副本
14
15 filter_template = np.ones((filter_size, filter_size)) # 空间滤波器模板
16
17 pad_num = int((filter_size - 1) / 2) # 输入图像需要填充的尺寸
18
19 input_image_cp = np.pad(input_image_cp, (pad_num, pad_num), mode="constant", constant_values=0) # 填充输入图像
20
21 m, n = input_image_cp.shape # 获取填充后的输入图像的大小
22
23 output_image = np.copy(input_image_cp) # 输出图像
24
25 # 空间滤波
26 for i in range(pad_num, m - pad_num):
27 for j in range(pad_num, n - pad_num):
28 output_image[i, j] = np.sum(filter_template * input_image_cp[i - pad_num:i + pad_num + 1, j - pad_num:j + pad_num + 1]) / (filter_size ** 2)
29
30 output_image = output_image[pad_num:m - pad_num, pad_num:n - pad_num] # 裁剪
31
32 return output_image