我使用OpenCV 的matchTemplate
函数实现此功能。这里有一个优秀的Python绑定到OpenCV,它在内部使用numpy,因此图像只是numpy数组。例如,假设您有一个100x100像素的BGR文件testimage.bmp。我们在位置(30,30)取一个10x10的子图像并在原始图像中找到它。
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)
您可以选择多种算法来匹配模板和原始图像,cv2.TM_CCOEFF_NORMED
只是其中之一。请参阅文档以获取更多详细信息,一些算法将匹配项表示为结果数组中的最小值,而其他算法则表示为最大值。警告:OpenCV默认使用BGR通道顺序,请注意,例如当您比较使用cv2.imread
加载的图像和从PIL转换为NumPy的图像时。您始终可以使用cv2.cvtColor
在不同格式之间进行转换。
要查找所有置信度(confidence
)大于给定阈值的匹配项,我使用类似以下内容从结果数组中提取匹配坐标:
match_indices = np.arange(result.size)[(result>confidence).flatten()]
np.unravel_index(match_indices,result.shape)
这将给出一个长度为2的数组元组,每个数组都是匹配坐标。