что такое сопоставление с шаблоном
Сопоставление шаблонов относится к поиску наиболее похожей части изображения B в текущем изображении A. Можно понять, что нужно найти разницу, но здесь нужно найти ту же информацию.
Как правило, мы называем изображение A входным изображением, а изображение B — изображением шаблона. Принцип сопоставления шаблонов заключается в том, чтобы сдвинуть изображение шаблона B по изображению A, чтобы найти совпадающую часть.
функция сопоставления шаблонов
В OpenCV он предоставляет нам функцию cv2.matchTemplate() для завершения сопоставления шаблонов. Полное определение его функции выглядит следующим образом:
def matchTemplate(image, templ, method, result=None, mask=None):
изображение: исходное изображение
шаблон: изображение шаблона
метод: метод сопоставления. Этот параметр реализован через TemplateMatchModes, как показано в следующей таблице:
параметр | ценность | значение |
---|---|---|
cv2.TM_SQDIFF | 0 | Сопоставление основано на дисперсии. Если есть точное совпадение, результат равен 0, если нет совпадения, вы получите большую разницу |
cv2.TM_SQDIFF_NORMED | 1 | Стандартное (нормализованное) сопоставление квадратов разностей |
cv2.TM_CCORR | 2 | Сопоставление корреляции, этот тип метода умножает изображение шаблона и входное изображение.Если произведение больше, степень соответствия выше, если произведение равно 0, эффект сопоставления наихудший. |
cv2.TM_CCORR_NORMED | 3 | Стандартное (нормализованное) сопоставление корреляций |
cv2.TM_CCOEFF | 4 | Сопоставление системы корреляции, этот тип метода сопоставляет относительное значение шаблонного изображения и его среднего значения с корреляцией входного изображения и его среднего значения. 1 означает идеальное совпадение, -1 означает плохое соответствие, 0 означает отсутствие релевантного совпадения (случайная последовательность) |
cv2.TM_CCOEFF_NORMED | 5 | Стандартное (нормализованное) соответствие коэффициентов корреляции |
результат: возвращаемое значение. Это результирующий набор, образованный комбинацией результатов сравнения каждой позиции, и тип представляет собой одноканальный 32-битный тип с плавающей запятой. Если размер входного изображения WH, размер шаблона wh размер возвращаемого значения равен (W-w+1)*(H-h+1).
маска: маска трафаретного изображения. Оно должно быть того же размера, что и изображение шаблона. Обычно достаточно значения по умолчанию.
Реализовать сопоставление шаблонов
Прежде всего, нам нужны две картинки, здесь мы по-прежнему выбираем часто используемые фотографии красоты и перехватываем их глазами как шаблонные изображения, следующим образом:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("4.jpg", 0)
template = cv2.imread("4_1.jpg", 0)
th, tw = template.shape[::]
rv = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
min, max, minLoc, maxLoc = cv2.minMaxLoc(rv)
topLeft = minLoc
bottomRight = (topLeft[0] + tw, topLeft[1] + th)
cv2.rectangle(img, topLeft, bottomRight, 255, 2)
plt.subplot(121)
plt.imshow(template, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.show()
После запуска эффект следующий:
приложение:
Диаграмма шаблона
исходное изображение