在 NumPy 中创建 2D 汉宁、汉明、布莱克曼、高斯窗

问题描述 投票:0回答:2

我对在 NumPy 中创建 2D hanning、hamming、Blackman 等窗口感兴趣。我知道 NumPy 中存在用于 1D 版本的现成函数,例如

np.blackman(51)
np.hamming(51)
np.kaiser(51)
np.hanning(51)
等。

如何创建它们的 2D 版本?我不确定以下解决方案是否正确。

window1d = np.blackman(51)
window2d = np.sqrt(np.outer(window1d,window1d)) 

---编辑

令人担忧的是

np.sqrt
只期望正值,而
np.outer(window1d,window1d)
肯定会有一些负值。一种解决方案是放弃
np.sqrt

有什么建议如何将这些 1d 函数扩展到 2d 吗?

numpy signal-processing fft dft
2个回答
4
投票

这对我来说看起来很合理。如果您想验证您正在做的事情是否明智,您可以尝试绘制出您正在创建的内容。

import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(0, 1.5, 51)
y = np.linspace(0, 1.5, 51)

window1d = np.abs(np.blackman(51))
window2d = np.sqrt(np.outer(window1d,window1d))

X, Y = np.meshgrid(x, y)
Z = window2d

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='viridis')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

plt.show()

这给出了-

这看起来像一维图的二维推广,看起来像 -

但是,最初创建 1d 版本时我必须这样做

window1d = np.abs(np.blackman(51))
,否则,最终的 2D 数组中会出现小的负值,而你无法采用
sqrt

免责声明:我不熟悉这些功能或其通常的用例。但这些图的形状似乎是有道理的。如果这些函数的用例是实际值很重要的地方,那么这可能是错误的。


0
投票

您可以使用 scikit-image 的

skimage.filters.window
函数创建 2D 窗口,该函数支持
scipy.signal.get_window
中的任何 1D 窗口。

例如,您可以创建一个 51x51

blackmanharris
窗口,如下所示:

import skimage
win = skimage.filters.window('blackmanharris', (51, 51))

import matplotlib.pyplot as plt
plt.imshow(win); plt.colorbar();
win.min(), win.max()  # 0.0 to 1.0

Blackman Harris 51x51 window

© www.soinside.com 2019 - 2024. All rights reserved.