📅  最后修改于: 2023-12-03 14:56:37.570000             🧑  作者: Mango
在数字图像处理中,空间过滤器被广泛应用于图像去噪、平滑和增强等领域。其中,平均过滤器和中值过滤器是常用的两种空间滤波器。
平均过滤器是最简单的空间滤波器之一,在图像中以一个矩形窗口围绕着每个像素,该窗口大小是由用户指定的。该方法将窗口中所有像素的灰度值的平均值作为该像素的新值。平均过滤器可以减少噪声和边缘细节,但它却会导致图像模糊。
以下代码使用Python实现了一个简单的平均滤波器。其输入是一张灰度图像,输出是一个经过平均滤波器处理后的图像。
import cv2
def average_filter(img, kernel_size):
"""
平均滤波器
:param img: 输入图像,要求是灰度图像,通道数为1
:param kernel_size: 卷积核大小
:return: 平滑后的图像
"""
height, width = img.shape[:2]
pad_size = kernel_size // 2
img_pad = cv2.copyMakeBorder(img, pad_size, pad_size, pad_size, pad_size, cv2.BORDER_REPLICATE)
img_smooth = img.copy()
for i in range(pad_size, height + pad_size):
for j in range(pad_size, width + pad_size):
sum_pix = 0
for m in range(i - pad_size, i + pad_size + 1):
for n in range(j - pad_size, j + pad_size + 1):
sum_pix += int(img_pad[m][n])
img_smooth[i - pad_size][j - pad_size] = sum_pix // (kernel_size * kernel_size)
return img_smooth
该代码中,我们使用了OpenCV的copyMakeBorder
函数对图像进行填充,使得卷积核可以对图像边缘的像素进行卷积运算。然后,我们使用两个循环来遍历整张图像,对每个像素进行平均运算。
中值滤波器是一种非线性滤波器,它利用像素点周围的亮度值的中间值来取代该像素的亮度值,从而抑制孤立的噪点。中值过滤器在某些情况下可以表现出比平均过滤器更好的去噪效果。
以下代码使用Python实现了一个简单的中值滤波器。其输入是一张灰度图像,输出是一个经过中值滤波器处理后的图像。
import cv2
import numpy as np
def median_filter(img, kernel_size):
"""
中值滤波器
:param img: 输入图像,要求是灰度图像,通道数为1
:param kernel_size: 卷积核大小
:return: 平滑后的图像
"""
height, width = img.shape[:2]
pad_size = kernel_size // 2
img_pad = cv2.copyMakeBorder(img, pad_size, pad_size, pad_size, pad_size, cv2.BORDER_REPLICATE)
img_smooth = img.copy()
for i in range(pad_size, height + pad_size):
for j in range(pad_size, width + pad_size):
window = img_pad[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1]
img_smooth[i - pad_size][j - pad_size] = np.median(window)
return img_smooth
该代码中,我们同样使用了OpenCV的copyMakeBorder
函数对图像进行填充。然后,我们使用两个循环遍历整张图像,对每个像素的周围像素进行中值运算。为了简化我们的代码,我们使用了NumPy的median
函数来计算中值。