【问题标题】:Compute the product of neighborhood for each cell in a matrix with numpy/scipy用 numpy/scipy 计算矩阵中每个单元的邻域乘积
【发布时间】:2014-11-15 12:25:15
【问题描述】:

我正在尝试实现一种图像处理算法,该算法涉及计算每个单元格的 4 个相邻邻域的乘积。也就是说,要为 X 计算一个新的矩阵 Y,其中 y[i, j] = x[i-1, j] * x[i, j-1] * x[i+1, j] * x[i, j+1]。越界的邻居应该被忽略。

现在我只能想到这种方法:使用 scipy.ndimage.filters.correlate 并传入带有 0 和一个 1 的权重来获得四个矩阵,每个矩阵都包含一个方向上每个单元格的邻居,就像传入 weight = [[0, 0, 0], [1, 0, 0], [1, 1]] 一样,我得到了a[i, j] = x[i-1, j],以及其他权重我可以得到b[i, j] = x[i, j-1]c[i, j] = x[i+1, j]d[i, j] = x[i, j+1]。然后我使用np.multiply 来计算这四个矩阵的乘积。

但是,这种方法有点太慢了,我不能忽略边界。有没有另一种方法可以用 numpy/scipy 做到这一点,所以我不必诉诸 for 循环?

【问题讨论】:

标签: python numpy


【解决方案1】:

我认为这更符合您的要求:

import numpy as np

x = np.array([
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 1],
    [2, 3, 4, 5, 6],
    [7, 8, 9, 1, 2]
])

y = np.ones_like(x)
y[+1:, :] *= x[:-1, :]
y[:-1, :] *= x[+1:, :]
y[:, +1:] *= x[:, :-1]
y[:, :-1] *= x[:, +1:]

y
#>>> array([[  12,   21,   64,  135,    4],
#>>>        [  14,  288,  756,  160,  270],
#>>>        [ 126,  448, 1080,  216,   10],
#>>>        [  16,  189,   32,   90,    6]])

请注意,如果您需要额外的速度,第一个 *= 可以是一个作业。

【讨论】:

    【解决方案2】:

    您将需要分别写出边缘,但这可以满足您对数组中心部分的要求,并且可能比关联快得多:

    y = np.empty_like(x)
    y[1:-1, 1:-1] = x[1:-1, 1:-1]
    y[1:-1, 1:-1] *= x[:-2, 1:-1]
    y[1:-1, 1:-1] *= x[2:, 1:-1]
    y[1:-1, 1:-1] *= x[1:-1, :-2]
    y[1:-1, 1:-1] *= x[1:-1, 2:]
    

    【讨论】:

    • 不应该是y = numpy.ones_like 并删除第二行吗?
    猜你喜欢
    • 2018-10-06
    • 2017-07-20
    • 1970-01-01
    • 2015-12-21
    • 2019-11-23
    • 2014-04-21
    • 2021-02-08
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多