Мне удалось раздобыть программную реализацию ещё одного метода Dewarping, который я назвал условно "Скелетный".
Авторы - 2 человека, россияне, преподаватель и аспирант одного из математических факультетов МГУ.
Антон Масалович, Леонид Местецкий
Московский государственный университет,
Москва, Россия
anton_m@abbyy.com,
l.mest@ru.netОписание метода:
"Распрямление текстовых строк на основе непрерывного гранично-скелетного представления изображений"
www.machinelearning.ru/wiki/images/e/ec/Gr_2006_Masalovitch.pdfЗеркало:
http://yadi.sk/d/K_whaVj-4w-SAПродолжение:
"Использование патча Безье для аппроксимации искажения
изображений текстовых документов"
www.machinelearning.ru/wiki/images/a/a2/Gr_2007_Masalovich.pdfЗеркало:
http://yadi.sk/d/WrsMt76G4w-3IЯ сначала написал письмо Антону, который, собственно, и сделал непосредственно Dewarping, вот что он мне ответил:
Добрый день.
Я постараюсь восстановить свой код и прислать его вам на следующей неделе.
Но там сразу будет две проблемы с библиотеками:
1) В коде используется внутренняя библиотека ABBYY (аналог STL) для стандартных объектов (массивы, строки, списки, ...). Ее исходников я дать не могу в любом случае. Так что всю эту систему придется переписать на STL.
2) Для построения скелета изображения вызывается сторонняя библиотека, которой у меня тоже нет. Эту библиотеку для построения скелетов разрабатывал мой научный руководитель, можно узнать у него может ли он предоставить ее исходники.
Правда библиотека строила скелет изображения по запросу и грузила его в бинарный файл, а мой код уже грузил скелет из этого файла. Так что библиотеку построения скелета можно использовать более-менее любую.
По поводу библиотеки построения скелета можно обратиться:
Леонид Местецкий, l.mest@ru.net
Затем я обратился к Местецкому и получил такой ответ:
Здравствуйте, уважаемый коллега!
Вы не подписываетесь своим именем, поэтому обращаюсь к Вам таким образом.
Исходные коды библиотеки скелетизации я предоставить пока не готов, они написаны "для себя" и слишком сложны для использования коллегами без специальной авторской доработки. В открытом доступе у меня есть эта библиотека в виде DLL, которая может использоваться из си++ и паскаль-программ. Так что если Антон поможет Вам с адаптацией его программы, то с подключением моей библиотеки проблем не будет.
Библиотека находится в разделе Библиотека программ на странице
http://www.machinelearning.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BC%D0%BE%D1%80%D1%84%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%28%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9B.%D0%9C._%D0%9C%D0%B5%D1%81%D1%82%D0%B5%D1%86%D0%BA%D0%B8%D0%B9%29#.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC
С тех пор, как Антон закончил свою работу по этой теме, я ею не занимался. Однако сейчас у меня появился студент, который заинтересовался этой задачей, правда в несколько более узкой постановке, и даже принял участие в программистском соревновании на близкую тему, которое проводится в рамках конференции ICDAR-2013 http://users.iit.demokritos.gr/~alexpap/DISEC13/
Я готов вернуться к исследованиям по этой тематике, если здесь имеются какие-то реальные задачи. Если хотите, мы можем поискать задачу для возможного сотрудничества.
С уважением
Леонид Местецкий
В общем, вот короткая ссылка на страницу с DLL:
http://tinyurl.com/b5lwnsnБиблиотека в виде DLL, обеспечивающая построение скелета изображения:
Программа на Delphi-Pascal Архив [500 Кб]
http://www.machinelearning.ru/wiki/images/d/d8/SkeletonMaker_Delphi.rarЗеркало:
http://yadi.sk/d/ZpSsJSvJ4w-6UПрограмма на C++ Архив [4.4 Мб]
http://www.machinelearning.ru/wiki/images/d/da/SkeletonMaker_C.rarЗеркало:
http://yadi.sk/d/dPVph-We4w-5uИ вот сегодня Антон, наконец, прислал мне свою программу - вместе с исходниками.
Вот я её выложил (6,4 МБ):
http://yadi.sk/d/LWQ34Ex-4vyFGПояснения от Антона:
Вот по этой ссылке лежит архив с моей программой.
В архиве 4 папки:
1) batch_xml - несколько тестовых изображений с размеченными тестовыми блоками.
1) Unbender - собственно исходники моего распрямителя. Проект написан по VisualStudio 2008, запускать студию лучше cmd-файлом из корня (Unbender.cmd), тогда все нужные для проекта пути будут проставлены правильно.
2) TranslatorDLL - транслятор данных от библиотеки построения скелета в нормальный формат. Библиотека построения скелета от Местецкого, которая была у меня на выходе выдавала поток данных в каком-то стандартном формате для борландовских библиотек. Пришлось писать транслятор под Borland C++, который брал этот поток и складывал в файл на диск в формате нужном мне. Если сейчас библиотека построения скелета выдает более общеизвестные данные, то транслятор можно будет с чистой совестью выкинуть.
3) WinRelease - это полностью собранный, работающий мой проект со всеми нужными библиотеками. На нем можно смотреть как должна работать моя программа.
По поводу моего кода:
1) Он сейчас не собирается, потому что нет исходников для трех вспомогательных библиотек - FineObj (реализация массивов, списков и других контейнеров), AWL (реализация оконного интерфейса), RLE (реализация RLE представления изображения). По поводу RLE - это представление изображения в виде последовательности черных штрихов. В каждом штрихе записаны его начало и конец. Само изображение - это массив штрихов. Начало новых строк в массиве отмечается специальным штрихом Sentinel_Stroke. Мне кажется что для для такого представления изображения должно быть много реализаций с открытым кодом.
2) Моя программа работает из расчета, что на изображении выделен один большой текстовый блок, который она и тыается распрямить. То есть, к примеру, на большой газетный лист ее запускать бессмысленно. При загрузке изображения программа пытается найти и загрузить из xml-файла с описанием текстового блока на странице. Если описания нет, то программа считает все изображние рабочей областью. После загрузке изображения блок можно поправлять вручную.
3) При работе можно делать обработку изображения по шагам, а можно сразу целиком. Обработка по шагам делалась в основном для тестирования программы и для создания иллюстраций для диссертации, полная обработка должна работать совершенно нормально.
4) Основная логика обработки одного изображения описана в классе CSkeletForm - он создает скелет изображения и обрабатывает изображение по шагам.
Я извиняюсь, но код достаточно мало комментированный и не всегда очень чистый. К сожалению, у меня сейчас нет времени на то, чтобы его переписывать в более удобном виде и на написание подробной документации.
Но я готов отвечать на любые вопросы, когда они возникнут - так что можно смело спрашивать.
С уважением,
Антон.