Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - monday2000

Страницы: [1] 2 3 ... 5
1
Программирование / Скелетный Dewarping
« : 17 јРЩ 2013, 22:40:27 »
Мне удалось раздобыть программную реализацию ещё одного метода 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 - он создает скелет изображения и обрабатывает изображение по шагам.
 
Я извиняюсь, но код достаточно мало комментированный и не всегда очень чистый. К сожалению, у меня сейчас нет времени на то, чтобы его переписывать в более удобном виде и на написание подробной документации.
Но я готов отвечать на любые вопросы, когда они возникнут - так что можно смело спрашивать.
 
С уважением,
Антон.

2
Я решил попробовать модифицировать Scan Tailor путём правки его исходных кодов.

Собрался СТ легко, в точном соответствии с инструкцией по сборке http://scantailor.git.sourceforge.net/git/gitweb.cgi?p=scantailor/scantailor;a=blob_plain;f=packaging/windows/readme.ru.txt

С помощью автора программы Tulon'а я сделал пока что такие исправления:

Оба исправления касаются ручного dewarping.
 
1. Когда в окне dewarping создаётся синяя сетка, то на её самой верхней и самой нижней синих горизонтальных линиях рисуется по 5 красных точек. Это неудобно - мне нужны лишь 2 - самая левая и самая правая, остальные 3 я всегда вручную убираю - прежде чем ставить свои красные точки. Вот код исправления:
 
C:\build\scantailor-0.9.11.1\filters\output\DewarpingView.cpp
 
void
DewarpingView::initNewSpline(XSpline& spline, QPointF const& p1, QPointF const& p2)
{
    QLineF const line(p1, p2);
    spline.appendControlPoint(line.p1(), 0);
    //spline.appendControlPoint(line.pointAt(1.0/4.0), 1);
    //spline.appendControlPoint(line.pointAt(2.0/4.0), 1);
    //spline.appendControlPoint(line.pointAt(3.0/4.0), 1);
    spline.appendControlPoint(line.p2(), 0);
}

закомментировано создание 3 ненужных мне красных точек
 
2. Когда в режиме распрямления строк "Отключено" начинаешь вручную менять положение синих линий / красных точек - то режим распрямления строк не переключается при этом сам с "Отключено" на "Вручную". Приходится потом лезть в диалог и переключать самому - а это лишние телодвижения. Повторенные на десятках страниц, они начинают раздражать. В общем, вот код исправления:
 
C:\build\scantailor-0.9.11.1\filters\output\OptionsWidget.cpp
 
void
OptionsWidget::distortionModelChanged(dewarping::DistortionModel const& model)
{
    m_ptrSettings->setDistortionModel(m_pageId, model);
   
    // Note that OFF remains OFF while AUTO becomes MANUAL.
    /*if (m_dewarpingMode == DewarpingMode::AUTO)*/ {
   
        m_ptrSettings->setDewarpingMode(m_pageId, DewarpingMode::MANUAL);
        m_dewarpingMode = DewarpingMode::MANUAL;
        updateDewarpingDisplay();
    }
}

Закомментировано мною - комментариями вида /* .... */

3. Перемещение всей самой верхней (нижней) синей горизонтальной линии за мышью за её крайнюю (левую или правую) красную точку. Работает это так: В окне dewarping, там, где синяя сетка, можно, нажав и удерживая Ctrl, двигать за крайнюю красную точку всю её горизонтальную синюю линию. Это даёт небольшое удобство при ручном dewarping.

Вот код исправления:

C:\build\scantailor-0.9.11.1\interaction\DraggableObject.h
 
class DraggableObject
{
public:
.........
 
virtual void dragContinuation(QPointF const& mouse_pos) {   
        m_dragContinuationCallback(mouse_pos);
    }
// добавляем перегруженную функцию - с маской нажатого Ctrl
virtual void dragContinuation(QPointF const& mouse_pos, Qt::KeyboardModifiers mask) {}
.........
}
 
C:\build\scantailor-0.9.11.1\interaction\DraggablePoint.h
 
class DraggablePoint : public DraggableObject
{
public:
........
typedef boost::function<
    //void (QPointF const&)
    void (QPointF const&, Qt::KeyboardModifiers mask)
> MoveRequestCallback;
 
............
//virtual void dragContinuation(QPointF const& mouse_pos);
virtual void dragContinuation(QPointF const& mouse_pos, Qt::KeyboardModifiers mask);
...........
protected:
............
//virtual void pointMoveRequest(QPointF const& widget_pos) {
virtual void pointMoveRequest(QPointF const& widget_pos, Qt::KeyboardModifiers mask) {
    //m_moveRequestCallback(widget_pos);
    m_moveRequestCallback(widget_pos, mask);
}
..........
}
 
C:\build\scantailor-0.9.11.1\interaction\DraggablePoint.cpp
 
void
//DraggablePoint::dragContinuation(QPointF const& mouse_pos)
DraggablePoint::dragContinuation(QPointF const& mouse_pos, Qt::KeyboardModifiers mask)
{
    //pointMoveRequest(mouse_pos + m_pointRelativeToMouse);
    pointMoveRequest(mouse_pos + m_pointRelativeToMouse, mask);
}
 
C:\build\scantailor-0.9.11.1\interaction\ObjectDragHandler.cpp
 
void
ObjectDragHandler::onMouseMoveEvent(
    QMouseEvent* event, InteractionState& interaction)
{
    if (interaction.capturedBy(m_interaction)) {
        //m_pObj->dragContinuation(QPointF(0.5, 0.5) + event->pos());
        m_pObj->dragContinuation(QPointF(0.5, 0.5) + event->pos(), event->modifiers());
    }
}
 
C:\build\scantailor-0.9.11.1\interaction\InteractiveXSpline.h
 
class InteractiveXSpline : public InteractionHandler
{
...........
private:
...........
//void controlPointMoveRequest(int idx, QPointF const& pos);
void controlPointMoveRequest(int idx, QPointF const& pos, Qt::KeyboardModifiers mask);
...........
}
 
C:\build\scantailor-0.9.11.1\interaction\InteractiveXSpline.cpp
 
void
InteractiveXSpline::setSpline(XSpline const& spline)
{
..........
 
new_control_points[i].point.setMoveRequestCallback(
    //boost::bind(&InteractiveXSpline::controlPointMoveRequest, this, i, _1)
    boost::bind(&InteractiveXSpline::controlPointMoveRequest, this, i, _1, _2) // это самое сложное место - но мне его Tulon подсказал
..........
}
 
void
//InteractiveXSpline::controlPointMoveRequest(int idx, QPointF const& pos)
InteractiveXSpline::controlPointMoveRequest(int idx, QPointF const& pos, Qt::KeyboardModifiers mask)
{
........
 
(mc(mat, 2, 2)*mc(pt, 2, 1)).write(pt);   
//m_spline.moveControlPoint(i, pt + origin); // original line - now commented
//начало добавления
if (mask != Qt::ControlModifier) // default behavior
    m_spline.moveControlPoint(i, pt + origin);
else // Control key is currently pressed
{               
    Vec2d shift_y = storage_pt - old_pos;               
    QPointF new_position = m_spline.controlPointPosition(i) + shift_y;               
    new_position.setX(m_spline.controlPointPosition(i).x());               
    m_spline.moveControlPoint(i, new_position);
}
//конец добавления
}
} else {
.........
}

3
DjVu / Перенесено: Новый сайт
« : 10 °ТУгбв 2012, 20:24:22 »

4
Каждый раз, когда я пишу очередную статью, я нередко использую различные статьи из Википедии - для описания тех или иных терминов.

Как ни странно, в Википедии порой нет некоторых специфических статей, относящихся к области книгосканирования.

Я думаю, что такие статьи давно пора создать - благо, что это может сделать любой желающий.

Для начала я сегодня создал статью "Deskew":

http://ru.wikipedia.org/wiki/Deskew

Она получилась довольно скромной. Если кто-то хочет помочь - примите участие в наполнении этой статьи или создании аналогичных статей.

5
Прислали мне на почту занятные плакаты:

Цитировать
Я был вдохновлён последней нотой вашего документа:
http://djvu-soft.narod.ru/scan/123.htm

Посылаю вам мои варианты по этой теме. Можете принимать как спасибо за
детальные и полезные инструкции.

Игорь





Автор: "Igor Khavkine" igor.kh at gmail.com

6
Общий / Схема создания DjVu-книги
« : 26 БХЭвпСам 2011, 18:28:14 »
Я сделал краткую схему, иллюстрирующую "на пальцах" процесс создания DjVu-книги:

http://www.djvu-soft.narod.ru/scan/diagram.htm

Это для самых нетерпеливых, для тех, кому надо срочно впервые в жизни сделать свою первую DjVu-книгу - но кто даже понятия не имеет, а как вообще её делать, с чего начать, и самое главное - как вообще выглядит весь процесс в целом.

Я постарался изложить всё как можно более КРАТКО, но в то же время - максимально иллюстративно. Своего рода, конспект, так сказать. В принципе, эта схема не зависит от конкретных программ. Сегодня СК, завтра - СТ и т.д. А процесс DjVu-книгосоздания от этого не меняется по большому счёту.

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

7
Как известно, формат DjVu поддерживает встроенные аннотации-гиперссылки. В качестве адреса такой гиперссылки можно задать, например, номер страницы многостраничного DjVu-файла. Всё это используется, к примеру, в такой программе, как DjVu Hyperlinks Editor - которая внедряет гиперссылочное оглавление в DjVu-книгу.

Но DjVu-гиперссылки имеют один существенный недостаток: по ним можно перейти только на начало желаемой DjVu-страницы. Тогда как в том же формате PDF по внутренней гиперссылке можно перейти на произвольное место желаемой DjVu-страницы - т.е. на позицию с произвольным смещением относительно верха страницы.

Я давно уже спрашивал у Леона Боту и его коллег, нельзя ли что-то с этим сделать, как бы добавить желаемый функционал к DjVu-гиперссылкам - чтобы уравнять их в возможностях с PDF-гиперссылками? Вот топик на DjVuLibre с этим обсуждением:

https://sourceforge.net/projects/djvu/forums/forum/103286/topic/3517234

Вот что ответил там Леон:
Цитировать
Things are not that simple. For instance, after eight years, there is still no consistency between djvulibre and celartem-djvu for something as simple as escape sequence in annotation strings. On the other hand, we (djvulibre) have been faster in implementing changes made by Celartem. Incidently, you can link to any part of a page by using the "showposition" cgi option. That works in djview4 and celartem=djvu. See http://djvu.sourceforge.net/doc/man/djview4.html
- L.

На днях я снова написал письмо Леону с тем же вопросом - что можно сделать с этой проблемой, как бы её решить?

Леон прислал мне такой ответ:
Цитировать
From the 'djvuchange.txt" document in djvulibre:

--------------

5- CGI STYLE OPTIONS IN MAPAREA AND OUTLINE LINKS

Outline and maparea annotation are

UTF-8 encoded strings that can be

interpreted as page specification (see section 3.1)

or as percent-encoded URLs (see section 1.3.)

In addition, strings starting with a question mark '?' are

interpreted as CGI style options separated by the

ampersand character '&'. These options are ignored

when the maparea link target is another window.

Otherwise these options are passed verbatim to the viewer.

This can cause portability problems because different djvu

viewers support different sets of CGI style options.

----------------

And I just checked that a link like

"?djvuopts&page=2&showposition=0,.46&zoom=300"

does exactly what it is supposed to do.

Why isn't this enough?
- L.

Такой ответ уже показался мне весьма интересным. То есть, Леон сказал, что у него подобный механизм работает - но только я вот не понял, как он этого добился? Я пробовал сделать такую гиперссылку в HTML-файле - она не заработала как нужно, то есть опции djvuopts были проигнорированы (в DjView 4). А как вставить такую гиперссылку в DjVu - я не понял. Попросил я Леона прислать мне образец DjVu-файла с внутренней гиперссылкой на произвольную позицию файла.

И сегодня Леон прислал мне такой DjVu-файл! :) Вот он:

http://www.djvu-soft.narod.ru/scan/offset_hyperlink.rar  (29 КБ)

Там на первой странице в левом верхнем углу над адресом вставлена такая гиперссылка. И действительно - при нажатии на неё происходит переход на произвольное место заданной страницы! :o Однако, работает всё это только в DjView 4 (и ещё, наверное, в броузерном DjVu-плагине - надо будет попробовать) - а в WinDjView - не работает, при нажатии на гиперссылку выдаётся ошибка "Невозможно открыть документ ...".

Вот как выглядит синтаксис этой гиперссылки в djvused:
(maparea "?djvuopts&page=2&showposition=0,.46&zoom=300" "test"
    (rect 116 2535 1159 571))

А вот - как в Document Express Editor 6:



Подробнее:



Получается, что теперь надо переделывать WinDjView - чтобы она тоже научилась работать с такими гиперссылками. А также можно уже переделывать DjVu Hyperlinks Editor - чтобы он научился создавать такие гиперссылки. Правда, это будет не слишком просто - ведь потребуется вычислять относительную позицию на листе позиции, на которую будет ссылаться гиперссылка. Впрочем, это дело техники. Кстати, теперь можно будет конвертировать PDF-гиперссылки в DjVu-гиперссылки без потерь! То есть, теперь не будет теряться страничное смещение цели гиперссылки.

8
Я сделал консольную утилиту, выполняющую ту же работу, что и DjVu Hyperlinks Editor. Назвал её "contentm".

Скачать утилиту:

contentm

http://www.djvu-soft.narod.ru/soft/contentm.rar  (118 КБ)  (Исходники внутри)

Эта утилита принимает на входе DjVuXML-файл, созданный из ОДНОЙ DjVu-страницы с книжным оглавлением, и автоматически создаёт в копии этого DjVuXML-файла гиперссылочное оглавление. Поддерживается также сдвиг нумерации, и опциональный разделяющий символ (между номером страницы и его бессмысленным числовым префиксом).

Причины создания этой утилиты:

1. Попалась мне книга, где номер страницы имеет вид "1-1" - где первая единица - номер тома, и только вторая - номер страницы. DjVu Hyperlinks Editor не справился с таким оглавлением. Автор DjVu Hyperlinks Editor не ответил на просьбу о помощи. Вот и пришлось сделать свою аналогичную утилиту.

2. Побочный эффект: моя утилита написана на чистом С++ STL с использованием кроссплатформенной XML-библиотеки pugixml, и может скомилироваться на любой платформе.

3. Открытые исходники.

4. В дальнейшем можно будет прикрутить к утилите визуальный интерфейс.

Использование:

Вот как выглядел бы bat-файл, использующую эту утилиту:
djvutoxml --page 5 --without-anno file.djvu input.xml
contentm input.xml output.xml -s - -p 1
djvuxmlparser -o file.djvu output.xml
pause

У нас есть DjVu-файл "file.djvu". На его 5-ой странице начинается книжное оглавление. Вытаскиваем OCR-слой с 5-ой страницы в файл input.xml (гиперссылки не извлекаем).

При помощи contentm добавляем в input.xml гиперссылки со сдвигом нумерации на 1 страницу и с разделяющим символом "-". Получаем output.xml.

Вставляем output.xml обратно в исходный DjVu-файл "file.djvu". Получаем на его 5-ой странице готовое гиперссылочное оглавление.

Ту же самую процедуру необходимо проделать для ВСЕХ страниц DjVu-файла, содержащих гиперссылочное оглавление.

DjVu Hyperlinks Editor полезная программа, но немного глючная, и не очень удобная. С английской локализацией там не всё гладко (автор сказал, что совсем не знает английский язык). Да и исходники зачем-то закрыты.

9
Я сделал консольную утилиту для облегчения создания DjVu-букмарков. Назвал её "bookm".

Скачать утилиту:

bookm

http://www.djvu-soft.narod.ru/soft/bookm.rar  (70 КБ)  (Исходники внутри)

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

В конце каждой строки должна стоять цифра, обозначающая номер строки, куда будет ссылаться этот пункт будущего оглавления. Вот пример такого файла:
Цитировать
Line1 1
   Line2 2
   Line3 3
   Line4 4
      Line5 5
      Line6 6
      Line7 7
Line8 8
Line9 9

Утилита bookm преобразует такой файл в формат букмарков, непосредственно понятный djvused. Т.е. можно вручную подготовить файл букмарков, и при помощи bookm создать букмарки в DjVu. Мне понравилось использовать для ручного создания табулированного файла текстовый редактор Notepad++ - потому что там можно оптом (выделив мышью) сдвигать несколько строк текста табом.

Теперь о том, зачем я это сделал (т.е. утилиту bookm):

Как известно, таких программ имеется уже несколько, которые умеют создавать DjVu-букмарки из ничего, причём многие такие программы - визуальные. Зачем же я тогда сделал ещё одну, да ещё консольную?

Причин тому несколько:

1. Мне не нравится привязка большинства похожих программ к .NET. Моя утилита написана просто на чистом С++ STL, и может скомилироваться на любой платформе.

2. Бывают изредка столь заковыристые оглавления, что ни одна из существующих программ не предусматривает работу с ними. Например, мне попалась книга, где номер страницы имеет вид "1-1" - где первая единица - номер тома, и только вторая - номер страницы. В этом случае проще поправить исходник и перекомпилировать утилиту заново, чем страдать от невозможности простой вставки букмарков.

3. Не все аналогичные утилиты имеют открытые исходники.

4. В дальнейшем можно будет прикрутить к bookm визуальный интерфейс.

Раньше я пользовался для вставки DjVu-букмарков китайской утилитой PdgCntEditor. Но в последний раз она что-то не поняла кодировки моего файла. Пришлось делать свою утилиту.

bookm ещё предусматривает опцию прибавления некоего заданного числа ко всем номерам страниц (считываемых из табулированного файла). Это удобно для DjVu-книг, имеющих обложку - там идёт сдвиг нумерации всего оглавления на 1.

11
Тема объединена с темой Программа DjVu Imager

Начало бывшей темы "РАБОТА С DjVu Imager" здесь:

http://www.djvu-scan.ru/forum/index.php?topic=14.msg760#msg760

12
Pdf / Конвертирование PDF -> TIF
« : 13 јРав 2011, 21:29:35 »
Я подготовил сравнительный пример декодирования PDF -> TIF:

http://www.djvu-soft.narod.ru/scan/pdf_dec.rar  (48 КБ)

Там внутри:

- Файл Original.pdf - исходный векторный PDF-файл (1-страничный)

и ещё несколько DjVu-файлов, созданных из TIF'ов, декодированных из Original.pdf разными программами, а именно:

- ABBYY FineReader 8.0 Pro (300 dpi)
- GhostScript 9.01 (600 dpi)
- mupdf-0.8  (600 dpi)
- PDF X-Change Viewer 2.0 b54 (600 dpi)
(хотел ещё СканКромсатором декодировать - но он не умеет декодировать чисто векторные PDF).

Вопрос в том, какой DjVu-файл получился лучше, и, следовательно, какой программой лучше всего декодировать из PDF в TIF?

Понятно, что предпочтение следует отдавать свободно-бесплатным программам.

На этом примере каждый желающий может сравнить качество декодирования PDF->TIF, которое предоставляет та или иная программа. Я внимательно сравнил эти результаты и расположил программы-декодировщики по качеству:

1 Место: ИМХО - это PDF X-Change Viewer. Он подобрал максимально близкий фонт (к исходному) при декодировании. А также он довольно быстро работает.

2 Место: ABBYY FineReader 8.0 Pro. Но с существенными оговорками. Во-первых, я не смог настроить программу так, чтобы она выдавала 600-dpi растровое изображение. Получилось только 300-dpi растровое изображение. Во-вторых, потерялась информация о цвете букв. Там в исходном PDF одна запятая - красного цвета - так вот, сразу после открытия этого PDF в программе эта запятая уже была чёрная (а должна была остаться красной). Сказывается всё же назначение программы - OCR, так что для OCR цвет текста вообще не важен - вот он и не сохраняется.

Зато начертание букв почти столь же хорошее получилось, что и у PDF X-Change Viewer. Хотя - на 300 dpi - что весьма плохо.

3 Место: GhostScript 9.01. Начертание фонта оказалось не слишком совпадающим с оригинальным. Местами это очень заметно. Но зато скорость декодирования - высокая.

4 Место: mupdf-0.8. Самый скромный результат. Начертание фонта - наиболее далёкое от оригинального (по сравнению с другими результатами). Скорость декодирования - дикие тормоза (может, потому что я декодировал в PPM?) В общем, совершенно недостойно внимания.

Выводы:

1. Самая рекомендуемая программа для декодирования PDF -> TIF (под Windows) (в настоящий момент) - это PDF X-Change Viewer.

2. При декодировании PDF в TIF следует всегда указывать 600 dpi (а не 300 dpi). Это резко улучшает качество получаемого растрового изображения. При этом количество пикселей по длине и по ширине удваивается (по сравнению с 300 dpi).

3. Возможно, найдётся некая программа, которая превзойдёт PDF X-Change Viewer по качеству декодирования PDF -> TIF. Но будет ли она при этом свободно-бесплатной? Если она будет пиратской - не слишком ли экзотической и малодоступной она окажется?

Я ещё не пробовал Adobe Acrobat Pro и Foxit-программы.

13
Pdf / MuPDF
« : 13 јРав 2011, 16:05:19 »
Замечена новая активность в проекте MuPDF.

Появился новый сайт - http://www.mupdf.com/ .

Вышли новые версии MuPDF. Последняя - MuPDF 0.8 (2011-03-03) - т.е. всего 10 дней назад.

Появилось новое лого MuPDF. В дистрибутиве под Windows появились готовые скомпилированные консольные утилиты. :o Наконец-то, догадались! :)

Наибольший интерес представляет ИМХО утилита pdfdraw (консольная). Её размер - 6,79 МБ, и она умеет конвертировать PDF в растровые форматы PPM, PGM, PAM и PNG. При этом pdfdraw умеет рендерить предварительно векторные PDF в растр, что немаловажно. Также pdfdraw способна извлекать текст из PDF в виде XML-файла, напоминающего hOCR (каждая буква имеет свои геометрические координаты). pdfdraw умеет декодировать даже JBIG2 и JPEG2000 PDF-файлы.

К сожалению, при пробном декодировании PDF -> PPM pdfdraw меня совершенно разочаровала. Всё дело в том, что pdfdraw поддерживает слишком мало векторных фонтов, заменяя всякие нестандартные фонты своими стандартными. От этого сильно страдает качество - искажается внешний вид текста. :( Это ИМХО полностью сводит на "нет" ценность pdfdraw. :(

Такая же проблема отмечена в последней версии Sumatra PDF (1.4), и также схожая проблема отмечена даже в Foxit Reader 2.2.2129 :o (хотя там она гораздо слабее выражена).

Для сравнения, программа PDF X-Change Viewer декодировала этот же PDF в TIF гораздо точнее - почти абсолютно верно.

В общем, простого и удобного open-source программного декодировщика PDF-> TIF (на Си или Си++) как не было, так и нет. Разве что попробовать GhostScript? :(

14
Флейм / Метод впечатывания OCR (идея)
« : 16 ДХТаРЫм 2011, 12:49:45 »
Исходя из недавних обсуждений на форуме, мне пришла на ум новая идея, связанная с OCR: впечатывать распознанные OCR-буквы (с их растеризацией) вместо имеющихся изображений букв на скане.

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

Я назвал этот подход условно "Метод впечатывания OCR".

Думаю, что такой функционал уместно было бы внедрить в FineReader (разработчкиам ABBYY). В настоящее время FineReader так не умеет. FineReader придерживается парадигмы максимальной векторизации растрового изображения, я же предлагаю частичную - только в отношении букв.

Сейчас FineReader пытается распознать макет страницы - колонки, абзацы, межстрочные интервалы, таблицы и их структуры - немилосердно косяча при этом. Собственно говоря, это уже даже не OCR в чистом виде - а распознавание макета страницы.

Конечно, FineReader вынужден так поступать - если не делать распознавание макета страницы, а делать только предлагаемое мною впечатывание OCR - то результирующий вордовский doc-файл будет и огромных размеров, и на печати будет выглядеть не лучшим образом.

Но FineReader не учитывает существование формата DjVu - для которого применение впечатывания OCR было бы как раз весьма разумным и приемлемым. Это, с одной стороны, позволило бы заменить некачественные изображения букв на поганых сканах на высококачественные OCR-буквы, а с другой стороны, сократило бы время обработки за счёт исключения необходимости править косячное распознавание макета страницы в FineReader.

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

Предлагаемый метод впечатывания OCR мог бы стать своего рода "русским ответом ClearScan'у". Конечно, метод впечатывания OCR предполагает ручной труд (ручная проверка OCR) - в отличие от чисто автоматического ClearScan, но зато метод даёт минимум ручного труда - при использовании всех преимущеcтв OCR.

Метод впечатывания OCR мог бы стать хорошим способом реставрации некачественных DjVu-книг. Ведь, как известно, самое главное в DjVu-книге - это качество читабельности букв (а не красота картинок и макета страницы).

Страницы: [1] 2 3 ... 5