Используя tess4j, как я могу получить доступ к методу объединения слов

Я понимаю, что могу попросить Tesseract вернуть текст обратно на уровне слова, текстовой строки, абзаца, блока.

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

Я предполагаю, что у Tesseract есть эта способность, поскольку я могу вернуть слова на уровне текстовой строки по порядку или на уровне абзаца со словами на правильном уровне. Могу ли я получить доступ к этому методу из API tess4j?

Или может кто-нибудь указать мне алгоритм, чтобы я мог реализовать его самостоятельно?

Спасибо

Изменить Вот пример. Предположим, что мое изображение имеет этот блок текста

  John Doe                Adam Paul             Sara Johnson
Vice President         Director of IT      Head of Human Resources
 [email protected]           [email protected]         [email protected]

Если я запрошу у tess4j слова уровня текстовой строки, то получу 3 строки:

John Doe Adam Paul Sara Johnson

а также

Vice President Director of IT Head of Human Resources

а также

[email protected] [email protected] [email protected]

Вместо этого я хочу

John Doe     
Vice President
[email protected]

а также

Adam Paul
Director of IT
[email protected]

а также

Sara Johnson
Head of Human Resources
[email protected]

person kane    schedule 31.05.2017    source источник
comment
Вы пробовали разные режимы PSM?   -  person nguyenq    schedule 02.06.2017
comment
К сожалению, сегментация, которая мне нужна, немного сложнее, чем то, что я описал, и она не подходит для всех. Иногда мне нужен целый абзац, а иногда мне нужно первое предложение абзаца, поэтому у меня есть специальный алгоритм, который группирует мои слова. Мне просто нужно было что-то, чтобы отобразить их в удобочитаемом виде. Я опубликовал ответ, который работает достаточно хорошо   -  person kane    schedule 02.06.2017


Ответы (1)


Я написал свой собственный алгоритм, который сортирует слова. Основная идея — компаратор, который показывает слова сверху вниз и слева направо (конечно, для английского языка).

Я использую нижний край (т.е. minY) слова для сравнения, потому что он должен быть примерно одинаковым для слов разных размеров, в то время как верхний край (т.е. maxY) может быть выше для больших слов.

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

new Comparator<Word>() {
  @Override
  public int compare(Word w1, Word w2) {
    Rectangle b1 = w1.getBoundingBox()
            , b2 = w2.getBoundingBox();

    double yDiff = Math.abs(b1.getMinY() - b2.getMinY());
    double marginDiff = b1.getHeight()/2.0;
    if( yDiff < marginDiff ) {
      int xDiff = Double.compare(b1.getMinX(), b2.getMinX());
      return xDiff;
    } else {
      return Double.compare(b1.getMinY(), b2.getMinY());
    }
  }
}
person kane    schedule 02.06.2017