我需要使用 NumPy 生成一个尺寸为 m × n 的图像掩模,该掩模对应于中心在 µ = (i, j) 和 σ^2 = 25 的二维高斯。
在网上搜索后,我发现这个文档看起来很有希望。但是,有几个问题:
- 生成的矩阵不是掩码(二进制)
- 协方差 (σ^2) 作为矩阵而不是整数给出
也许使用一些数学属性,这可以转换为我想要的,但我看不到它,因为我不是很擅长数学。
我需要使用 NumPy 生成一个尺寸为 m × n 的图像掩模,该掩模对应于中心在 µ = (i, j) 和 σ^2 = 25 的二维高斯。
在网上搜索后,我发现这个文档看起来很有希望。但是,有几个问题:
也许使用一些数学属性,这可以转换为我想要的,但我看不到它,因为我不是很擅长数学。
numpy.random.multivariate_normal
将为您提供从均值为 0 和方差为 1 的多元高斯分布中抽取的样本。您想要计算此分布的概率密度函数(PDF),而不是从中抽取样本。
最简单的方法是使用scipy.stats.multivariate_normal.pdf
函数,如下:
m, n = 100, 100
lims = (-3, 3) # support of the PDF
xx, yy = np.meshgrid(np.linspace(*lims, m), np.linspace(*lims, n))
points = np.stack((xx, yy), axis=-1)
mean = (1, 2) # Whatever your (i, j) is
covariance = 25.0
pdf = scipy.stats.multivariate_normal.pdf(points, mean, covariance)
pdf
现在给出 x 轴和 y 轴上 -3 和 3 之间平面中每个点的高斯函数的高度。
您可以将此窗口应用于您想要的任何图像,只需执行image * pdf
.
编辑:
感谢 CrazyIvan 指出该pdf
函数直接采用点网格。另请注意,np.linspace(*lims, m)
使用 Python3 特定的元组解包。如果您有旧版本,请执行np.linspace(lims[0], lims[1], m)
.