NumPy中的二维卷积矢量化

2024-10-06 14:33:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道有各种优化的现成函数可用于执行2D卷积,但为了理解,我正在尝试实现我自己的2D卷积函数

以下是我目前所做的工作:

    convoluted = []
    # TODO: Vectorize
    for i in range(0, M - m + 1):
        for j in range(0, N - n + 1):
            submatrix = x[i:i+m, j:j+n]
            convoluted.append(np.sum([submatrix*kernel]))
    convoluted = np.array(convoluted).reshape(M - m + 1, N - n + 1)

注意x是输入图像数组,(M, N)是输入图像的形状,(m, n)是所用内核的形状

两个显式for循环非常慢。非常慢。
有没有办法将其矢量化?感谢您的帮助
(我知道可以使用python列表理解,至少对于内部循环是这样,但我正在寻找一种更快的方法,如果有的话)


Tags: 函数in图像fornprangekernel卷积
1条回答
网友
1楼 · 发布于 2024-10-06 14:33:24

我想你正在寻找这个:

from skimage.util.shape import view_as_windows
sub_matrices = view_as_windows(x, (m,n), 1)
convoluted = np.einsum('ij,klij->kl',kernel,sub_matrices)

第一行从原始数组创建内核大小的窗口。第二行是简单的乘法和加法(与for循环中的行类似,删除for循环更加优雅)。此代码和您的代码的输出应该是相同的。如果您被设置为不使用其中任何一个,请告诉我们您编辑文章的限制

另一种类似的方法是here,它不使用skimage包(只使用numpy,但代码稍长)

相关问题 更多 >