Разделите изображение текста в символьные изображения компонента

Я хотел бы разделить изображение текста в, он - символы компонента, также как изображения. Например, с помощью образца ниже я закончил бы с 14 изображениями.

Я только собираюсь быть текстом использования на одной строке, таким образом, y-высота неважна - что я должен найти, начало и конец каждой буквы и обрезки к тем координатам. Тем путем я также избежал бы проблем со 'мной', 'j', и т.д.

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

Попытка улучшить мои навыки Python и знакомство с некоторыми из многих доступных библиотек, таким образом, я использую Библиотеку обработки изображений Python (PIL), но я также взглянул на OpenCV.


Демонстрационное изображение:

This is some text

5
задан blork 29 December 2009 в 00:22
поделиться

5 ответов

Это непростая задача, особенно если фон не является однородным. Если то, что у вас есть - уже бинарное изображение, как в примере, то это немного проще.

Вы можете начать применять пороговый алгоритм, если ваше изображение не является бинарным (адаптивный порог Otsu хорошо работает)

После того, как вы можете использовать алгоритм маркировки, чтобы идентифицировать каждый "островок" пикселей, образующих ваши фигуры (каждый символ в данном случае).

Проблема возникает при наличии шума. Фигуры, которые были помечены, но не представляют вашего интереса. В этом случае вы можете использовать какой-нибудь эвристический метод, чтобы определить, когда фигура является персонажем или нет (вы можете использовать нормализованную область, положение объекта, если ваш текст находится в хорошо определенном месте и т.д.). Если этого недостаточно, Вам придется иметь дело с более сложным персоналом, таким как алгоритмы извлечения фигурных признаков и своего рода алгоритм распознавания шаблонов, например, многослойные перцептроны.

В конце концов, это кажется легкой задачей, но в зависимости от качества Вашего изображения, она может усложниться. Приведенные здесь алгоритмы можно легко найти в интернете, а также реализовать в некоторых библиотеках типа OpenCv.

Больше помощи, просто спросите, могу ли я, конечно, помочь ;)

.
5
ответ дан 18 December 2019 в 10:45
поделиться

Можно начать с простого алгоритма анализа подключенных компонентов (CCA), который можно достаточно эффективно реализовать с помощью алгоритма сканирования (достаточно просто проследить за объединенными областями и перемаркировкой в конце). Это даст вам отдельно пронумерованные "капли" для каждой непрерывной области, что будет работать для большинства (но не для всех) букв. Затем вы просто возьмете ограничительную рамку каждого соединенного блока, и это даст вам контур для каждого из них. Вы даже можете сохранить ограничительную рамку, применяя CCA для эффективности.

Итак, в вашем примере, первое слово слева после CCA приведет к чему-то вроде:

1111111  2         3
   1     2
   1     2 4444    5  666
   1     22    4   5 6
   1     2     4   5  666
   1     2     4   5     6
   1     2     4   5  666

с классами эквивалентности 4=2.

Тогда ограничительные рамки каждого блока дают вам область вокруг буквы. Вы столкнетесь с проблемами с такими буквами, как i и j, но они могут иметь специальный регистр. Можно искать область меньше определенного размера, которая находится выше другой области определенной ширины (как грубая эвристика).

Библиотека cvBlobsLib в OpenCV должна сделать большую часть этого за Вас.

.
2
ответ дан 18 December 2019 в 10:45
поделиться

Проблема, которую вы поставили, действительно сложна - некоторым из лучших в мире исследователей, занимающихся обработкой изображений, потребовалось довольно много времени, чтобы решить ее. Решение этой проблемы является основной частью инструментария для сжатия и отображения изображений Djvu: их первым шагом при сжатии документа является идентификация переднего плана и разбиение его на символы. Затем они используют информацию, чтобы помочь сжатия, потому что изображение одного нижнего регистра 'е' очень похоже на другой - сжатый документ должен содержать только различия. Ссылки на кучу технических документов можно найти по адресу http://djvu.org/resources/; хорошее место для начала - Высококачественное сжатие изображения документа с помощью Djvu.

Многие инструменты в наборе Djvu были открыты под названием djvulibre; к сожалению, я не смог понять, как вытащить изображение на передний план (или отдельные символы) с помощью существующей команды--линейные инструменты. Мне было бы очень интересно посмотреть, как это будет сделано.

1
ответ дан 18 December 2019 в 10:45
поделиться

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

.
1
ответ дан 18 December 2019 в 10:45
поделиться

Хм, это на самом деле очень просто для предоставленного вами примера:

start at left edge
  go right 1 column at a time until the current column contains black (a letter)
  this is the start of the character
  go right again till no black at all in current column
  end of character
repeat till end of image

(Кстати, это также работает для разделения абзаца на строки)
. Если буквы перекрываются или делятся столбцами, то становится немного сложнее .

Правка:

@Andres, нет, для 'U' это прекрасно работает, нужно посмотреть на all каждого столбца

 U   U
 U   U
 U   U
 U   U
  UUU
 01234

0,4:everything but bottom row
1-3:only bottom row
2
ответ дан 18 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: