Альфа-зависимое сопоставление шаблонов

Я использую OpenCV с поддержкой CUDA/CUBLAS/CUFFT для выполнения очень простого сопоставления шаблонов на скриншотах в градациях серого для извлечения некоторого текста, то есть я могу предположить следующее:

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

Однако, поскольку спрайты частично прозрачны, обычное сопоставление с шаблоном через cv::(gpu::)matchTemplate (используя нормированную взаимную корреляцию) не работает должным образом, поскольку отклонения в прозрачных областях слишком сильно влияют на общую корреляцию.

В основном эти примеры довольно хорошо обобщают то, чего я пытаюсь достичь:

Учитывая шаблон, который нужно сопоставить, и его альфа-маску:

Шаблон спрайта для сопоставления.Шаблон альфа-маски.

Я бы хотел, чтобы на таких изображениях было совпадение от высокого до почти 100% (произвольный фон, случайные вещи в прозрачных областях, частично закрытые):

Спрайт на белом фоне.Спрайт на черном фонеПроизвольный фон + частично закрытая прозрачная область.Частично перекрыто.

Однако такие изображения должны иметь очень низкий процент (неправильный цвет, полностью черный): введите здесь описание изображения введите здесь описание изображения

В настоящее время я использую обнаружение края, чтобы получить приличные совпадения (Канни + кросс-корреляция), но, как вы можете видеть, в зависимости от фона на изображении могут присутствовать или отсутствовать края, что дает ненадежные результаты и обычно соответствует очень «резким» областям.

Я провел некоторые математические расчеты, чтобы получить альфа-зависимую нормированную взаимную корреляцию (по сути, предварительное умножение альфа-маски как на шаблон, так и на изображение), которая отлично работает на бумаге, но практически невозможно реализовать с хорошей производительностью. И да, производительность действительно является проблемой, поскольку несколько спрайтов (~ 10) должны сопоставляться почти в реальном времени (~ 10 кадров в секунду), чтобы не отставать от скорости программы.

У меня тут заканчиваются идеи. Есть ли какие-то стандартные подходы к этому? Любые идеи или предложения?


person Opossum    schedule 27.08.2012    source источник


Ответы (1)


Итак, мне наконец удалось решить это самостоятельно, используя математику и CUFFT. Я назвал это «Альфа-взвешенная нормированная взаимная корреляция». Вот:

Альфа-взвешенная нормированная взаимная корреляция

С помощью этого метода я получаю очень хорошие совпадения (> 0,99) для случаев, подобных тем, что указаны в OP. Кроме того, это помогает установить порог альфа-маски, чтобы просто игнорировать большинство прозрачных пикселей.

person Opossum    schedule 02.09.2012
comment
Эй, это звучит очень интересно. У вас есть реализованный фрагмент кода для этого? Кроме того, насколько он отличается от 4-го алгоритма openCV (method=CV_TM_CCORR_NORMED) в этом (docs.opencv.org/doc/tutorials/imgproc/histograms/) ссылка? Не могли бы вы объяснить? - person Sai Nikhil; 10.11.2013
comment
Я не работал над этим больше года, так что извините, если я немного заржавел в этом. Однако мне удалось откопать код для этого: ссылка. Я думаю, что это должно быть его неотъемлемой частью. Основное отличие состоит в том, что моя версия предварительно умножает изображение шаблона и соответствующую часть целевого изображения на альфа-значение шаблона. Благодаря этому более прозрачные пиксели вносят меньший вклад в процесс сопоставления. Вы можете увидеть разницу, если сравните C_{T,I} (то есть CV_TM_CCORR_NORMED) с C_{alpha,T,I}. - person Opossum; 10.11.2013
comment
Огромное спасибо за помощь. Я никогда не использовал CUFFT, но до сих пор использовал openCV. Подскажите, пожалуйста, какие дополнительные header_files и исходники нужны для успешной компиляции приведенного выше кода. Кроме того, в чем хитрость повторного предварительного умножения целевого изображения с той же альфой. Как это поможет нам на самом деле, поскольку мы действительно теряем там некоторую информацию? Я хочу изучить некоторую концепцию (БПФ в обработке изображений) относительно этой реализации. Пожалуйста, дайте мне несколько хороших указателей. Заранее спасибо. - person Sai Nikhil; 10.11.2013
comment
Исключение информации — вот что действительно важно. Однако вы не выполняете предварительное умножение всего целевого изображения. Вы предварительно умножаете текущее субизображение, поверх которого перемещаете изображение шаблона. Вы должны были бы сделать это в цикле в пространственной области. В частотной области вы можете использовать простое покомпонентное произведение (комплексно-сопряженного) эталонного изображения и подизображения цели (теорема свертки). Проверьте Википедию для взаимной корреляции и теоремы свертки. Это все, что вам нужно. Единственный необходимый заголовок, отличный от OpenCV, — это cufft.h. Вы можете инициализировать CUDA, просто создав GpuMat. - person Opossum; 10.11.2013
comment
Вы выглядите экспертом в этом вопросе. Я просто начинающий человек. Пожалуйста, предложите мне какой-нибудь хороший ресурс для изучения таких вещей обработки изображений, как БПФ на изображениях и т. Д. Если у вас есть электронная копия, пожалуйста, отправьте ее по почте в tsnlegend по адресу gmail dot com. Заранее спасибо. - person Sai Nikhil; 11.11.2013
comment
Я далеко не специалист в этом. Мне было трудно понять этот пост и написать код, когда я вернулся к нему вчера. В любом случае, вы должны действительно попытаться понять концепцию свертки/взаимной корреляции. Также посетите этот сайт, чтобы ознакомиться с введением в БПФ/ДПФ. Я обнаружил, что лучший способ понять формулы (например, кросс-корреляцию OpenCV) — это вручную оценить несколько примеров для очень маленьких изображений, таких как изображение шаблона текселя 2x2 в целевом изображении 4x4 (без использования FFT). - person Opossum; 11.11.2013
comment
Печальный недостаток вашего кода в том, что для него требуется графический процессор nVidia. На обычном ПК работать не будет. - person Elmue; 29.09.2014