2013-09-03 2 views
2

У меня есть изображение, которое содержит цифры.Как классифицировать это одна цифра или несколько цифр

original image

есть: 1, 153, 25, 50, 23, и 40

Для каждой цифры, у меня нет никаких проблем с распознаванием цифр. Я могу узнать, что есть 1, 1, 5, 3, 5, 0, 2, 5, 2, 3, 4, 0.

Теперь я хочу, чтобы они стали 1, 153, 25, 50, 23 , и 40.

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

мои ожидания, как это

expectation

, но реальность такова, как это

reality

1, 153, 25, 5, 0, и 2340

поскольку,

  • расстояние 5 и 0 слишком далеко

  • расстояние 23 и 40 находится слишком близко

Мой вопрос, есть другой подход к классификации те одну или несколько цифр? Если да, то как? :) Большое спасибо :)

* извините за мой плохой английский

** Я с помощью OpenCV C++

+0

Для случая 50 вы можете исправить расстояние между цифрами, например, d. Если цифры имеют расстояние больше d, то это разные числа. Для случая 2340, я не думаю, что это 23 и 40. Я считаю, что это 2340. – Barshan

+0

Да, фиксированное расстояние может быть реализовано в печатном виде. Но в рукописном характере, написанном в белой бумаге (без строк), я думаю, что это довольно сложно, из-за «слишком свободной». Я имею в виду, что для рукописного текста нет фиксированного расстояния, такого как напечатанный текст. Иногда человек просто пишет без внимания расстояние цифры. Вот почему я сделал эти примеры, 50 и 2340, я хочу решить эти случаи, «слишком далеко» и «слишком близко». Это изображение является лишь примером. Пожалуйста, исправьте меня, если я ошибаюсь. :) – lulu

+0

Мне кажется 2340 для меня тоже ... – Michele

ответ

2

Время расчета размывания затем найти габаритного прямоугольника велика по сравнению с этим:

Если вы можете выбрать каждую из этих цифр, вы должны иметь хотя бы центральную точку для каждой цифры. Я бы это сделал, найдя ширину и высоту каждого числа вместе с вращением. С этой информацией я бы применил набор правил, которые соответствуют тому, как читать номер.

Этих правила могут работать:

  1. Начать с пустым графом номера узла, равным количеству цифр
  2. ли цифра испытываемой иметь любую другую цифру меньше, чем одна шириной выездной (или две ширины от центральной точки друг друга)?
  3. Если это так, то обе цифры имеют одинаковое вращение (+/- допуск)
  4. Если это так, то поворот 90 (+/- tol) градусов к линии между центральными точками двух цифр?
  5. Определить порядок, используя разницу вектор из двух точек
  6. Создание направленного кант между двумя цифрами
  7. Проверка на другую цифру на противоположной стороне (Shortcut)
  8. Повторите следующую цифру
  9. Walk по графику, чтобы найти ваш набор чисел

Учитывая такие проблемы, я бы предпочел использовать вероятности для заказа набора возможных решений, чтобы ваша программа могла спросить оператора или получить его что он может вернуться и выбрать следующий «лучший».

Надеется, что это помогает, я завидую свои навыки распознавания цифр :)

0

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