使用numpy加快速度的第一步是将操作序列分解为可以应用于整个数组的内容。让我们从一个简单的开始:消除计算中的理解
W
:
W = np.hypot(np.arange(-2, 3), np.arange(-2, 3)[:, None])
np.reciprocal(W, where=W.astype(bool), out=W)
W /= W.sum()
下一件事(如上所述
where=W.astype(bool)
)是在适当的情况下使用掩码将条件应用于整个数组。您的算法如下:
对于不匹配的每个位置
im
和
im_gt
,计算以下元素的总和
W
以它们不匹配的位置为中心。
你可以用卷积来计算这个
W
.地点
im == im_gt
只是被丢弃了。地点
im_gt == 1
需要通过减去来翻转
W.sum()
,因为你需要对零求和,而不是对这些元素求和。卷积在
scipy.signal.convolve2d
。通过使用,您可以获得相同的边缘效果
mode='same'
并仔细调整边缘像素。你可以通过与一个1数组卷积来获得边和:
from scipy.signal import convolve2d
# Compute this once outside the function
W = np.hypot(np.arange(-2, 3), np.arange(-2, 3)[:, None])
np.reciprocal(W, where=W.astype(bool), out=W)
W /= W.sum()
def drd(im, im_gt):
m0 = im != im_gt
m1 = im_gt == 0
m2 = im_gt == 1
s1 = convolve2d(m1, W, mode='same')[m0 & m1].sum()
s2 = convolve2d(m2, W, mode='same')[m0 & m2].sum()
return s1 + s2