Я делаю это с помощью функции OpenCV matchTemplate
. Существует отличная привязка Python к OpenCV, которая использует numpy внутри, поэтому изображения - это просто numy массивы. Например, предположим, у вас есть BGR-файл размером 100x100 пикселей testimage.bmp . Мы берем 10x10 субизображение в позиции (30,30) и находим его в оригинале.
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, каждый из которых является совпадающей координатой.