The website "djvu-soft.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Метод выборочной раскраски маски

Вернуться к разделу "Материалы по сканированию и оцифровке бумажных книг".


Метод выборочной раскраски маски

Введение

Метод выборочной раскраски маски - это новая уникальная технология по обработке DjVu-файлов.

Авторы метода - Алексей Крюков и monday2000. Идея метода - monday2000.

Метод выборочной раскраски маски появился на свет как дальнейшее развитие метода раскраски маски.

Метод раскраски маски подарил нам принципиальную, никогда ранее не существовавшую, возможность раскраски маски DjVu-файла одним (любым) цветом - красным, синим, зелёным и т.д.

Особенность этой опции состоит в том, что при этом окрашивается весь текст (на странице DjVu-файла).

Вот как это примерно выглядит:

col_pic.GIF (99912 bytes)

Этот образец Вы можете посмотреть в прилагаемом файле:


Скачать
пример результата работы метода раскраски маски (897 КБ)

Однако возникает вопрос - для чего это может быть практически нужно? Т.е. кому и зачем может потребоваться окрашивать текст на DjVu-странице - и именно весь целиком?

Исходя из реальной практики DjVu-книгосканирования, можно предположить следующее: практически никому и никогда. Разве что для текста обложки книги (и то в редчайших случаях). Или же (неизвестно для чего практически) можно инвертировать цвета DjVu-страницы (что предлагает делать опция DjVu Sepia в программе JRA Publish 3.0).

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

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

Но можно ли раскрашивать элементы маски выборочно? И что они из себя представляют - эти элементы маски? Насколько они велики и сколько их на DjVu-странице? Вдруг их мало, или они большие по размеру - тогда ведь желаемая точность окрашивания будет невысока?

Для того, чтобы ответить на эти вопросы, мне пришлось более внимательно проанализировать программный код в djvumake, отвечающий за раскраску маски. Эту работу в djvumake (в методе раскраски маски) выполняет функция create_fgbz_chunk(). По моей просьбе Алексей Крюков прислал мне комментарии к этой функции:

// Создаем палитру
GP<DjVuPalette> pal = DjVuPalette::create();

// Создаем поток, из которого будут считываться данные о цветах.
// В данном случае у нас единственный цвет, хранящийся в массиве
// из трёх байтов. Если нужно больше цветов, то понадобилось
// бы сначала записать их спецификации в массив размером n*3.

GP<ByteStream> gzbs = ByteStream::create_static(stencil_color,3);
ByteStream &bs=*gzbs;

// Переносим данные о цветах в палитру. Второй аргумент -- количество
// цветов, хранящихся в массиве.

pal->decode_rgb_entries(bs, 1);

// Резервируем место под данные о цвете каждого объекта (блита)
pal->colordata.resize(0,blit_count-1);

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

for (int d=0; d<blit_count; d++)
     pal->colordata[d] = 0;

// Сбрасываем готовую палитру в файл.
iff.put_chunk("FGbz");
pal->encode(iff.get_bytestream());
iff.close_chunk();


--
Regards,
Alexey Kryukov <anagnost at yandex dot ru>

Moscow State University
Historical Faculty

Из этого кода хорошо видно, как работает раскраска маски (т.е. всей целиком): генерируется чанк-расцветка (чанк FGbz) для всей маски DjVu-файла. Для этого из слоя маски (чанк Sjbz) считывается информация о т.н. "блитах" (в этом коде не показано) и на её основании создаётся "с нуля" раскрашивающий блок-палетка FGbz.

Блит - это указатель на т.н. "шейп" (shape - англ.). Шейп - это мельчайший связный объект маски, подлежащий расцветке, т. е. отдельный знак (буква) или его часть. Блиты и шейпы DjVu-страницы организованы в массивы. При этом одни и те же шейпы могут быть разделены между несколькими DjVu-страницами (порождая словарь разделённых символов). Более подробно об этом можно почитать в файле JB2Image.h (в исходниках DjVuLibre).

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

Но насколько велики размеры блитов (и, как следствие, возможная точность их раскраски)?


Визуализирующая djvumake

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

Вот как это примерно выглядит:

Этот образец Вы можете посмотреть в прилагаемом файле:


Скачать
пример результата визуализации маски (30 КБ)

Каждый шейп на этом рисунке окрашен в собственный цвет - отличающийся от цвета окраски соседних шейпов.

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

Теперь о том, как узнать, сколько шейпов имеется на данной DjVu-странице. Их общее количество можно увидеть в "Информация о странице" в WinDjView. В случае "раскрашенной" DjVu-страницы там есть запись вида:


0,0 Kb    'FGbz'    JB2 foreground colors (1 color, 3359 ccs).

 

Общее количество блитов страницы в такой записи выводится перед словом "ccs". В данном случае на этой DjVu-странице у нас имеется 3359 блитов.

Скачать визуализирующую djvumake можно здесь:


Скачать
модифицированную версию djvumake (визуализирующую) (вместе с исходником) (146 КБ)

Для того, чтобы самостоятельно воспользоваться этой утилитой, проще всего вставить её в DjVu Imager - на замену имеющейся там djvumake. И тогда на всех страницах, куда Вы будете вставлять картинки, шейпы будут "визуализироваться".

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


Выборочная раскраска

Остаётся вопрос - если мы хотим выборочно окрашивать блиты DjVu-страницы какими-то участками в разные цвета - то как мы будем задавать желаемые области раскраски?

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

Именно этот подход и вылился в итоге в новый метод - метод выборочной раскраски маски.

Выборочность метода состоит в возможности задать на входе djvumake неограниченное количество "зон раскраски". При этом каждая такая зона характеризуется такими параметрами, как цвет и 4 координаты (относительно верхнего левого угла DjVu-страницы

Эту работу выполняет модифицированная утилита djvumake. Я модифицировал параметр FGcolor следующим образом:


FGbz=#color1:x,y,w,h#color2:x,y,w,h#color3:x,y,w,h

или

FGbz=#color1:x,y,w,h#color2#color3:x,y,w,h (зоны могут покрывать всю страницу)

 

Параметры x,y,w,h - это координаты текущей зоны на странице. x,y - координаты верхего левого угла зоны, w,h - ширина и высота зоны.

Для примера из статьи о методе подклейки фона параметры командной строки djvumake будут выглядеть так:


djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#red:185,903,1097,525#green:928,1582,1046,329#blue:464,2186,1332,468 BG44=BG44.cnk

 

Вот как это примерно выглядит:

sel_pic.GIF (55124 bytes)

Этот образец Вы можете посмотреть в прилагаемом файле:


Скачать
пример результата работы метода выборочной раскраски маски (22 КБ)

Положение и цвет любой из зон окрашенного текста можно задавать произвольно. Один и тот же кусок текста можно окрашивать по нескольку раз - т.е. разными зонами (зоны считываются слева направо из командной строки и в таком же порядке и применяются к DjVu-странице). Количество зон - неограниченно.

ВАЖНО: К сожалению, пока что точность действия зон раскраски недостаточна - плюс-минус строка/ряд блитов (по периметру зоны). Дело в том, что каждый шейп имеет не только координаты - но также ещё и размеры. Размеры шейпов пока никак не учитываются (это нужно будет ещё реализовать в будущем - тогда точность действия зон будет идеальной). Пока же старайтесь выделять окрашиваемые блиты в зоны "с запасом" (т.е. чтобы эти блиты точно попали в зону).

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


Скачать
модифицированную версию djvumake (выборочная раскраска) (вместе с исходником) (146 КБ)


Связка со СканКромсатором

Для визуальной расстановки зон можно использовать, например, СканКромсатор. Для этого нужно декодировать раскрашиваемую  чёрно-белую DjVu-страницу в формат TIF (BMP), загрузить полученный файл в СканКромсатор, расставить и применить Picture-зоны, экспортировать их координаты, назначить им цвета, слегка переформатировать их синтакс - и подать на вход новой djvumake.

Конкретно алгоритм выглядит так:

1. Загрузить раскрашиваемую страницу в СканКромсатор.

2. Нажать кнопку Clear all options and mark all files.

3. Установить Picture-зону (можно несколько на одной странице).

4. Нажать кнопку Process!

5. Выбрать в меню: Zones -> Picture zone -> Export zones location...

6. В  папке out появится файл zones.txt с примерно таким синтаксисом:


File = C:\out\0001.tif
Id = 1, (274,1036,1498,1644); pic.0001.tif

 

Координаты зоны раскраски (под новый djvumake) для этого примера можно вычислить так:

x = 274

y = 1036

w = 1498 - 274 = 1224

h = 1644 - 1036 = 608

В результате командная строка для djvumake будет выглядеть примерно так:


djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#red:274,1036,1224,608 BG44=BG44.cnk

 

Результат раскраски будет идентичен характеру расстановки Picture-зон в СканКромсаторе.


Выводы

Метод выборочной раскраски маски - это совершенно новая и полностью уникальная технология. Она (на данный момент) не реализована ни в одной другой существующей DjVu-программе.

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

Сейчас чёрно-белые книги со вставками цветного текста приходится обрабатывать довольно сложным образом: на этапе сканобработки в СканКромсаторе выделяются блоки цветного текста - в специальные Picture-зоны, затем специальным (и довольно неудобным) образом их обрабатывают (раскрашивают), и т.д. Всё это порождает дополнительные проблемы и неудобства.

Метод же выборочной раскраски маски позволит перенести процедуру раскраски цветного текста с этапа сканобработки на этап постобработки уже готового DjVu-файла.

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

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

Возможности метода выборочной раскраски маски уже превосходят возможности опции DjVu Sepia в программе JRA Publish 3.0 (которая эквивалентна лишь простому методу раскраски маски).

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


P.S.

Леон Боту переработал мою реализацию метода выборочной раскраски маски в соответствии со своими предпочтениями и выложил новый исходник в CVS DjVuLibre.

Леон добавил туда учёт размеров (длины и ширины) каждого шейпа (что я и предлагал). Точнее, учёт габаритов каждого шейпа (габариты шейпа - это длина и ширина прямоугольника, описанного вокруг шейпа).

По идее, теперь точность действия зон должна возрасти (это нужно ещё тестировать).

ВАЖНО: Леон выбрал стратегию "раскрашивать те блиты, габариты шейпа которых КАСАЮТСЯ зоны раскраски". Альтернативная стратегия - "раскрашивать те блиты, габариты шейпа которых ПОЛНОСТЬЮ ПОПАДАЮТ в зону раскраски" была отвергнута Леоном по какой-то причине.

Также слегка поменялся синтаксис связки со СканКромсатором. Теперь это выглядит так:

Для следующего файла zones.txt:


File = C:\out\0001.tif
Id = 1, (274,1036,1498,1644); pic.0001.tif

 

Координаты зоны раскраски (под новый djvumake от Леона Боту) можно вычислить так:

x = 274

y = page_height - 1644 (где page_height - высота страниц в пикселях). Допустим, page_height = 3507. Тогда y = 3507 - 1644 = 1863.

w = 1498 - 274 = 1224

h = 1644 - 1036 = 608

В результате командная строка для djvumake будет выглядеть примерно так:


djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#red:274,1863,1224,608 BG44=BG44.cnk

 

Результат раскраски будет идентичен характеру расстановки Picture-зон в СканКромсаторе.

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


Скачать
модифицированную Леоном Боту версию djvumake (выборочная раскраска) (вместе с исходником) (152 КБ)


P.S.-2

Я модифицировал последнюю доступную в CVS DjVuLibre утилиту djvumake с целью придать ей свойство частичного сохранения старой раскраски (если таковая имеется).

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

Моя модификация (я назвал её djvumakem) сохраняет старую раскраску (старый FGbz-чанк) и просто рисует поверх неё новую раскраску (создавая таким образом новый FGbz-чанк с учётом данных старого FGbz-чанка).

Это необходимо для корректировки раскраски чужих DjVu-файлов, скаченных из Интернета, а также для "итеративной" раскраски своих DjVu-файлов ("подкрасил - посмотрел, что получилось", "подкрасил - посмотрел, что получилось", и т.д.).

В отличие от djvumake, djvumakem имеет дополнительную опцию FGbz_old. При этом, если эта дополнительная опция указывается, то она обязательно должна предшествовать в командной строке опции FGbz. В FGbz_old указывается путь к старому чанку FGbz.

Командная строка для djvumakem может выглядеть примерно так:


djvumakem 1.djvu INFO=,,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz_old=FGbz.cnk FGbz=#0000ff:384,4470,1501,1185#ff0000:1141,3242,2220,763 BG44=BG44.cnk

 

Скачать исходник утилиты djvumakem (скомпилированный в готовую к работе программу) можно здесь:


Скачать
djvumakem (вместе с исходником) (151 КБ)

К сожалению, Леон Боту посчитал, что подобную модификацию djvumake не следует вносить в состав DjVuLibre, поэтому мне и пришлось давать ей специальное название ("djvumakem").

Единственное улучшение, которое Леон согласился принять в состав DjVuLibre - это автоматическая генерация (в случае необходимости) пустого (белого) заднего фона - если не указан чанк BG44 (в командной строке); а также Леон аналогично добавил ещё и автоматическую генерацию минимальной расцветки (чёрная) - если не указан чанк FGbz. Леон уже внёс это улучшение в CVS DjVuLibre.


Автор: monday2000.

6 августа 2009 г.

E-Mail  (monday2000 [at] yandex.ru)

Hosted by uCoz