Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Выделение частей изображения


Автор: Ground 1.2.2011, 06:00
Добрый день!
Появилась необходимость распознавания картинок. Имеется: большое изображение с фотоаппарата - 12Мпкс, 4200х2800; малое - 40х40 (пример во вложении, малое изображение для поиска - мишень). Необходимо определить все вхождения малого изображения в большое. Сложности - шум, неоднородный фон, плюс небольшие искажения малого изображения, плюс необходима высокая точность. В этой области мои знания стремятся к 0, хотелось бы услышать какой-нибудь совет, куда копать? 
Может фильтр какой применить, увеличить контрастность (белые области выделить), а после уже в них искать?

Автор: Earnest 1.2.2011, 08:28
Если все вхождения искомого изображения имеют примерно одинаковый размер и ориентацию, можно попробовать корреляцию: т.е. фильтрацию (свертку) полного изображения с маской (искомое изображение). Где отклик превышает некоторый порог, там цель... Есть масса тонкостей, но в целом как-то так.

Автор: _Y_ 1.2.2011, 11:16
http://forum.vingrad.ru/index.php?showtopic=314777&view=findpost&p=2246148 В книге глава 4.3.

Автор: Ground 2.2.2011, 06:17
_Y_, благодарю за книгу!
Earnest, можно поподробнее? Исходное изображение и маска в grayscale, просчитываю каждый пиксель (область) с этой маской, получается изображение, на котором можно выделить максимумы, но они будут локальными (прикрепленный файл).
Нашел человека с похожей http://electronix.ru/forum/index.php?showtopic=59466 (советуют корректировать маску для поиска). Пытался  корректировать яркость каждого пикселя маски на среднее значение, на медиану. И если для одного образца работает такой способ, максимумы более-менее выделяются на черном фоне, то для другого получается просто сплошной черный фон. Где-то закралась ошибка, или тут есть нюансы?

Автор: Earnest 2.2.2011, 08:28
Ну, разумеется, нужно обязательно вычитать среднее значение и из маски и из растра под маской (при каждом наложении), иначе залитые области будут давать большой отклик. Только почему медиану-то, это совсем не то, что среднее - не даст нормализации. Маску можно скорректировать сразу, а для вычитания средней яркости растра под маской можно формулу прописать (там получается, что нужно из свертки доп. член вычесть - свертка-то линейна). Еще маску можно бинаризовать, если суть позволяет - т.е. черные пикселы на белом фоне или наоборот. Или 3 цвета максимально удаленных - в общем, контраст максимальный. Максимумы, конечно, получатся локальные и размазанные, а не дельты. Это понятно - стоит представить, что изображение чуть шире маски и уже отклик размазывается. Наверное, можно придумать много способов. Мне пришло в голову только усреднение, можно с весом (размер отклика). Вроде неплохо получается. Но результат зависит, конечно, от маски и от исходного изображения.
Цитата(Ground @  2.2.2011,  07:17 Найти цитируемый пост)
то для другого получается просто сплошной черный фон. Где-то закралась ошибка

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

Автор: dereyly 2.2.2011, 11:58
Обычно поисковые маски для свертки должны иметь нулевую энергию, т.е. вы можете элементы на маске представить значениями -1 и 1, затем посчитать сумму для -1 и 1 раздельно и скорректировать, к примеру до -0.76 и 1. Маску лучше сделать в пейнте, чем бинаризацией исходного куска изображения. 
PS: Могу написать матлаб-код, если интересно.

Автор: Earnest 2.2.2011, 13:39
То, что вы описываете как раз и получиться, если из маски вычесть среднюю яркость. Зачем же при этом раздельно +1 и -1 складывать?
Заранее маски можно сделать, когда они фиксированы. Хоть в пэйнте, хоть в нотепаде  smile .
Но может стоять задача создавать поисковые маски в диалоге с пользователем.

Автор: dereyly 2.2.2011, 17:57
Цитата(Earnest @ 2.2.2011,  13:39)
То, что вы описываете как раз и получиться, если из маски вычесть среднюю яркость. Зачем же при этом раздельно +1 и -1 складывать?
Заранее маски можно сделать, когда они фиксированы. Хоть в пэйнте, хоть в нотепаде  smile .
Но может стоять задача создавать поисковые маски в диалоге с пользователем.

Да вы правы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)