我正在寻找一种仅使用 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
。我怎样才能让它发挥作用?
是的,我也有同样的想法。所以现在的问题是:有没有一种方法可以在不使用 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.outer
torch 中的等效项是ger。
有一个 Pytorch 类可以将高斯模糊应用于图像:
torchvision.transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0))
Run Code Online (Sandbox Code Playgroud)
查看文档以获取更多信息
归档时间: |
|
查看次数: |
24022 次 |
最近记录: |