我有一个大小为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)]]
答案 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)
。