Перейти к содержимому
Compvision.ru
shornikov

Обработка сканов книг

Recommended Posts

Здравствуйте.

Есть у меня такая задача, я напишу, как я хочу ее решить, а вы, если не трудно, укажите на ошибки в размышлениях и использовании инструментов.

Задача. отсканировать много однообразных документов на серой бумаге и довести до ума.

Если использовать фотошоп и прочее - слишком много ручной работы в виде закликивания шума и восстановления затёкших, после использования фильтров, букв.

Подумалось, что можно поступить так:

До какой-то степени файлы приводятся к одному тону фотошопом, потом передаются в связку Phyton+OpenCV.

Планирую сделать так.

1.Для отчистки изображения найти контуры, мелкие контуры посчитать шумом и залить белым цветом.

Пробелема. Часть мелких контуров отвалившиеся хвостики от букв и удалять их нельзя. Думаю, что нужно взять мелкий контур и если на определенном растоянии от него есть большой - соединить их линией.

Изначально казалось что подойдет distanceTransform() + threshold(), но он действует на всё изображение, а мне нужно на конкретную точку (проще,наверное, использовать центр контура).

Подскажите, как это проделать эстетично?

2. Для повышения качества рваные буквы планируется распознать путем сравнения контуров с заранее подготовленными образцами и подменить на отчищенные буквы через matchShapes().

Проблема. Как быть с буквами типа "й","i", состоящими из двух контуров. Рассматривать как независимые символы или объединять. Если объединять, то как?

С распознованием, вроде, проблем не предвидится, качество распознования можно наращивать бесконечно. Как вариант рваность можно убирать через ApproxPoly(), но, кажется, это будет сложнее.

Хотелось бы услышать мнение профессионалов о моих размышлениях и получить совет, как решить проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вначале бинаризация по Оцу, или аналогичная (стандартный ход).

Затем морфологические операции (здесь обычно удаляется шум и пришиваются хвостики :) )

посмотрите книжку:

"Digital Image Processing" (3rd Edition) Rafael C. Gonzalez.

есть перевод второго издания:

Гонсалес, Вудс. Эддинс. "Цифровая обработка изображений"

После этого сегментация по строкам, по словам и по буквам (последовательно).

По поводу Distance transform, есть такое преобразование, применяемое при работе с текстом: stroke width transform, посмотрите, может будет интересно.

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

PS:

Посмотрите еще:

http://www.leptonica.com/index.html

и

http://www.leptonica.com/binarization.html

http://tpgit.github.com/UnOfficialLeptDocs/leptonica/document-image-analysis.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

многое зависит от документов.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вот вообще готовое решение

http://code.google.com/p/pytesser/

просто скрипт на питоне который вызывает экзешник от tesseract-ocr хотя какой то он старый + непонятно как будет работать на реальном примере и по идее текст на выходе будет не форматированный.

а бинаризацию можно проводить на том же питоне на opencv или какими либо своими библиотеками питона.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вот вообще готовое решение

http://code.google.com/p/pytesser/

Мне не нужен текст. В оригинале дореволлюционый русский + формулы + еще черт знает что будет.

Вполне устроит качественная картинка с востановленным рисунком символов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

значит я не правильно понял, значит только бинаризация.

можно попробовать FIJI\ImageJ там есть несколько методов бинаризации и можно написать скрипт для пакетной обработки файлов.

с востановленным рисунком символов.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Улучшится качество части символов - уже проще.

Попробовал распознавать через matchShapes, очень плохо, видимо мозгов у меня не зватает :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут скорее MatchTemplate подойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть хорошо известные правила ведения проектов. В том числе и научных.

Обычно начинают с поиска аналогов.

А вообще по обработке книг очень хорошей сайт.

http://www.djvu-soft.narod.ru/

Там найдёте и программы для обзора и методы и и даже часть реализаций.

А возможно вам даже не придётся писать и вы возьмёте одну из существующих программ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А вообще по обработке книг очень хорошей сайт.

Спасибо за ссылку, почитаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут скорее MatchTemplate подойдет.

А как мне все похожести найти?

cvMinMaxLoc, которой оперируют во всех примерах находит лучший вариант, а мне бы хотелось массив.

Брать контуры нарезанные в ROI и сравнивать шаблон с каждым,игнорируя значения ниже порога или есть способ проще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно по принципу "нашел-убил" :)

То есть, найденные лучшие обнулять и искать снова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×