【发布时间】:2021-09-04 22:22:25
【问题描述】:
我正在寻找一种仅使用 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()
我找到的最接近的建议是基于this post:
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
但它给了我错误NameError: name 'gaussian_weights' is not defined。我怎样才能让它发挥作用?
【问题讨论】:
-
我认为
gaussian_weights应该是由高斯构成的内核,例如scipy.signal.gaussian -
是的,我也有同样的想法。所以现在问题变成了:有没有办法在不使用 Numpy 和/或明确指定权重的情况下定义高斯核(或 2D 高斯)?
-
也许这个discuss.pytorch.org/t/…可以帮助你
-
这里的pytorch实现:forums.fast.ai/t/…