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


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

Введение

Метод выборочной раскраски маски - это новая уникальная технология по обработке 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