均值滤波是典型的线性滤波算法,是指用当前像素点周围nxn个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,可完成整幅图像的均值滤波。
对第5行第5列的像素点进行均值滤波时,首先需要考虑需要对周围多少个像素点去取平均值。通常情况下,我们会以该当前像素为中心,对行数和列数相等的一块区域内的所有像素点的像素取平均值。
针对第 5 行第 5 列像素点均值滤波的运算示意图。
针对每一个像素点,都是与一个内部值均为1/25的55矩阵相乘,得到均值滤波的计算结果。
卷积后的大小:(h+2*p-k_h)/s+1 * (w+2*p-k_w)/s+1
h和w均为上一层的长和宽,k_h和k_w为卷积核的长和宽,p为padding,s为stride。
import cv2 import matplotlib.pylab as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体 mpl.rcParams['axes.unicode_minus'] = False # 正常显示负号 # 均值滤波 img = cv2.imread("lena.jpeg") # 解决彩色图像出现色差问题 b, g, r = cv2.split(img) # 分别提取B、G、R通道 img_new = cv2.merge([r, g, b]) # 重新组合为R、G、B blur = cv2.blur(img_new, (25, 25)) # 显示图像 # plt.subplot(nrows, ncols, index) # 表示在当前画布的右上角创建一个1行2列的绘图区域,同时 选择在第 1 个位置绘制子图。 plt.subplot(1, 2, 1) plt.xticks([]), plt.yticks([]) # 隐藏x和y轴 plt.imshow(img_new) plt.title('原图') plt.subplot(1, 2, 2) plt.xticks([]), plt.yticks([]) # 隐藏x和y轴 # plt.imshow(blur, 'gray') plt.imshow(blur) plt.title('均值滤波') plt.show()