Показать сообщение отдельно
  #1  
Старый 17.02.2009, 23:52
гость

 
Сообщений: n/a

Свертка двух изображений для поиска фрагмента в рисунке
Здравствуйте!

Сразу оговорюсь, что ранее обработкой изображений никогда не занимался, поэтому прошу прощения, если вопрос совсем детский.
Основная задача: найти фрагмент изображения на картинке. Фрагмент заранее известен, не меняется, и всегда присутствует на основной картинке. Он не вращается и не масштабируется. Время выполнения не сильно критично.
Для решения поставленной задачи пошел "в лоб": делаю свертку основного изображения и искомого ядра, причен не через БПФ, а "по определению" через сумму произведений. Ядро размером 50х50. Знаю, что быстрее было бы делать БПФ, но решил попробовать написать наиболее простой вариант.
Как делал. Ядро и картинку привожу в greyscale по байту на пиксел. 255 - максимальное значение. Делаю свертку шаблона с ядром 3х3 (центр 8, остальные -1) для выделения контуров. Свертка делается обычными вложенными циклами с последющей проверкой на вылет в отрицательный диапазон. Все отрицательные цисла заменяю на 0. Далее ищу максимум по ВСЕМ пикселям результата и делаю нормировку каждого пикселя: val = val / max * 255;
Полученное ядро аналогичным образом "сворачиваю" с основной картинкой и опять нормирую до 255.
Результат.
В тех местах, где искомые шаблоны действительно присутствуют, я вижу "пики" с ярко выраженным центральным пикселем амплитуды порядка 180ед. Ближайшие к пику точки около 120ед. Все как учили.
Внимание, вопрос! Очень смущает, что если на исходной картинке присутствуют большие (больше ядра) области, залитые белым (ну или почти белым), то и после свертки с ядром эти области так и остаются белыми (ну ессно размытыми). Причем уровень белого выше 200!!!
Сам шаблон поиска у меня имеет яркость порядка 100, после выделения контуров он становится весь черный с практическими белыми контурами.
Как же мне теперь искать ту самую точку "пика", которая "однозначно" должна говорить о вхождении шаблона в картинку в данной точке, если у меня есть целые области, залитые белым и при том не содержащие искомого шаблона???
Что я не так делаю??? Я думал, что после свертки вся картинка будет достаточно темная и светлые места будут ТОЛЬКО там, где картинка содержит шаблон
Может у меня где-то идеологическая ошибка? Или все правильно и свертка действительно "не ищет" в светлых областях темные шаблоны? Или все правильно и я должен искать именно "пики" а на области не обращать внимания??? И как быть с тем, что "высота" правильного "пика" получается меньше чем высота обманного "плато"?

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