关于python的加权中值滤波的实现

今天学了中值滤波还是懵懵懂懂的,求一段加权中值滤波的原图与滤波图对比代码,不要那种直接用库实现的,想弄明白这个东西的道理


import numpy as np
import cv2 as cv

def median_filter(input_image, kernel, stride=1, padding=False):
    """
    中值滤波/最大滤波/均值滤波
    :param input_image: 输入图像
    :param filter_size: 滤波器大小
    :return:
    """

    # 填充(默认为1)
    padding_num = 1
    if padding:
        padding_num = int((kernel.shape[0] - 1) / 2)
        input_image = np.pad(input_image, (padding_num, padding_num), mode="constant", constant_values=0)

    out_image = np.copy(input_image)

    # 填充后的图像大小
    w, h = input_image.shape
    print(input_image.shape, padding_num)

    for i in range(padding_num, w - padding_num, stride):
        for j in range(padding_num, h - padding_num, stride):
            region = input_image[i - padding_num:i + padding_num + 1, j - padding_num:j + padding_num + 1]
            print(i, j)
            print(region.shape, kernel.shape)
            # 确保 图像提取的局部区域 与 核大小 一致
            assert (region.shape == kernel.shape)
            # 中值滤波np.median,  最大值滤波 np.maximum  均值滤波: np.mean
            out_image[i, j] = np.median(np.dot(region, kernel))

    # 裁剪原图像大小
    if padding:
        out_image = out_image[padding_num:w - padding_num, padding_num:h - padding_num]
    return out_image



if __name__ == '__main__':
    # 随机浮点数, 模仿灰度图
    src = cv.imread("chair.png")
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  # 图像二值化

    cv.imshow("binary", binary)
    cv.waitKey(0)

    input_image = np.random.rand(16, 16)
    input_image = binary
    # 标准正态分布
    kernel = np.random.rand(3, 3)
    print(input_image.shape, kernel.shape)
    output = median_filter(input_image, kernel)
    print(output.shape)
    cv.imshow("input_image", output)
    cv.waitKey(0)

原图

img

滤波前

img

滤波后

img

您的采纳就是对我最大的动力,谢谢!!!

img

关注一下,共同学习。