三、空域滤波
3.3 统计排序滤波器
统计排序滤波器属于非线性空域滤波器,常见的统计排序滤波器有中值滤波器、最大值滤波器、最小值滤波器。
中值滤波器、最大值滤波器和最小值滤波器是三种常见的统计排序滤波器,它们在图像处理和信号处理中发挥着重要作用。以下是对这三种滤波器的详细讲解
3.3.1最大滤波器
最大滤波器的主要原理是将滤波窗口内所有像素的灰度值中的最大值赋给窗口中心的像素。其主要作用是查找图像中的最亮点或降低胡椒噪声(可以理解成图像中像胡椒一样的小黑点),能在突出图像中亮区域的同时会削弱亮区域相邻的暗区域。这对降低胡椒噪声是极为有效的,但也可能会导致图像中其它暗区域的细节丢失。
3.3.2最小滤波器
最小值滤波器的主要原理与最大值滤波器相反,它能将滤波窗口内所有像素的灰度值中的最小值赋给窗口中心的像素。这种滤波器常用于寻找图像中的最暗点或降低盐粒噪声(可以理解成图像中像盐粒一样的小白点),能在突出图像中暗区域的同时会削弱亮区域相邻的亮区域。这对降低盐粒噪声是极为有效的,但也可能会导致图像中其它亮区域的细节丢失。
3.3.3中值滤波器
中值滤波器的主要原理是将图像中窗口中心的像素值用该点邻域内各点值的中位数来替换。这种滤波器对于去除椒盐噪声(可以理解成盐粒和胡椒的混合)非常有效,同时能够较好地保持图像的边缘信息。但要是选择的图像邻域较大,会造成图像模糊。
注:窗口中心是指图像相对于滤波器覆盖区域的中心,而非整张图像的中心,随着滤波器的滑动,图像的每个区域都能得到计算。
原始图片
①最大滤波器操作
from PIL import Image
import numpy as np
import random
from scipy import ndimage
def add_pepper_noise(image, pepper_prob=0.05):
"""给图像添加椒噪声(黑点)"""
img_array = np.array(image)
# 生成一个与图像大小相同的随机矩阵
random_matrix = np.random.rand(*img_array.shape[:2])
# 添加椒噪声(黑点)
pepper_mask = random_matrix < pepper_prob
img_array[pepper_mask] = 0
return Image.fromarray(img_array)
def max_filter(image, size=3):
"""执行最大值滤波"""
img_array = np.array(image)
filtered_array = ndimage.maximum_filter(img_array, size=size, mode='constant', cval=0)
return Image.fromarray(filtered_array)
# 加载图片
input_image = Image.open('fu.jpg') # 请替换为您的图片路径
input_image.show(title="原始图片")
# 仅添加椒噪声
pepper_noise_image = add_pepper_noise(input_image, pepper_prob=0.05)
pepper_noise_image.show(title="仅加椒噪声后的图片")
# 应用最大值滤波
max_filtered_image = max_filter(pepper_noise_image, size=3)
max_filtered_image.show(title="最大值滤波后的图片")
添加胡椒噪声后的图片
最大滤波器处理后的图片
②最小滤波器操作
from PIL import Image
import numpy as np
from scipy import ndimage
def add_salt_noise(image, salt_prob=0.05):
"""给图像仅添加盐噪声(白点)"""
img_array = np.array(image)
# 生成一个与图像大小相同的随机矩阵
random_matrix = np.random.rand(*img_array.shape[:2])
# 添加盐噪声(白点)
salt_mask = random_matrix < salt_prob
img_array[salt_mask] = 255
return Image.fromarray(img_array)
def min_filter(image, size=3):
"""执行最小值滤波"""
img_array = np.array(image)
filtered_array = ndimage.minimum_filter(img_array, size=size, mode='constant', cval=255)
return Image.fromarray(filtered_array)
# 加载图片
input_image = Image.open('fu.jpg') # 请替换为您的图片路径
input_image.show(title="原始图片")
# 仅添加盐噪声
salt_noise_image = add_salt_noise(input_image, salt_prob=0.05)
salt_noise_image.show(title="仅加盐噪声后的图片")
# 应用最小值滤波
min_filtered_image = min_filter(salt_noise_image, size=3)
min_filtered_image.show(title="最小值滤波后的图片")
添加盐粒噪声后的图片
最小滤波器处理后的图片
③中值处理
from PIL import Image
import numpy as np
from scipy import ndimage
def median_filter(image, size=3):
"""执行中值滤波"""
img_array = np.array(image)
filtered_array = ndimage.median_filter(img_array, size=size, mode='constant', cval=0)
return Image.fromarray(filtered_array)
# 加载图片
input_image = Image.open('yanli.jpg') # 请替换为您的图片路径
# 应用中值滤波
median_filtered_image = median_filter(input_image, size=3)
median_filtered_image.show(title="中值滤波后的图片")
处理盐粒图片后的效果
注,本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。