Изображение в алгоритме изображения - PullRequest
5 голосов
/ 18 января 2011

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

Например:

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

Спасибо

Ответы [ 4 ]

21 голосов
/ 18 января 2011

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

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

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

RGB и R:

alt text alt text

G и B:

alt text alt text

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

alt text alt text

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, если вы хотите найти центр круга.

1 голос
/ 21 мая 2016

версия одного из предыдущих постов, сделанных с 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 image pattern

1 голос
/ 18 января 2011

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

0 голосов
/ 18 января 2011

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

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

...