【滤波变换】中值滤波(Median Blur)

原理

  1. 概念:通过将每个像素周围的领域像素排序并取中值来替代当前像素的值。
    • 非线性滤波
  2. 优缺点:
    • 优点:去除图像中的椒盐噪声,速度快,较小程度的造成边缘模糊。
    • 缺陷:导致图像的模糊和细节丢失。
  3. 图解
    虚线部分为padding
    在这里插入图片描述

实战

import kornia as K
from imgaug import augmenters as iaa


def imgaug_example(image, kernel_size=3):
    """
    args:
        image: np.ndarray
        kernel_size: 核数, 取值范围(1, 7)
    """
    augmenter = iaa.MedianBlur(k=kernel_size)
    image = augmenter(image=image)
    return image


def torch_example(image, kernel_size=3):
    """
    args:
        image: torch.Tensor
        kernel_size: 核数, 取值范围(1, 7)
    """

    image = image.unsqueeze(0)
    image = K.filters.median_blur(image, kernel_size).squeeze(0)

    return image
    
    
def hand_coding(image, kernel_size=9):
    """
    args:
        image: torch.Tensor
        kernel_size: 核数, 取值范围(1, 7)
    """

    # get_kernel
    device, dtype = image.device, image.dtype
    window_range = kernel_size * kernel_size
    kernel = torch.zeros((window_range, window_range), device=device, dtype=dtype)
    idx = torch.arange(window_range, device=device)
    kernel[idx, idx] += 1.0
    kernel = kernel.view(window_range, 1, kernel_size, kernel_size)

    padding = (kernel_size - 1) // 2
    c, h, w = image.shape

    # features shape = [c, 9, h, w]
    features = F.conv2d(image.reshape(c, 1, h, w), kernel, padding=padding, stride=1)
    # features = features.view(c, -1, h, w)  # features shape = [c, 9, h, w]

    # return shape = [c, h, w]
    return features.median(dim=1)[0]

在这里插入图片描述

手撸代码计算过程

  • 输入图像的shape=5*5*3
  • kernel_size=3
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值