用numpy/scipy计算矩阵中每个单元格的邻域乘积

Joy*_*yee 5 python numpy

我正在尝试实现一种图像处理算法,该算法涉及为每个单元计算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和传递权重用零和一个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所以我不必诉诸于循环?

Jai*_*ime 3

您需要单独写出边缘,但这会完成您对数组中心部分的操作,并且可能明显比相关更快:

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:]
Run Code Online (Sandbox Code Playgroud)