«Тонкости» поиска изображений

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

1)  Поиск изображения ведется снизу вверх и слева направо. (т.е. поиск начинается из левого нижнего угла). Это особенно стоит учитывать если вы ищете один из нескольких объектов, в таком случае для алгоритма нумерация таких объектов также будет вестись снизу вверх и слева направо.

2)  Поиск осуществляется на монохромном изображении (подобно тому которое мы получаем, когда активируем режим Borders или ColMap). Поэтому сделав скриншот и переведя его в монохромный вид вы можете увидеть изображение так, как его видит программа когда ищет шаблон.

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

Temp

на рисунке а) изображен наш шаблон, на рисунке b) изображено искомое изображение. У искомого изображения отсутствует левый нижний пиксель. И наконец, на рисунке c)  мы видим к чему приведет попытка поиска такого шаблона на таком изображении. Значительная часть шаблона не совместилась с объектом на изображении, и процент совпадений очень низок, в результате изображение не будет найдено.  В реальной ситуации объектов с шириной в 1 пиксель как правило не встречается, и поэтому в подобном случае, как правило, мы имеем лишь небольшое падение процента совпавших точек (10-20%). Таким образом мы можем решить эту проблему просто понизив коэффициент совпадения шаблона и объекта, при котором шаблон будет считаться найденным. При коэффициенте 0,7-0,8 (а можно и ниже)  объект все еще надежно находится (если структура объекта уникальна на изображении). Но все же необходимо выбирать такие режимы поиска, чтобы критические для поиска области изображения всегда были видны после применения фильтра.

4) Нельзя допускать, чтобы на изображении с примененным фильтром были области черного цвета по размерам сопоставимые или превышающие размеры шаблона. Т.к. это приведет к тому, что в этих областях шаблон будет найден с совпадением 100%.

5) Цветонезависимый поиск (режим borders) осуществляется с адаптивным фильтром изображения.  Т.е. фильтр преобразует по разному те же самые участки экрана, если резко меняется средняя яркость всего изображения (например, если к изображению добавить большое белое пятно или окно, то средняя яркость сильно изменится). В этом можно самостоятельно убедиться делая скриншоты с фильтром «borders» и добавляя на экран различные окна. Такой подход с одной стороны позволяет при любой освещенности выделять границы объекта, но с другой стороны они могут изменить свой вид, что скажется на коэффициенте совпадения шаблона и объекта.

6) Иерархический поиск и цветонезависимый режим. Иерархический поиск полезен, когда необходимо найти небольшой объект в окне приложения, если искать такой объект по всему экрану, то высока вероятность, что объект будет найден совсем в другом месте, поэтому необходимо построить иерархию шаблонов. Посмотрим на примере:

hierarh

Например, мы бы хотели найти букву «o» обведенную в красный кружок на этом изображении, но мы видим, что такая буква есть и в других местах, обведенных зеленым цветом (также за эту букву может быть принята плотная группа черных точек подходящего размера), как же нам найти именно букву в красном кружке? Необходимо сначала найти рамку обведенную в оранжевый прямоугольник, т.е. сделать шаблон этой рамки, и найти его, а буква должна быть подчиненным шаблоном к шаблону рамки, тогда она будет искаться только внутри рамки.

И тут необходимо вспомнить, что фильтр при цветонезависимом поиске у нас адаптивный. А поиск вестись будет только внутри рамки, и более того фильтр будет применятся только внутри рамки и исходя из средней яркости внутри рамки. Т.е. когда программа будет искать букву «o», она увидит анализируемый участок картинки вот так:

izobr

т.е. тут только область рамки внутри которой мы будем искать букву. А после того как на изображение будет наложен фильтр, то оно станет таким:

izobrBord

Как видим, данное изображение несколько отличается, от того, что было на первой картинке, которая делалась со всего экрана. Границы рамки не прерываются, она стала более четкой.  Т.е. «вблизи» наша программа видит значительно лучше, детали становятся гораздо более различимыми, что особенно важно в задаче распознавания текста, и это еще одна причина для того чтобы использовать иерархический поиск.

Рассказываю я это все потому, что при создании шаблонов для цветонезависимого поиска вы должны следовать той же логике, по которой будет действовать программа при поиске. Т.е. создавая подчиненный шаблон необходимо сначала вырезать командой «Cut» родителя этого шаблона на изображении, и только к вырезанному участку применять фильтр «borders», в противном случае программа при поиске будет видеть совсем не ту картинку которую видите вы при создании иерархического шаблона для цветонезависимого поиска.

                Выше я все время подчеркивал, что все сказанное справедливо только для цветонезависимого поиска. Т.к. как уже было сказано, фильтр «borders» — адаптивный. В режиме поиска по диапазону цветов «ColMap» иерархический поиск также можно и нужно использовать, но этот режим не является адаптивным и поэтому подготовка шаблонов в нем выглядит проще. Т.к. если вы отфильтруете скриншот всего экрана или только отдельно участок с искомой рамкой — результат будет абсолютно идентичный, т.к. метод не реагирует  на окружающие объекты, а потому фильтровать только изображение родителя отдельно смысла не имеет.

 

Bot Development Engine