Как избежать ложных срабатываний при сопоставлении шаблонов с OpenCV? - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу использовать OpenCV и Python, чтобы создать программу, которая проверяет, находится ли меньшее изображение внутри большего изображения.

Я знаю, что находится внутри большего изображения, но меньшее изображение может меняться каждый раз,поэтому для меня важно избежать ложных срабатываний.

Я использовал cv2.matchTemplate с режимом cv2.TM_CCOEFF_NORMED для проверки достоверности, и это прекрасно работает, если маленькое изображение является просто обрезанной версией полногоimage.

Однако возникают проблемы, если, например, изображение меньшего размера - 1x1 белый пиксель.На моем большом изображении много пробелов, и я не хочу, чтобы это совпадало.

Вот мой код:

#!/usr/bin/env python

import cv2


def main():
    source = cv2.imread('source.png', 0)
    template = cv2.imread('template.png', 0)

    res = cv2.matchTemplate(source, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    if max_val < 0.9:
        print 'Confidence score is less than 0.9, no match found.'
        return

    print 'Match found!'

if __name__ == '__main__':
    main()

Как я могу улучшить это?Я полагаю, что был бы способ проверить, соответствует ли соответствие хотя бы определенному размеру (например, 50x50), чтобы система не ломалась, если в качестве шаблона используется крошечное изображение, но я не уверен.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

После положительного совпадения с использованием сопоставления с шаблоном, получите патч из большого изображения и используйте больше методов сравнения изображений, чтобы проверить соответствие.Вы должны сравнить два изображения одного размера.Например, сопоставление гистограммы, как предложено выше, сопоставление шаблонов с другими нормами, сравнение статистики (среднее значение, дисперсия, старшие моменты) и т. Д.

Другой вариант - проверить оценку «второго лучшего совпадения».Счет должен быть меньше, чем «лучший матч».Это гарантирует, что в вашем увеличенном изображении нет другого подобного патча.Это должно устранить ваше ложное совпадение «1x1 белый пиксель».

Если ваш шаблон повернут, вам могут потребоваться более сложные методы для поиска и извлечения исходного местоположения патча.

Пожалуйста, имейте в виду, чтоневозможно избежать ложных срабатываний во всех случаях.Всегда должен быть встречный пример.Особенно, если ваш шаблон маленький.

Для разумных размеров шаблонов обратите внимание на рекомендуемые размеры патчей для методов сопоставления на основе объектов (SIFT, SURF, ..) или сопоставления оптических потоков.Первое предположение - ваш шаблон должен быть больше, чем 21x21 пикселей

0 голосов
/ 20 сентября 2018

, если изображение становится меньше, чем 1x1, возможности изображения уменьшаются.Очень трудно правильно подобрать.

Вы можете попробовать другие алгоритмы сопоставления после правильного размера сопоставления шаблона.

  1. SURF (или SIFT) Совпадение: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html

-SURF isалгоритм для создания дескриптора изображения.Он находит несколько функций из изображения и делает вектор каждой функции.и вы можете сравнить сходство между объектами из другого изображения, используя некоторое вычисление расстояния, например, L2-Distance.

.

Соответствие цветовой гистограммы: https://en.wikipedia.org/wiki/Histogram_matching

-Цветовая гистограмма - это собственное распределение цвета изображения.Вы можете попытаться сравнить сходство нескольких изображений, используя его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...