我正在尝试实现一种图像处理算法,该算法涉及为每个单元计算4邻域的乘积。也就是说,为y[i, j] = x[i-1, j] * x[i, j-1] * x[i+1, j] * x[i, j+1]
计算X的新矩阵Y.应该忽略越界邻居。
现在我只能想到这种方法:使用scipy.ndimage.filters.correlate
并使用0和1传递权重以获得四个矩阵,每个矩阵包含一个方向上每个单元格的邻居,如传入{{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]
来计算这四个矩阵的乘积。
然而,这种方法有点太慢,我不能忽视边界。还有另一种方法可以用numpy / scipy做到这一点所以我不必诉诸于循环吗?
答案 0 :(得分: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:]
答案 1 :(得分:3)
我认为这更符合您的要求:
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]])
请注意,如果您需要额外的速度,第一个*=
可以是作业。