opencv 均值滤波 Mean filtering

opencv 均值滤波 Mean filtering

均值滤波是典型的线性滤波算法,是指用当前像素点周围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()

 

 

发表回复

您的电子邮箱地址不会被公开。