原理
- 概念:通过将每个像素周围的领域像素排序并取中值来替代当前像素的值。
- 优缺点:
- 优点:去除图像中的椒盐噪声,速度快,较小程度的造成边缘模糊。
- 缺陷:导致图像的模糊和细节丢失。
- 图解
虚线部分为padding
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/865fa27da3c025c094c877412c1e2b1b.png#pic_center)
实战
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)
"""
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 = F.conv2d(image.reshape(c, 1, h, w), kernel, padding=padding, stride=1)
return features.median(dim=1)[0]
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/83a10a236cc7c84b63a5f8e7df33ccd8.png#pic_center)
手撸代码计算过程
- 输入图像的shape=5*5*3
- kernel_size=3
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a69f6d6f2697a4c725ce974e38478664.png#pic_center)