如何在Numpy图像中查找子图像?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

我有两个Numpy阵列(三维uint 8)转换自PIL图像。

我想知道第一个图像是否包含第二个图像,如果是的话,找出匹配的第一个图像中左上角像素的坐标。

是否有一种方法,纯粹在Numpy,以足够快的方式,而不是使用(4!非常慢)纯Python循环?

2D示例:

a = numpy.array([
    [0, 1,  2,  3],
    [4, 5,  6,  7],
    [8, 9, 10, 11]
])
b = numpy.array([
    [2, 3],
    [6, 7]
])

怎么做这样的事?

position = a.find(b)

position就会是(0, 2)...

提问于
用户回答回答于
用户回答回答于

import cv2
import numpy as np

image = cv2.imread("testimage.bmp")
template = image[30:40,30:40,:]

result = cv2.matchTemplate(image,template,cv2.TM_CCOEFF_NORMED)
print np.unravel_index(result.argmax(),result.shape)

输出:

(30, 30)

警告:OpenCV默认使用BGR通道顺序,因此要小心,例如,当您比较加载的图像时cv2.imread从PIL转换为Numpy的图像。你总是可以用cv2.cvtColor在格式之间进行转换。

我使用类似的方法从结果数组中提取匹配的坐标:

match_indices = np.arange(result.size)[(result>confidence).flatten()]
np.unravel_index(match_indices,result.shape)

这提供了长度为2的数组的元组,每个数组都是一个匹配的坐标。

扫码关注云+社区