📜  空间过滤器——图像处理中的平均过滤器和中值过滤器(1)

📅  最后修改于: 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函数来计算中值。