Изображение в алгоритме изображения

Мне нужен алгоритм, написанный на любом языке, чтобы найти изображение внутри изображения, в том числе в разных масштабах. Кто-нибудь знает отправную точку для решения такой проблемы?

Например:

У меня есть изображение 800x600, на котором изображен желтый шарик с окружностью 180 пикселей. Я должен быть в состоянии найти это изображение с шаблоном поиска желтого шара, имеющего окружность 15 пикселей.

Спасибо

4 ответа

Решение

Вот алгоритм:

  • Разделите изображение на RGB и возьмите синий канал. Вы заметите, что области, которые были желтыми на цветном изображении, теперь темны в синем канале. Это потому, что синий и желтый являются дополнительными цветами.
  • Инвертировать синий канал
  • Создайте шаблон поиска в оттенках серого с кружком того же размера, что и на изображении (180 пикселей по окружности). Сделайте это белым кружком на черном фоне.
  • Рассчитайте взаимную корреляцию шаблона поиска с инвертированным синим каналом.
  • Пик взаимной корреляции будет соответствовать местоположению шара.

Вот алгоритм в действии:

RGB и R:

альтернативный текстальтернативный текст

G и B:

альтернативный текстальтернативный текст

Перевернутый B и рисунок:

альтернативный текстальтернативный текст

Код Python + OpenCV:

import cv
if __name__ == '__main__':
    image = cv.LoadImage('ball-b-inv.png')
    template = cv.LoadImage('ball-pattern-inv.png')

    image_size = cv.GetSize(image)
    template_size = cv.GetSize(template)
    result_size = [ s[0] - s[1] + 1 for s in zip(image_size, template_size) ]

    result = cv.CreateImage(result_size, cv.IPL_DEPTH_32F, 1)

    cv.MatchTemplate(image, template, result, cv.CV_TM_CCORR)

    min_val, max_val, min_loc, max_loc = cv.MinMaxLoc(result)

    print max_loc

Результат:

misha@misha-desktop:~/Desktop$ python cross-correlation.py 
(72, 28)

Это дает вам верхнюю левую координату первого вхождения шаблона на изображении. Добавьте радиус круга к обеим координатам x и y, если вы хотите найти центр круга.

Версия одного из предыдущих постов, сделанных с opencv 3 и python 3

import cv2
import sys

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(cv2.matchTemplate(cv2.imread(sys.argv[1]),cv2.imread(sys.argv[2]),cv2.TM_CCOEFF_NORMED))

print(max_loc)

сохранить как file.py и запустить как:
образец файла python file.py

Вы должны взглянуть на OpenCV, библиотеку компьютерного зрения с открытым исходным кодом - это было бы хорошей отправной точкой. В частности, проверьте обнаружение объекта и метод cvMatchTemplate.

Простая отправная точка - преобразование Хафа, если вы хотите найти круги.

Однако существует целая область исследований по этому предмету, называемая обнаружением и распознаванием объектов. Уровень техники значительно продвинулся за последнее десятилетие.

Другие вопросы по тегам