Вот алгоритм:
- Разделите изображение на 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, если вы хотите найти центр круга.