Изображение в алгоритме изображения
Мне нужен алгоритм, написанный на любом языке, чтобы найти изображение внутри изображения, в том числе в разных масштабах. Кто-нибудь знает отправную точку для решения такой проблемы?
Например:
У меня есть изображение 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.
Простая отправная точка - преобразование Хафа, если вы хотите найти круги.
Однако существует целая область исследований по этому предмету, называемая обнаружением и распознаванием объектов. Уровень техники значительно продвинулся за последнее десятилетие.