在Numpy数组中匹配模板的最有效方法是什么?

时间:2018-02-06 10:17:03

标签: python arrays numpy image-processing sliding-window

我有一个大小为2000 * 4000的numpy数组,其中包含二进制值。我有一个模板,我想与我的源数组匹配。目前我正在源数组上运行一个滑动窗口。虽然这种方法很好,但是非常耗时。我猜测本机实现会更快。它也可以匹配多次出现的模板吗?

这样的东西
x = [[0 0 1 1 1 1 1 0 0]
     [0 0 1 1 0 0 0 0 0]
     [0 0 1 1 0 0 0 0 0]
     [0 0 1 1 0 0 0 0 0]]

template = [[1 1 1 1]
            [1 0 0 0]
            [1 0 0 0]]

cords = np.matchtemplate(x, template)

打印线应该理想地给出一个元组列表,它们具有匹配段的对角线坐标。

print(cords)

[[(0, 3), (6, 2)]]

2 个答案:

答案 0 :(得分:1)

正如@MPA建议的那样,这将提供一份候选人名单:

extractvalue

这为您的示例提供了from scipy import signal match = np.sum(template) tst = signal.convolve2d(x, template[::-1, ::-1], mode='valid') == match candidates = np.argwhere(tst) (0, 2)

对于二进制矩阵,可以像@Paul建议那样做:

(0, 3)

这为您的示例提供了from scipy import signal match = np.sum(template) tst = signal.convolve2d(x, (2 * template - 1)[::-1, ::-1], mode='valid') == match positions = np.argwhere(tst)

答案 1 :(得分:1)

使用OpenCV的解决方案:

import cv2

result = cv2.matchTemplate(
    x.astype(np.float32),
    template.astype(np.float32),
    cv2.TM_SQDIFF)

positions = np.argwhere(result == 0.0)

这为您的示例提供了(0, 3)