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