Как найти одно изображение в другом?

У меня есть 2 изображения BMP. ImageA является снимком экрана (пример), ImageB является подмножеством этого. Скажите, например, значок.

Я хочу найти эти X, Y координаты ImageB в ImageA (если он существует).

Какая-либо идея, как я сделал бы это?

30
задан esac 18 March 2010 в 18:42
поделиться

3 ответа

  1. Так есть ли искажение изображенияB в изображенииA?
  2. Насколько "точными" являются изображения, в смысле, пиксель в пиксель они будут одинаковыми?
  3. Сколько вычислительной мощности у вас есть для этого?

Если ответы на первые два вопроса - Нет и Да, то у вас простая задача. Это также поможет узнать ответ на Q3.

Обновление:

Основная идея такова: вместо того, чтобы сопоставлять окно вокруг каждого пикселя на изображенииВ с каждым пикселем на изображенииА и проверять корреляцию, давайте определим точки интереса (или особенности) на обоих изображениях, которые будут отслеживаемыми. Итак, похоже, что углы действительно отслеживаются, поскольку область вокруг них вроде как похожа (не вдаваясь в подробности) - следовательно, давайте найдем несколько действительно сильных углов на обоих изображениях и будем искать углы, которые выглядят наиболее похожими.

Это сводит проблему поиска каждого пикселя в B с A к поиску, скажем, 500 углов в B с 1000 углов в A (или что-то в этом роде) - гораздо быстрее.

И самое замечательное, что в вашем распоряжении несколько таких детекторов углов в OpenCV. Если вы не хотите использовать emguCV (C# varriant), то используйте детектор FAST для поиска совпадающих углов и, таким образом, обнаружения нескольких особенностей между изображениями. Получив это, вы можете найти местоположение левого верхнего угла изображения.

15
ответ дан 28 November 2019 в 00:18
поделиться

Если изображение B является точным подмножеством изображения A (то есть значения пикселей точно такие же), это не проблема с обработкой изображений, это просто сопоставление строк в 2D. В 99% случаев, если взять линию из середины B и сопоставить ее с каждой строкой A, вы сделаете то, что вы хотите, и очень быстро & mdhas; Думаю, в C # есть для этого функция. После того, как вы получите свои совпадения (обычно несколько из них), просто сравните все B с соответствующей частью A.

Единственная проблема, которую я вижу здесь, заключается в том, что в некоторых случаях вы можете получить слишком много совпадений. Например. если A - ваш рабочий стол, B - это значок, и вам не повезло выбрать строку в B, состоящую только из фона. Эту проблему легко решить (нужно более тщательно выбирать строки из B), но это зависит от специфики вашей проблемы.

1
ответ дан 28 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: