PyTorch 中的高斯滤波器

alb*_*s_c 6 python pytorch

我正在寻找一种仅使用 PyTorch 函数将高斯滤波器应用于图像(张量)的方法。使用 numpy,等效代码是

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# Define 2D Gaussian kernel
def gkern(kernlen=256, std=128):
    """Returns a 2D Gaussian kernel array."""
    gkern1d = signal.gaussian(kernlen, std=std).reshape(kernlen, 1)
    gkern2d = np.outer(gkern1d, gkern1d)
    return gkern2d

# Generate random matrix and multiply the kernel by it
A = np.random.rand(256*256).reshape([256,256])

# Test plot
plt.figure()
plt.imshow(A*gkern(256, std=32))
plt.show()
Run Code Online (Sandbox Code Playgroud)

我发现的最接近的建议基于这篇文章

import torch.nn as nn

conv = nn.Conv2d(in_channels = 1, out_channels = 1, kernel_size=264, bias=False)
with torch.no_grad():
    conv.weight = gaussian_weights
Run Code Online (Sandbox Code Playgroud)

但它给了我错误NameError: name 'gaussian_weights' is not defined。我怎样才能让它发挥作用?

mil*_*bar 9

是的,我也有同样的想法。所以现在的问题是:有没有一种方法可以在不使用 Numpy 和/或显式指定权重的情况下定义高斯核(或 2D 高斯)?

是的,这很容易。只需查看signal.gaussian的函数文档即可。有一个源代码链接。该方法的作用如下:

def gaussian(M, std, sym=True):
    if M < 1:
        return np.array([])
    if M == 1:
        return np.ones(1, 'd')
    odd = M % 2
    if not sym and not odd:
        M = M + 1
    n = np.arange(0, M) - (M - 1.0) / 2.0
    sig2 = 2 * std * std
    w = np.exp(-n ** 2 / sig2)
    if not sym and not odd:
        w = w[:-1]
    return w
Run Code Online (Sandbox Code Playgroud)

你很幸运,因为在 Pytorch 中转换很简单,(几乎)只需替换np即可torch完成!

另请注意,np.outertorch 中的等效项是ger


MD *_*min 5

有一个 Pytorch 类可以将高斯模糊应用于图像:

torchvision.transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0))
Run Code Online (Sandbox Code Playgroud)

查看文档以获取更多信息