Вы знаете, что ваша проблема непростая, но она кажется очень интересной!
Хотя у меня нет для вас решений, я просто поделюсь своими мыслями в надежде, что вы сможете что-то из этого сделать.
Давайте возьмем 2 ваши фотографии в качестве примеров:
Фото-А: http://imageshack.us/photo/my-images/59/dsc0275a.jpg/
На нем изображен один человек с относительной «большой» зеленой этикеткой с цифрами в его рубашке.
Фото-B: http://imageshack.us/photo/my-images/546/dsc0243u.jpg/
На нем много людей с красными ярлыками поменьше в рубашках.
(Высота надписей в пикселях составляет около 1/5 от надписи на Фото-А)
Учитывая вышеизложенные фотографии, я постараюсь написать несколько случайных мыслей, которые могут помочь ...
(a) Определите масштаб: Нет смысла применять алгоритм поиска для поиска меток размером от 2x2 пикселей до полного разрешения изображения. Вы должны определить минимальные / максимальные пределы для ширины и высоты этикетки. Эти ограничения могут зависеть от множества различных факторов:
(1) Одним из факторов является реальный размер этикеток (определяется расстоянием между людьми и камерой), который можно определить как процент от ширины и высоты изображения.
(2) Другим фактором является фактическая точность чтения OCR, которую вы собираетесь использовать. Если высота изображения чисел меньше, чем Y1 пикселей или больше, чем Y2 пикселей, OCR не сможет его прочитать (это звучит странно, но это правда: большие изображения могут показаться человеческому глазу очень ясными, но OCR может иметь проблемы). читая это).
(b) Найдите интересующую область (и): В вашем случае это эквивалентно "Найти приблизительное положение меток". Мы можем определить метку спортсмена примерно как «(почти) прямоугольную область, которая может быть немного наклонена относительно границ фотографии, и содержит: центральную область черного + цвет C1 [например, красный или зеленый] + белый (= нейтральный) ) область сверху и / или снизу ".
Возможный алгоритм поиска приблизительного положения метки:
(1) Пройдите по всему изображению слева направо, сверху вниз и осмотрите квадратную область MinHeight / 2 x MinHeight / 2
(2) Создайте гистограмму квадратной области (или постеризуйте ее, например, до 8 уровней) и попробуйте найти, если есть только черный + другой цвет C1 в процентах, например, Черный: 40% +/- 10, Цвет: 60% +/- 10%
(3) Если (2) истинно, попробуйте расширить область до правого и нижнего, пока проценты сохраняются в указанных пределах
(4) Если квадрат полностью расширен, проверьте, находится ли размер расширенной области в пределах минимальных / максимальных пределов ширины / высоты, указанных вами в (а). Если нет, перейдите к шагу 1
(5) Обработайте расширенную область, чтобы прочитать числа - см. (С) ниже
(6) Перейти к шагу 1
(c) Обработать интересующую область (и): Попробуйте выполнить следующие действия:
(1) Преобразуйте каждую область изображения в оттенки серого, применяя цветной фильтр, который записывает цвет C1 в белый.
(2) Выровняйте шкалу серого, чтобы выделить черные буквы
(3) Если обнаружен наклон, выполните обратное вращение области изображения, чтобы сделать буквы как можно более горизонтальными.
(4) Подать область в OCR, обученный только для чисел
Удачи в вашем проекте!