如何使用numpy在2d阵列上执行高斯池

2024-04-23 19:51:27 发布

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

给定一个二维(mxn)矩阵和一个二维高斯掩模(kxk),如何返回一个矩阵,该矩阵是使用给定的内核在图像上进行高斯合并的结果

如果可能的话,我想使用numpy(不使用“for”,只使用numpy) 2x2高斯池的示例:(可能是错误答案)

matrix:
array([[  20,  200,   -5,   23,  10, -50],
       [ -13,  134,  119,  100,  45, -79],
       [ 120,   32,   49,   25,  13,   0],
       [  40,   12,   59,   23,  32,  -1],
       [  75,  121,   69,   67,  64,  -7],
       [  39,   12,   79,   -8,  16,  -9]])
kernel:
array([[ 1/16, 1/8, 1/16],
       [  1/8, 1/4,  1/8],
       [ 1/16, 1/8, 1/16]])
soln:
array([[   87.25,   16.625],
       [ 64.8125,  29.8125]])

Tags: 答案图像numpy示例for错误矩阵array
1条回答
网友
1楼 · 发布于 2024-04-23 19:51:27

首先将M x N矩阵转换为(M//K)x K x(N//K)x K数组, 然后在第二维和第四维与核逐点相乘, 然后在第二维度和第四维度求和

np.sum(
    matrix.reshape((
        matrix.shape[-2] // kernel.shape[-2], kernel.shape[-2],
        matrix.shape[-1] // kernel.shape[-1], kernel.shape[-1],
    ))
    * kernel[np.newaxis, :, np.newaxis, :],
    axis=(-3, -1),
)

您还可以用^{}调用替换逐点相乘然后求和

np.tensordot(
    matrix.reshape((
        matrix.shape[-2] // kernel.shape[-2], kernel.shape[-2],
        matrix.shape[-1] // kernel.shape[-1], kernel.shape[-1],
    )),
    kernel,
    axes=(
        (-3, -1),
        (-2, -1),
    )
)

相关问题 更多 >