1、均值滤波简单介绍:均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m m为该模板中包含当前像素在内的像素总个数。
2、两种实现方法:
(1)自定义均值滤波函数
该方法使用需要注意的是如果对象是彩色图片需要先去色,转换为灰度图。
import numpy as np
from imageio import imread
from scipy.misc import imsave, imresize
import matplotlib.pyplot as plt
from PIL import Image
def means_filter(input_image, filter_size):
input_image_cp = np.copy(input_image) # 输入图像的副本
filter_template = np.ones((filter_size, filter_size)) # 空间滤波器模板 卷积核
pad_num = int((filter_size - 1) / 2) # 输入图像需要填充的尺寸
input_image_cp = np.pad(input_image_cp, (pad_num, pad_num), mode="constant", constant_values=0) # 填充输入图像
m, n = input_image_cp.shape # 获取填充后的输入图像的大小
output_image = np.copy(input_image_cp) # 输出图像
# 空间滤波
for i in range(pad_num, m - pad_num):
for j in range(pad_num, n - pad_num):
#卷积运算,并计算灰度均值返回到原来的像素点
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)
output_image = output_image[pad_num:m - pad_num, pad_num:n - pad_num] # 还原填充零之前的图像形状大小
return output_image
if name == “main”:
input_images = np.zeros((500, 500))
filename = “E:\matlammsvv\ssz.jpg”
im = imread(‘E:\matlammsvv\ssz.jpg’)
# convert将当前图像转换为灰度模式,并且返回新的图像。
# 将图片在重新定义的矩阵中再显示
plt.subplot(131)
plt.imshow(im)
img = Image.open(filename).resize((500, 500)).convert(‘L’) # 重新设置图像大小并去色转换为二维
plt.subplot(132)
plt.imshow(img)
out_img = means_filter(img,filter_size=21)#实现均值滤波,并设定模板
plt.subplot(133)
plt.imshow(out_img)
plt.show()
(2)调用库函数方法:调用numy库中的mean函数(均值函数)即np.mean()
from imageio import imread
from scipy.misc import imsave, imresize
import matplotlib.pyplot as plt
import numpy as np
def MeanFilter(img,K_size): #均值滤波
h,w,c = img.shape #读取照片数据大小
print(img.shape)
#填充0
pad = int((K_size - 1) / 2) #计算填充层数
out = np.zeros((h+2pad,w + 2pad,c),dtype = np.float) #卷积核
out[pad:pad+h,pad:pad+w] = img.copy().astype(np.float)#原始图片副本像素转换格式输出到out
#卷积过程
tmp = out.copy()
for y in range(h):
for x in range(w):
for ci in range©:
out[pad+y,pad+x,ci]=np.mean(tmp[y:y+K_size,x:x+K_size,ci])#tmp中的像素求平均值并赋值
out = out[pad:pad + h, pad:pad + w].astype(np.uint8)
return out
if name == “main”:
img = imread(‘E:\matlammsvv\ssz.jpg’)
plt.subplot(1, 3, 1)
plt.imshow(img)
plt.subplot(1, 3, 2)
plt.imshow(MeanFilter(img,21)) #滤波后图像显示2121
plt.subplot(1, 3, 3)
plt.imshow(MeanFilter(img, 20)) # 滤波后图像显示2020
plt.show()
以上两种方法都能实现均值滤波,希望能帮助到需要的人,本人刚入门有问题可以和大家一起学习。写作过程中参考了大神的程序链接放在下面:
https://www.cnblogs.com/iwuqing/p/11380131.html?tdsourcetag=s_pcqq_aiomsg